gpt4 book ai didi

java - Swing Timer 内的绘画不起作用

转载 作者:搜寻专家 更新时间:2023-10-31 08:16:38 25 4
gpt4 key购买 nike

我以前从未使用过Timer,所以我的问题可能真的很愚蠢。我的程序绘制了一个红色的圆圈,随机数秒后圆圈的颜色应变为绿色。我刚刚制作了一个 Swing 计时器,您可以在下面的代码中看到。然后它进入 actionPerformed() 方法但它不会改变颜色。您能以某种方式帮助我解决更改颜色的问题吗?

我的代码:

package igrica;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;


public class ChangingCircle implements ActionListener{

JFrame frame;

Timer timer;
Random r;

public static void main(String[] args) {
ChangingCircle gui = new ChangingCircle();
gui.go();
}

public void go() {
frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

MyPanel panel = new MyPanel();

frame.getContentPane().add(BorderLayout.CENTER, panel);
frame.setSize(300, 300);
frame.setVisible(true);
}

public void actionPerformed(ActionEvent event) {
frame.repaint();
}

class MyPanel extends JPanel {
public void paintComponent(Graphics g) {


g.setColor(Color.red);
g.fillOval(100, 100, 100, 100);

Random r = new Random();

Timer timer = new Timer(r.nextInt(5000) + 1000, new ActionListener() {
public void actionPerformed(ActionEvent ev) {
System.out.println("Timer out");
g.setColor(Color.green);
g.fillOval(100, 100, 100, 100);
}
});
timer.start();
}
}
}

最佳答案

您的代码非常困惑。试试这个:

public class ChangingCircle {

Color color = Color.RED;
MyPanel panel = new MyPanel();

public static void main(String[] args) {

SwingUtilities.invokeLater(() -> {
ChangingCircle gui = new ChangingCircle();
gui.go();
});
}

public void go() {

JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.getContentPane().add(panel, BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);

Random r = new Random();
Timer timer = new Timer(r.nextInt(5000) + 1000, new ActionListener() {

public void actionPerformed(ActionEvent ev) {

System.out.println("Timer");
color = Color.GREEN;
panel.repaint();
}
});
timer.setRepeats(false);
timer.start();
}

class MyPanel extends JPanel {

private int size = 100, loc = 100;

@Override
public void paintComponent(Graphics g) {

super.paintComponent(g);
g.setColor(color);
g.fillOval(loc, loc, size, size);
}

@Override
public Dimension getPreferredSize() {

return new Dimension(size + loc, size + loc);
}
}
}

想法是定时器只改变要绘制的形状的属性,然后调用repaint() 来反射(reflect)变化。 paintComponent 会在需要时被调用,即使是快速连续调用,也应该很快返回。

具体注意事项:

  • Start Swing from the EDT .
  • paintComponent 外部创建并启动计时器,因为它被多次调用并且会创建并启动许多计时器。
  • 您或许应该将计时器设置为不重复。
  • 调用 super.paintComponent(g); 作为 paintComponent 中的第一件事。
  • 您似乎有一个什么都不做的ActionListener

一般提示:

  • 在适用时使用 @Override 注释。
  • 在框架上调用 pack() 而不是手动设置其大小,并 @Override 您绘制的组件的 getPreferredSize 方法。根据您绘制的内容返回有意义的尺寸。
  • 使用 add(component, location) 而不是相反(已弃用)。
  • 不要使用局部变量可以使用的字段(例如 Random r)。
  • 使用大写常量名称(Color.RED 而不是 Color.red)。

关于java - Swing Timer 内的绘画不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34883598/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com