- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
窗口出现并按预期工作,但出于某种原因它仍然给我一个 NullPointerException。事实上两个。这是代码:
public class SwagFrame extends JFrame {
public SwagFrame() {super("Swag");}
public void paint(Graphics g) {
Image bg = null;
try {
bg = ImageIO.read(new File("swag.png"));
} catch (IOException e) {
System.out.println("Swag not turned on");
System.exit(-1);
}
g.drawImage(bg, 0, 0, null); // exception here
g.setColor(Color.GREEN);
g.fillOval(250, 250, 100, 100);
}
public static void main(String[] args) {
SwagFrame frame = new SwagFrame();
frame.setVisible(true);
frame.setSize(525, 525);
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.paint(null); // exception here
}
}
如果 paint()
在其参数中需要一个对象,为什么它仍然可以工作但在事后抛出异常?
最佳答案
我做了两件事。我将 SwagFrame 设为 JPanel 而不是 JFrame,因此我可以使用 paintComponent
方法,我删除了 frame.paint(null)
并更改了 null
在 drawImage
到 this
。该代码现在可以正常工作。
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class SwagFrame extends JPanel {
public SwagFrame() {
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
BufferedImage bg = null;
try {
bg = ImageIO.read(new File("icons/stacko/stackoverflow1.png"));
} catch (IOException e) {
System.out.println("Swag not turned on");
//System.exit(-1);
}
g.drawImage(bg, 0, 0, this); // exception here
g.setColor(Color.GREEN);
g.fillOval(250, 250, 100, 100);
}
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.add(new SwagFrame());
frame.setSize(525, 525);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
//frame.paint(g); // exception here
}
}
此外,如果你想设置图像的大小,你可以将它作为参数传递给 .drawImage() 方法
g.drawImage(bg, 0, 0, width, height, this);
还有一件事,确保图像位于正确的文件位置。
正如@MadProgrammer 在他的评论中所说:
" Generally, top level containers aren't double buffered, where as Swing components (extending from JComponent) are. Top level containers have a number of layers placed ontop of them (layered pane, content pane and glass pane), making it very complex surface to safely paint to. Also, generally, when a child component is painted, the parent container doesn't need to be this can lead to dirty paints occurring. Also, generally, extending from JFrame is discouraged as you are never actually adding any additional functionality to it
The reason the OPs code didn't work (as you seem to have duduced) was they were passing a null value to the paint method, when means when they tried to access "g", it threw a NPE, however, the the Repaint Manager schedule it's paint request, the paint method was passed a valid Graphics refernce, meaning it was able to work properly...also, the OP isn't call super.paint, bad on them" - @MadProgrammer
关于java - 在 JFrame 上绘画有效,但无论如何它都会抛出 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20390218/
你好,我试图在java中创建一个网格并绘制每个单元格,但我不知道我做错了什么。每个单元格都是一个 JPanel,我将每个单元格添加到 mazePanel。之后 mazePanel 添加到框架中。但只能
我正在开发一个应用程序(适用于 iOS 和 Android),其中我需要允许用户从图库中选择照片并通过在图像上绘图来圈出某些项目。一旦用户完成绘制,系统就会提示他在弹出窗口中为该项目命名。命名项目后,
当我使用绘画/绘图应用程序时,我从未注意到在按下手指和能够看到显示屏上绘制的内容之间存在延迟。但是,对于我的应用程序,接收到的初始触摸非常缓慢。第二个、第三个和第四个手势每秒接收 60 个,但第一个手
到目前为止,在我的尝试中,我能够在普通图像上画线,比如创建我自己的 CGRect 大小的普通上下文并在其上画线。我看到的所有教程都是如何在创建的 x*y 大小的图像上下文上绘制。但是我想在已经存在的图
我在 android 中开发,我必须为 android 做一个 Paint。 我正在使用下面的代码,当我执行代码时,绘制工作正常,但是,似乎有 2 个表面要绘制,当你绘制一个时,另一个消失了。 我一直
我使用QGraphicsView、QGraphicsScene 和QGraphicsItem 来绘制一些图表。我已经实现了用于绘制文本(图表的值)的 QGraphicsItem::paint 函数,但
Canvas { id: canvas onPaint: { if (personalInfo.count === 0) { return
好的,这就是问题所在:在 C# 表单中,我创建了一个新的私有(private) void: private void NewBtn(string Name, int x, int y) 它的目的是创建
任何人都可以详细建议我如何使用 QDirectPainter 类直接在帧缓冲区上绘制小部件。如果您能提供一个工作示例,我会更有帮助。 最佳答案 QDirectPainter 不会也不能绘制任何东西。它
我正在使用 cardLayout 更改“ View ”(此类有一个 JFrame 变量)。当用户点击新游戏按钮时,会发生这种情况: public class Views extends JFrame
目标: 我想在 pdf 位图上绘制/书写/绘画并将它们保存在一起,以便我可以通过电子邮件发送给他们。 详细信息: 我有多个 Pdf包含 5-20 的文件每个页面,现在我正在从 pdfs 中提取位图并将
我最近开始学习Qt。 我不太清楚如何使用 QPainter 类进行绘画。假设我只想在窗口中放置几个点: class PointDrawer: public QWidget { Q_OBJE
我必须为我的 CS 类(class)期末项目创建一个带有 GUI 的 connect 5 游戏。我在最后一个项目中使用 Graphics2D - 迷宫 - 使用 Graphics2D 是一场噩梦。 c
我已经删除了 CS_HREDRAW、CS_VREDRAW。 消息 WM_PAINT 和 WM_ERASEBKGND 什么都不做,但是一旦窗口重新调整大小,它就会用背景颜色重新绘制它。有什么办法可以完全
首先大家好! 我遇到了一个大问题:我需要构建一个程序,该程序包括构建一个包含 5 个方 block 和一个按钮的 java swing 界面。按钮功能是在方 block 内画一个圆。我有这段代码,但我
我正在尝试从显示幻灯片的 Qt fluidLauncher 演示中运行稍微修改过的代码。代码贴在下面。当处理 paintEvent 时,屏幕上会显示一个黑色矩形,因为导入的图像大小为 0。 单步执行Q
我有以下代码来激活/停用橡皮擦: public PorterDuffXfermode clear = new PorterDuffXfermode(PorterDuff.Mode.CLEAR);
我正在绘制一个未被清除的 Canvas ,并使 Canvas 随着时间的推移逐渐变成纯色,或者在 alpha 中逐渐消失以显示后面的图层。 我的第一直觉是简单地用每帧的低 alpha 在绘图上填充一个
我正在尝试在每幅画上检测并绘制一个矩形轮廓,例如这张图片: 我遵循了一些指南并执行了以下操作: 灰度转换 应用中值模糊 锐化图像 应用自适应阈值 应用形态梯度 寻找轮廓 绘制轮廓 得到如下结果: 我知
创建 JFrame、在其上添加 JPanel 并在 JPanel 上绘制矩形的类 class Frame { JFrame frame; myPanel panel; void draw() {
我是一名优秀的程序员,十分优秀!