基本上我的Belisha Beacon必须保持橙色,当我点击Steady按钮时,但在我的程序中,当我点击Steady Button时,Beacon保持为浅灰色。有人可以请说明我出错的地方吗?谢谢你:)这是我的代码:
package Homework;
import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;
import javax.swing.Timer;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class BelishaBeacon {
private static Timer timer;
public class Drawing extends JPanel {
private int x = 125;
private int y = 80;
private boolean changeColors = false;
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
Rectangle box1 = new Rectangle(165, 180, 20, 45);
Rectangle box2 = new Rectangle(165, 225, 20, 45);
Rectangle box3 = new Rectangle(165, 270, 20, 45);
Rectangle box4 = new Rectangle(165, 315, 20, 45);
Rectangle box5 = new Rectangle(165, 360, 20, 45);
Rectangle box6 = new Rectangle(165, 405, 20, 45);
Ellipse2D.Double ball = new Ellipse2D.Double(x, y, 100, 100);
g2.draw(ball);
g2.draw(box1);
g2.draw(box2);
g2.draw(box3);
g2.draw(box4);
g2.draw(box5);
g2.draw(box6);
g2.setColor(Color.BLACK);
g2.fill(box1);
g2.fill(box3);
g2.fill(box5);
g2.setColor(Color.ORANGE);
g2.fill(ball);
changeColors = !changeColors;
if (changeColors) {
g2.setColor(Color.lightGray);
g2.fill(new Ellipse2D.Double(x, y, 100, 100));
}
}
public void changeColors() {
changeColors = true;
repaint();
}
}
public BelishaBeacon() {
JFrame frame = new JFrame();
frame.setSize(350, 570);
frame.setTitle("Belisha Beacon");
frame.setLayout(new BorderLayout(0, 0));
final Drawing shapes = new Drawing();
timer = new Timer(500, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
shapes.repaint();
}
});
JButton jbtFlash = new JButton("Flash");
jbtFlash.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Flashing");
if (!timer.isRunning()) {
timer.start();
}
}
});
final JButton jbtSteady = new JButton("Steady");
jbtSteady.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
timer.stop();
}
});
JPanel controlPanel = new JPanel();
controlPanel.setLayout(new GridLayout(1, 2, 0, 0));
controlPanel.add(jbtFlash);
controlPanel.add(jbtSteady);
frame.add(controlPanel, BorderLayout.SOUTH);
frame.add(shapes);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
public static void main(String[] args) {
new BelishaBeacon();
timer.start();
}
}
答案 0 :(得分:2)
试试这个:
public class BelishaBeacon {
private static Timer timer;
public class Drawing extends JPanel {
private int x = 125;
private int y = 80;
private boolean changeColors = false;
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
Rectangle box1 = new Rectangle(165, 180, 20, 45);
Rectangle box2 = new Rectangle(165, 225, 20, 45);
Rectangle box3 = new Rectangle(165, 270, 20, 45);
Rectangle box4 = new Rectangle(165, 315, 20, 45);
Rectangle box5 = new Rectangle(165, 360, 20, 45);
Rectangle box6 = new Rectangle(165, 405, 20, 45);
Ellipse2D.Double ball = new Ellipse2D.Double(x, y, 100, 100);
g2.draw(ball);
g2.draw(box1);
g2.draw(box2);
g2.draw(box3);
g2.draw(box4);
g2.draw(box5);
g2.draw(box6);
g2.setColor(Color.BLACK);
g2.fill(box1);
g2.fill(box3);
g2.fill(box5);
g2.setColor(Color.ORANGE);
g2.fill(ball);
// changeColors = !changeColors;
if (changeColors) {
g2.setColor(Color.lightGray);
g2.fill(new Ellipse2D.Double(x, y, 100, 100));
}
}
public void changeColors() {
changeColors = !changeColors;
repaint();
}
public boolean getChangeColors() {
return changeColors;
}
}
public BelishaBeacon() {
JFrame frame = new JFrame();
frame.setSize(350, 570);
frame.setTitle("Belisha Beacon");
frame.setLayout(new BorderLayout(0, 0));
final Drawing shapes = new Drawing();
timer = new Timer(500, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//shapes.repaint();
shapes.changeColors();
}
});
JButton jbtFlash = new JButton("Flash");
jbtFlash.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Flashing");
if (!timer.isRunning()) {
timer.start();
}
}
});
final JButton jbtSteady = new JButton("Steady");
jbtSteady.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
timer.stop();
if(shapes.getChangeColors()) {
shapes.changeColors();
}
}
});
JPanel controlPanel = new JPanel();
controlPanel.setLayout(new GridLayout(1, 2, 0, 0));
controlPanel.add(jbtFlash);
controlPanel.add(jbtSteady);
frame.add(controlPanel, BorderLayout.SOUTH);
frame.add(shapes);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
public static void main(String[] args) {
new BelishaBeacon();
timer.start();
}
}
答案 1 :(得分:2)
不要试图切换 override func prepareForReuse() {
self.questionLabel.text = nil
self.questionAnswer.on = data?.answer
}
中的颜色,而是paintComponent()
Drawing
并使用它来渲染球:
Color
让private Color color = Color.lightGray;
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
…
g2.setColor(color);
g2.fill(ball);
…
}
实际改变颜色:
changeColors()
并添加 public void changeColors() {
if (Color.orange.equals(color)) {
color = Color.lightGray;
} else {
color = Color.orange;
}
repaint();
}
方法:
makeSteady()
现在,你的计时器的动作可以只做public void makeSteady() {
color = Color.orange;
repaint();
}
,你的 Flash 按钮处理程序可以只做shapes.changeColors()
而你的 Steady 按钮处理程序就可以了这样做:
timer.restart()
另外,不要忘记invokeLater()
。