按钮点击后重新绘制JPanel

时间:2012-04-28 13:14:43

标签: java swing jpanel repaint

我是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中使用鼠标事件来解决问题吗?

4 个答案:

答案 0 :(得分:7)

1)对于Swing JComponents有方法paintComponent(),方法paint()用于顶级容器(JFrame,JDialog ...)和{{1 }}

2)在调用AWT ComponentsgetGraphics()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

        }
    });

感谢