2

我正在尝试根据paint()orpaintComponent()方法中的一些计算来绘制和绘制一些几何形状。但是,我意识到paint()or里面的打印和其他计算语句paintComponent()被执行了 2 次或有时 3 次。例如,以下代码中的打印语句执行了两次,并且在控制台中打印了两次“帮助”一词:

public class Skeleton extends JPanel {
public void paint(Graphics g){
     Graphics2D g2d = (Graphics2D) g;
     g2d.drawOval(50, 50, 100, 100);
     System.out.println("help");
}

然后在控制台中打印的部分是这样的:

help
help

这是我的main()方法

public static void main(String[] args) {

    JFrame frame = new JFrame("Java 2D Skeleton");
    frame.add(new Skeleton());
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(870, 890);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
}

更糟糕的是,如果我有一个类公共变量并且我在paint()方法中将其值增加 1。这导致值增加了 2。我在这个网站的某个地方读到了该方法paint()自动调用其他三种方法,我认为它们导致了这个问题。此外,我在另一个网站上尝试了一些建议的解决方案来覆盖 methodpaintComponent()而不是 method paint()。但是我仍然有同样的问题。请帮我修复它。

4

2 回答 2

2

你是正确的覆盖paintComponent 而不是paint。我认为这里的问题是paintComponent 应该做一件事,绘制你的组件。任何数量的事情都可能导致调用 repaint() 将调用您的paintComponent,因此不能真正保证该方法何时以及多久执行一次。进行计算和跟踪变量可能应该是一个单独的模型类的一部分,您的组件可以查看它以了解要绘制的内容。

于 2013-06-03T22:31:38.297 回答
1

这个问题可能已经被遗忘了,但我偶然发现了它,并想帮助其他也这样做的人。我找到的解决方案是使用 JApplet 的 init() 方法。在那里你可以做你需要的所有计算。然后,如果您愿意,您还可以创建一个计时器,该计时器以指定的时间间隔响应以调用 repaint() 并进行迭代式工作。这样,您可以将除实际绘图代码之外的所有内容都保留在绘图之外。它看起来像这样:

public void init()
    {
      //do calculations here

    javax.swing.Timer timer = new javax.swing.Timer(1000 / frameRate, new ActionListener()
    {
        public void actionPerformed(ActionEvent evt)
        {
           //this is called every so often. Can link to update loops or be an 
           //update loop itself.
            repaint();
        }
    } );
    timer.start();
}

public void paint(Graphics g)
{       
    //All the actual drawing code for the shapes goes here.
}
于 2014-05-19T03:28:35.003 回答