新细节:
从我的主类的actionPerformed事件中调用时,我的JPanel对象的重绘方法不起作用。它可以在主类ImageViewer的ImageViewer方法中工作,但不能在此类的actionPerformed方法中工作。
这些是我的代码中不能正常工作的重要部分(重新绘制部分):
主要类别:
/**
* @(#)NeatImageViewer.java
*
* NeatImageViewer application
*
* @author
* @version 1.00 2010/11/1
*/
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
import javax.swing.*;
public class NeatImageViewer extends JFrame implements ActionListener {
GraphicsPanel gp;
NeatImageViewer() {
//... window components ...
}
public static void main(String[] args) {
NeatImageViewer niv = new NeatImageViewer();
niv.setSize(500,500);
niv.setLocationRelativeTo(niv);
niv.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
//...
gp = new GraphicsPanel();
gp.img = img;
gp.repaint(); //<!--- Not Working!
this.add(gp);
//...
}
}
GraphicsPanel类:
/**
* @(#)GraphicsPanel.java
*
*
* @author
* @version 1.00 2010/11/1
*/
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
import javax.swing.*;
public class GraphicsPanel extends JPanel {
BufferedImage img;
GraphicsPanel() {
super();
}
protected void paintComponent(Graphics g) {
//paint method isn't executed???
super.paintComponent(g);
System.out.println("Paint!");
}
}
答案 0 :(得分:1)
您必须覆盖paintComponent(Graphics g)
而不是paint(Graphics g)
因此,您发布的方法应重命名为paintComponent
。
编辑:初始化完成后,您是否pack()
编了框架?
编辑:当组件不可见时,repaint()
方法不执行任何操作。因此,您必须先将其添加到JFrame,pack()
框架。打包后,不再需要重新粉刷。
答案 1 :(得分:0)
在Swing中你不使用Canvas。您可以在JPanel或JComponent上进行自定义绘制,并且如前所述覆盖paintComponent(...)方法。阅读Custom Painting上的Swing教程,了解更多信息和工作示例。
此外,使用Swing,无需创建自定义组件来显示图像。您只需将JLabel与ImageIcon一起使用即可。阅读“如何使用图标”部分。
为所有Swing基础知识添加教程。
编辑:
将组件添加到可见GUI时,基本代码应为:
panel.add( ... );
panel.revalidate();
panel.repaint();
答案 2 :(得分:0)
(我是Skyfe但是来自另一个IP所以没有“登录”并且无法发表评论)
我很抱歉,但我没有得到什么问题???
我提供了我的代码,并且在从actionPerformed方法调用repaint时它没有执行paintComponent函数。只需复制粘贴我的代码并使用java编译器进行编译,并且在执行我可以告诉的操作时它不会执行paintComponent方法,因为我在paint方法中使用了System.out.println()方法。并且它不会绘制任何东西,因为我只是想检查它是否调用paint方法AT ALL,因为我在paintComponent方法中放置了一个系统输出,在使用重绘时没有执行。这只是一个测试而且没有用。
那你的意思是SSCCE在哪里,这就是我所拥有的所有代码。我编译了我在主帖中发布的代码,问题是它在执行操作时没有显示任何系统输出(并且调用了重绘事件)。我没看到帖子里有什么遗漏?