【发布时间】:2014-04-23 14:17:09
【问题描述】:
我是 Java 新手。我通过创建一个弹跳球 GUI 开始学习。
除了一件事,我已经成功地完成了我想做的所有事情。每当它从框架边框反弹时,我都无法让球改变它的颜色。
我知道我不能使用 getGraphics 进行绘图,但在这种情况下,我也不能使用 paint 方法,因为我已经在程序开始时将它用于初始设置。如果我从循环中调用paint方法,它确实会改变颜色,但布局北侧的所有JButtons都会神秘地消失。
对我来说,让整个事情变得更加复杂的一件事是,我在 Runnable 接口的 void run 方法中循环球反弹。
我不知道如何解决它。
你们可以在 IDE 中复制我的代码。不起作用的一件事是球保持黑色并且不会改变它的颜色。其他一切都运行良好。
所以请帮我弄清楚如何在球弹起时改变球的颜色。
谢谢
代码:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Ball extends JFrame implements Runnable, ActionListener {
private JButton start;
private JButton stop;
private JButton fast;
private JButton slow;
private JButton reset;
private int ball_x;
private int ball_y;
private int dx = 10;
private int dy = 20;
private int size = 50;
private boolean active;
private int i = 20;
private int R = 255;
private int G = 0;
private int B = 255;
private Color rgb;
private MyPanel screen;
private class MyPanel extends JPanel {
public void paintComponent(Graphics g) {
super.paintComponent(g);
ball_x = screen.getWidth() / 2 - 25;
ball_y = screen.getHeight() / 2 - 25;
i = 20;
g.setColor(rgb);
g.fillOval(ball_x, ball_y, size, size);
}
public void clr() {
if (R <= 10) {
R = 255;
}
R = R - 10;
if (G >= 255) {
G = 0;
}
G = G + 15;
if (B <= 20) {
B = 255;
}
B = B - 20;
}
}
public void start() {
active = true;
start.setText("Start");
start.setEnabled(false);
start.setText("Jumping...");
Thread th = new Thread(this); // Thread anlegen
th.start(); // Thread starten
}
public void stop() {
if (active) {
start.setText("Continue");
}
active = false;
start.setEnabled(true);
}
public void reset() {
active = false;
size = 50;
screen.repaint();
start.setText("Start");
start.setEnabled(true);
}
public void slow() {
i = i + 2;
if (i >= 60) {
i = 60;
}
}
public void fast() {
i = i - 2;
if (i <= 5) {
i = 5;
}
}
public void actionPerformed(ActionEvent ereignis) {
if (ereignis.getSource() == start) {
start();
}
if (ereignis.getActionCommand() == "G+") {
fast();
}
if (ereignis.getActionCommand() == "G-") {
slow();
}
if (ereignis.getActionCommand() == "Reset") {
reset();
}
if (ereignis.getActionCommand() == "Pause") {
stop();
}
}
public Ball() {
this.setTitle("Jumping Ball \u00a9 The One");
Container panel = new Container();
panel.setLayout(new BorderLayout());
JPanel subpanel = new JPanel();
//subpanel.setLayout(new GridLayout());
screen = new MyPanel();
this.setVisible(true);
this.setSize(1366, 768);
this.setContentPane(panel);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
start = new JButton("Start");
fast = new JButton("G+");
slow = new JButton("G-");
reset = new JButton("Reset");
stop = new JButton("Pause");
subpanel.add(start);
subpanel.add(fast);
subpanel.add(slow);
subpanel.add(reset);
subpanel.add(stop);
panel.add(subpanel, "North");
panel.add(screen, "Center");
start.addActionListener(this);
stop.addActionListener(this);
reset.addActionListener(this);
slow.addActionListener(this);
fast.addActionListener(this);
}
public void run() {
while (active) {
screen.getGraphics().clearRect(ball_x, ball_y, size, size);
if (ball_x > (screen.getWidth() - 30) || ball_x < 25) {
dx = -dx;
size = size + 3;
screen.clr();
}
if (ball_y > (screen.getHeight() - 30) || ball_y < 25) {
dy = -dy;
size = size + 3;
screen.clr();
}
ball_x = ball_x + dx;
ball_y = ball_y + dy;
rgb = new Color(R, G, B);
screen.getGraphics().setColor(rgb);
screen.getGraphics().fillOval(ball_x, ball_y, size, size);
try {
Thread.sleep(i);
} catch (InterruptedException x) {
x.printStackTrace();
}
}
}
public static void main(String[] args) {
Ball bouncer = new Ball();
} // End of Method Main
}
谢谢
【问题讨论】:
-
为什么要花 200 多个 LOC 来显示您是如何尝试更改颜色的?为了尽快获得更好的帮助,请发布MCVE(最小完整且可验证的示例)。
-
我会做一个改变颜色的方法。然后可以循环调用该方法,会改变颜色
-
这是整个程序。这不仅仅是我试图改变颜色的部分。准确地说:
screen.getGraphics().setColor(rgb);不起作用,我不能使用paint 方法,因为它一开始就已经在做其他事情了。 -
@MarshallTigerus 为此,我需要paintComponent 方法,但我不能使用它,因为它已经被使用了。我像 10 天前一样刚开始使用 Java。不知道如何解决这个问题。
-
你应该做一些调试。看看你的代码是否达到了这一点。我也看不到你在哪里调用 run()