gpt4 book ai didi

java - 在运行的线程中更改弹跳球的颜色

转载 作者:行者123 更新时间:2023-11-29 03:21:40 25 4
gpt4 key购买 nike

我是 Java 新手。我通过创建弹跳球 GUI 开始学习。

除了一件事,我已经设法用它完成了所有我想做的事情。每当球从框架边界弹回时,我都无法让球改变颜色。

我知道我不能使用 getGraphics 进行绘图,但在这种情况下我也不能使用 paint 方法,因为我已经在程序开始时将它用于初始设置。如果我从循环中调用 paint 方法,它确实会改变颜色,但布局北侧的所有 JButton 都神秘地消失了。

让整个事情对我来说变得更加复杂的一件事是我在 Runnable 接口(interface)的 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


}

谢谢

最佳答案

虽然完整,但您的示例存在几个严重问题:

  • 错误synchronized .

  • 它过早地调用了 setVisible()

  • 它依赖于框架的几何形状,而不是封闭的面板。

相反,从引用的例子开始 here使用 Swing Timer .请注意,每次 repaint() 都会改变颜色,并且每次弹跳都会播放声音。添加一个成员变量,bounced

private boolean bounced;

当球弹起时,在TimeractionPerformed()方法中设置bounced = true

if (ballX - RADIUS < 0) {

bounced = true;
} else if (ballX + RADIUS > BOX_WIDTH) {

bounced = true;
}

paintComponent() 中,相应地更改颜色。

g.setColor(clut.peek());
if (bounced) {
clut.add(clut.remove());
bounced = false;
}

使用较小的 clut 可能更容易看到变化。

private static final float N = 16;

关于java - 在运行的线程中更改弹跳球的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23247130/

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