当前位置: 首页 > 知识库问答 >
问题:

Java-在一种方法中重绘JPanel2次

左仰岳
2023-03-14

这是我问题的简单版本。我有3个类:公共类TopographyFrame扩展JFrame-带JPAnel的简单JFrame和按钮公共类TopographyPanel扩展JPAnel-JPAnel以填充矩形公共类Siec-类执行计算并调用JPAnale上的重新绘制

在JPanel中,我概述了paintComponent()方法

public void paintComponent (Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        System.out.println(rectangles.length);
        for(int i = 0 ; i < rectangles.length ; i++){
            g2.setPaint(neurony[i].winner);
            g2.fillRect((int)rectangles[i].x,(int)rectangles[i].y,(int)rectangles[i].width, (int)rectangles[i].height);
        }
    }

Neurony-具有字段公共颜色获胜者的对象数组

在Siec类中,我引用JPanel在JFrame类中重新绘制它,我有一个带有私人动作侦听器的按钮:

class MyListener implements ActionListener{
        Siec s;
        public MyListener(Siec s){
            this.s = s;
        }
        public void actionPerformed(ActionEvent arg0) {
            try {
                s.forPaint();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

Siec中的方法forPaint()如下所示:

public void forPaint(){

        setTopography();

        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        setTopography();
    }
public void setTopography() {
    for (int i = 0; i < vector.colors.length; i++) {
            neurony[i].winner = vector.colors[(int)(random() * 900 % vector.colors.length)];
    }
    panel.repaint();
}

矢量。颜色是颜色的数组

所以我的问题是:当我点击一个按钮时,我想立即重新绘制,然后在3秒钟后重新绘制一次。Insted JPanel在3s延迟后仅重新绘制一次。}

共有3个答案

隆飞驰
2023-03-14

由于睡眠是在事件调度线程上执行的,因此在等待结束之前无法执行repaint()事件。改为:

private Timer timer = new Timer(); // use java.util.Timer

public void forPaint() {

    setTopography();

    timer.schedule(new TimerTask() {

        @Override
        public void run() {
            setTopography();
        }

    }, 3000);

}

public void setTopography() {
    SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {

            for (int i = 0; i < vector.colors.length; i++) {
                neurony[i].winner = vector.colors[(int)(random() * 900 % vector.colors.length)];
            }
            panel.repaint();
        }
    });
}

请记住,对Swing组件(例如您的JPanel)的所有修改都必须在EDT上进行。

谭泉
2023-03-14

您正在调度UI线程上的重新绘制,然后将UI线程Hibernate(阻塞)3秒,然后再次请求另一次重新绘制。这两种情况要么在该方法完成后(3秒后)非常接近,要么合并到一个更新中(之后也是如此)。您可以计划在3秒后在UI线程上调用setTopology,而不是再次调用setTopology。

看一看摆动计时器,例如:http://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html

因此,大致如下:

javax.swing.Timer timer = new javax.swing.Timer(3000, new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        setTopography();
    }
});
timer.setRepeats(false);
timer.start();
融烨华
2023-03-14

你永远不能在事件处理线程上睡眠、等待或以其他方式暂停。这样做会阻止处理所有事件,包括绘制事件。你的第一幅画无法出现,因为你睡在事件线程上,阻止了它的发生。

制作任何类型动画的正确方法——甚至像这样简单的事情——是创建自己的线程。第二个线程可以调用repaint(),Hibernate3秒,然后再次调用repaint()。SwingWorker类名义上是一种更简单的方法,但老实说,初学者总是发现创建自己的线程更容易。

 类似资料:
  • 问题内容: 我有Visio2007,我真的很喜欢。但是,它似乎没有Java的UML模型/数据类型。我可以为Java下载一些模板吗?还是我应该完全忘记Visio并获得一个Elipse插件? 谢谢! 问题答案: 后者是更好的选择,恕我直言。此外,我认为UML模型不应该特定于Java。我不知道周围是否有特定于Java的UML。 我在网上搜索时发现了这个。UML模型:MS Visio 2007。

  • 问题内容: 嗨,我在Java中有一个绘制矩形的代码,但是它只会向右拖动,即使我向左拖动,也会向右拖动,这是代码对我有帮助吗? 问题答案: 请记住,(和和)不会渲染宽度/高度为负的矩形 你需要两件事… 当前鼠标点(或您的情况下的拖动点) 首次按下鼠标的点(锚点或原点) 您应该从事件中获取锚点… 然后,您需要确定哪个点最小,并将其作为起点,哪个点最大,并将其用于尺寸。

  • 问题内容: 我有一个接口,我想在进行快速Google搜索后在单独的类中实现,显然Java没有局部类。有没有办法做到这一点,还是我将所有代码都扔进一个类中? 基本上,我正在尝试编写服务。有些服务方法实际上属于它们自己的类,并且在同一类中似乎是不合逻辑的。这是我正在尝试做的一个例子。 我通常会在C#中使用局部类,并且会使用类似的方法将相似的值返回到一个局部类中(或者可能在一个类中更新记录的类)。我将如

  • -在if语句中输入图像描述错误

  • 问题内容: 我正在学习使用装饰器模式,但遇到一个我认为很简单但似乎找不到答案的问题。假设我有一个抽象的饮料类。然后,让我们说一下扩展饮料的一些具体组成部分:美式咖啡,浓缩咖啡,拿铁咖啡等。还有扩展饮料的抽象调味品类。然后,调味品类有多个子类:牛奶,糖,大豆,鞭子。每个调味品子类都有一个cost和getdescription()方法,分别从Beverage和Condiments继承。我的问题是,如何

  • 我正在学习使用decorator模式,我遇到了一个问题,我认为这个问题很简单,但我似乎找不到答案。假设我有一个饮料课是抽象的。然后让我们假设我有几个具体的成分延伸饮料:美式咖啡,浓缩咖啡,拿铁等等,还有一个抽象的调味品类延伸饮料。调味品类又有多个子类:牛奶、糖、大豆、鞭。每个调味品子类都有一个cost和getdescription()方法,分别继承自Beverage和addinments。我的问题