Java 扩展画布时绘制方法出错';s级
谁能帮帮我吗?我已经做到了 线程“AWT-EventQueue-0”java.lang.NullPointerException中出现异常 at Frame.Painter.paint(Main.java:399)at paintComponent(repaintrea.java:264)位于 paint(RepaintArea.java:240)位于 sun.awt.windows.WComponentPeer.handleEvent(WComponentPeer.java:358)位于 dispatchEventImpl(Component.java:4965)位于 dispatchEvent(Component.java:4711)位于 dispatchEventImpl(EventQueue.java:758)位于 访问$500(EventQueue.java:97) java.awt.EventQueue$3.run(EventQueue.java:709)在 java.awt.EventQueue$3.run(EventQueue.java:703)在 java.security.AccessController.doPrivileged(本机方法)位于 ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76) 在 ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86) 在java.awt.EventQueue$4.run(EventQueue.java:731)处 java.awt.EventQueue$4.run(EventQueue.java:729)在 java.security.AccessController.doPrivileged(本机方法)位于 ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76) 位于java.awt.EventQueue.dispatchEvent(EventQueue.java:728) java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) 在 java.awt.EventDispatchThread.PumpeEventsforFilter(EventDispatchThread.java:116) 在 java.awt.EventDispatchThread.PumpeEventsforHierarchy(EventDispatchThread.java:105) 在 java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) 在 EventDispatchThread.pumpEvents(EventDispatchThread.java:93) 在java.awt.EventDispatchThread.run(EventDispatchThread.java:82) 第399行的代码为:Java 扩展画布时绘制方法出错';s级,java,swing,canvas,nullpointerexception,desktop,Java,Swing,Canvas,Nullpointerexception,Desktop,谁能帮帮我吗?我已经做到了 线程“AWT-EventQueue-0”java.lang.NullPointerException中出现异常 at Frame.Painter.paint(Main.java:399)at paintComponent(repaintrea.java:264)位于 paint(RepaintArea.java:240)位于 sun.awt.windows.WComponentPeer.handleEvent(WComponentPeer.java:358)位于 di
class Painter extends Canvas{
Image image;
private URL url;
public void setImage(String file) {
url = null;
try {
url = new File(file).toURI().toURL();
} catch (MalformedURLException ex) {
System.out.println(ex.toString());
}
image = getToolkit().getImage(url);
repaint();
}
public void paint(Graphics g) {
double d = image.getHeight(this) / this.getHeight();
double w = image.getWidth(this) / d;
double x = this.getWidth() / 2 - w / 2;
g.drawImage(image, (int) x, 0, (int) (w), this.getHeight(), this);
}
}
我不知道那里到底发生了什么事。我的程序运行正常,但每次运行时都会因为这个错误而感到不安。请告诉我该怎么做。我假设您有以下代码:
class Painter extends Canvas{
Image image;
private URL url;
public void setImage(String file) {
image = Toolkit.getDefaultToolkit().getImage(file);
repaint();
}
public void paint(Graphics g) {
if(image!=null) {
double d = image.getHeight(this) / this.getHeight();
double w = image.getWidth(this) / d;
double x = this.getWidth() / 2 - w / 2;
g.drawImage(image, (int) x, 0, (int) (w), this.getHeight(), this);
}
}
}
然后只需调用setImage(“c:/yourfilepath/yourfilename”)1)请参见&2)使用逻辑一致的代码行和代码块缩进形式。缩进的目的是使代码流更易于遵循。。。。3) 应用程序资源在部署时将成为嵌入式资源,因此现在就开始访问它们是明智的。必须通过URL而不是文件访问。有关如何形成URL的信息,请参见。4) 为了更快地获得更好的帮助,请发布or。继续@AndrewThompson的列表:5)不要重写
paint()
方法,而是使用paintComponent()
,不要忘记调用super.paintComponent()
作为其中的第一条语句,并使用@override
注释。6) 不要将Canvas
等AWT组件与Swing组件混合使用,请改用JPanel
。7) 你的NPE很可能是因为找不到图像,按照上面提供的嵌入式资源链接,试着打印它的值,或者用断点调试你的代码,看看它是否为空。除了GUI,你在其他任何地方都找不到这种人——这是一种特殊的nutso“然后你只需要调用setImage(”c:/yourfilepath/yourfilename”)“除了缺少对URL的转换之外,这实际上并没有给解决方案增加任何内容。如果路径在问题中显示的代码中是正确的,那么它就可以工作了。这也无法修复@Frakcool建议第5点中提到的破损油漆链。总而言之,这只不过是噪音,并没有比在评论中表达的更好。“除了没有转换成URL”:除非你继续堆积你自己的crap@AndrewThompson除非在setImage
@MadProgrammer.Good.之前调用了paint
。简而言之,我们不能确定。@AndrewThompson同意,这都是“猜测”的工作;)