2

我是 Java Swing 的新手,我有一个奇怪的问题要刷新我的JPanel.

JPanel我在我的框架中创建了一个静态组件,并从 a 调用一个静态方法FileListenner来重新绘制我的JPanel

 public static void repaintPlan(JPanel f) {
    f.paint(f.getGraphics()); 
    f.revalidate(); // or validate
}

我的意思是,当我检测到文件内容的变化时,我计算新坐标并重新绘制(我从paintComponent()` 方法JPanel创建了一个类扩展)JPanel to define

当我运行应用程序时一切正常,当文件中的数据发生变化时重绘工作;但如果我在 中用鼠标单击Jpanel,则该repaint()方法不再起作用。你能告诉我为什么点击后JPanel,重绘不起作用吗?

对不起我的英语不好提前谢谢:)

编辑:感谢您的回复!但即使我使用repaint()方法,也是同样的问题。我试图了解单击时会发生什么JPanel。我应该在 Swing 中使用鼠标事件来解决问题吗?

4

4 回答 4

7

1) 对于 SwingJComponents是否有方法paintComponent(),方法paint()适用于顶级容器 ( JFrame, JDialog ...) 和AWT Components

2)不要使用getGraphics()此方法创建调用后validate过期的revalidate快照repaint

3) 你看过关于2D Graphics的教程,这里有例子

4) 如果您有真正的问题,请使用SSCCE编辑您的问题

于 2012-04-28T13:20:54.103 回答
4

我试图了解单击时会发生什么JPanel。我应该在 Swing 中使用鼠标事件来解决问题吗?

您可能会从这个响应鼠标按下事件的示例中获得一些见解。在这种情况下,paintComponent()当颜色更新时会自动调用。另请参阅AWT 和 Swing 中的绘画

于 2012-04-28T14:09:38.300 回答
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 是否被调用一次或多次都无关紧要,因为您的程序逻辑不应依赖于是否调用此方法。

于 2012-04-28T21:25:57.797 回答
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

        }
    });

谢谢

于 2012-04-28T18:14:50.760 回答