【问题标题】:Repaint won't work in custom panel重绘在自定义面板中不起作用
【发布时间】:2013-06-24 13:06:51
【问题描述】:

我在重绘面板时遇到问题。我对动画的想法是用 int[] 填充一个数组。那是有效的部分。现在为它制作动画,我使用数组并用数组中的 int[] 填充变量 int[]。然后我调用 repaint 用所有数字重新绘制图像。但直到最后一次重绘才会重绘。任何有想法的人? 我认为问题所在的两个班级。下面给出(代码可能很混乱)。

我的想法是,我想按下按钮 shellSort。当我按下这个按钮时,代码将通过一个 for 循环,用整数填充面板中的一个数组。那么它应该重新粉刷我没有做的面板。

已编辑:我认为我的问题是它在完成之前永远不会离开 for 循环。如何停止 for 循环以重新绘制面板?然后从我离开的地方继续?

我在一个小例子中重建了我的问题 代码:

import java.awt.event.*;
import java.awt.*;
import javax.swing.*;

public class Repainten {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        GUI g = new GUI();
    }
}


public class GUI extends JFrame implements ActionListener{
    private JButton button;
    private Panel p;
    private int[] henk = {10, 6, 4, 2, 3, 7, 9};

    public GUI() {
        this.setTitle("getallen");
        this.setSize(200, 200);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //this.setLayout(new FlowLayout());
        button = new JButton("Button");
        p = new Panel();
        button.addActionListener(this);
        JPanel northPanel = new JPanel();
        northPanel.add(button);
        JPanel centerPanel = new JPanel();
        centerPanel.add(p);
        add(northPanel, BorderLayout.NORTH);
        add(centerPanel, BorderLayout.CENTER);
        //add(button);
        add(p);

        this.setVisible(true);
    }
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == button) {
            animeer();
        }
    }
    public void animeer() {
        for (final int a : henk) {                     
            p.cijfer = a;
            p.repaint();
        }
    }
}
public class Panel extends JPanel{
    public int cijfer = 0;

    public Panel(){

    }
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Font font = new Font("Algerian", Font.PLAIN, 100);
        g.setFont(font);
        System.out.println(cijfer);
        g.drawString(Integer.toString(cijfer), 60,110);

    }

}

【问题讨论】:

  • 是的,有点混乱。请提出一个可运行的示例(带有main)。没有人会看你刚刚发布的内容。删除任何不属于问题的代码,例如。我们需要任何图像代码吗?
  • 并将所有代码放在一个块中,这样人们可以快速将代码复制并粘贴到他们的 IDE 中并快速给您答案。您让我们做的工作越少,您得到答案的可能性就越大
  • 我希望这会更好:)
  • 除了这些链接不起作用之外,没有人想从其他位置下载代码。请发帖sscce
  • 删除读写方法。我们无法使用这些读写方法运行您的示例!而是创建一个返回值的模拟方法。

标签: java swing jpanel paintcomponent repaint


【解决方案1】:

问题在于repaint 已经过优化,以便快速连续多次调用该方法将导致只进行最后一次调用。解决方案是使用Swing Timer

Timer timer = new Timer(2000, new ActionListener() {

      int index = 0;

      @Override
      public void actionPerformed(ActionEvent e) {

      p.cijfer = henk[index];
      index++;
      p.repaint();

      if (index == henk.length) {
         Timer timer = (Timer) e.getSource();
         timer.stop();
      }
   }
});

【讨论】:

    【解决方案2】:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-25
      • 2011-09-30
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多