我是Java Swing的新手,我有一个奇怪的问题需要刷新JPanel
。
我在框架中创建一个静态JPanel
组件,我从FileListenner
调用一个静态方法重新绘制我的JPanel
public static void repaintPlan(JPanel f) {
f.paint(f.getGraphics());
f.revalidate(); // or validate
}
我的意思是,当我检测到文件内容的变化时,我会计算新的坐标并重新绘制JPanel
(我创建一个类来自JPanel to define
paintComponent()`方法)
当我运行应用程序时,一切正常,并且当文件中的更改数据时重绘工作;但如果我用Jpanel
中的鼠标单击,则repaint()
方法不再有效。您能否在点击JPanel
后告诉我为什么重新绘制不起作用?
抱歉我的英语不好 在此先感谢:)
编辑:感谢您的回复!但即使我使用repaint()
方法,也是同样的问题。我试图了解点击JPanel
时会发生什么。我应该在Swing中使用鼠标事件来解决问题吗?
答案 0 :(得分:7)
1)对于Swing JComponents
有方法paintComponent()
,方法paint()
用于顶级容器(JFrame
,JDialog ...)和{{1 }}
2)在调用AWT Components
,getGraphics()
,validate
已过期
revalidate
此方法创建的快照
3)您已查看有关2D Graphics的教程,示例here
4)如果您有真正的问题,请使用SSCCE
修改您的问题答案 1 :(得分:4)
我正在尝试了解点击
JPanel
时会发生什么。我应该在Swing中使用鼠标事件来解决问题吗?
您可能会从这个响应鼠标按下事件的example获得一些见解。在这种情况下,更新颜色时会自动调用paintComponent()
。另请参阅Painting in AWT and Swing。
答案 2 :(得分:3)
不,鼠标按下后不会调用paintComponent,除非你有一些代码可以执行此操作。例如:
import java.awt.*;
import javax.swing.*;
public class MyPanel extends JPanel {
private static final int PREF_W = 400;
private static final int PREF_H = 400;
public MyPanel() {
setBorder(BorderFactory.createTitledBorder("My Panel"));
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
System.out.println("myPanel's paintComponent method has been called");
}
@Override
public Dimension getPreferredSize() {
return new Dimension(PREF_W, PREF_H);
}
private static void createAndShowGui() {
MyPanel mainPanel = new MyPanel();
JFrame frame = new JFrame("MyPanel");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
正如您可以清楚地看到的,在普通的JPanel中,除非您更改GUI的大小,否则不会在任何鼠标操作后调用paintComponent。
您的GUI还有其他问题,而且,如果paintComponent被调用一次或多次也不重要,因为您的程序逻辑不应该依赖于是否调用此方法。
答案 3 :(得分:0)
我通过覆盖我的JPanel的鼠标事件方法来解决我的问题,就像这样
myJPanel.addMouseListener(new MouseListener() {
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
}
});
感谢