我有一项任务,要求球根据用户点击的按钮在屏幕上移动,并通过点击另一个按钮让球在红色和绿色之间切换。这一切都有效,但颜色变化。我有一个听众和班级对按钮点击作出反应,但我似乎没有得到改变。是否有更好/更简单的方法来实现这一目标?
提前感谢您的帮助!
我的代码:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Lab2b extends JFrame {
Lab2b(){
setTitle("Lab 2");
Lab2Panel p = new Lab2Panel();
add(p);
}
public static void main(String[] args){
Lab2b frame = new Lab2b();
frame.setTitle("Lab 2 - Ball Mover ");
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(600, 400);
frame.setVisible(true);
}
}
class Lab2Panel extends JPanel{
Lab2Button canvas = new Lab2Button();
JPanel panel = new JPanel();
Lab2Panel () {
setLayout(new BorderLayout());
JButton leftButton = new JButton("left");
JButton rightButton = new JButton("right");
JButton upButton = new JButton("up");
JButton downButton = new JButton("down");
JButton colorButton = new JButton("Change Color");
panel.add(leftButton);
panel.add(rightButton);
panel.add(upButton);
panel.add(downButton);
panel.add(colorButton);
this.add(canvas, BorderLayout.CENTER);
this.add(panel, BorderLayout.SOUTH);
leftButton.addActionListener(new LeftListener(canvas));
rightButton.addActionListener(new RightListener(canvas));
upButton.addActionListener(new UpListener(canvas));
downButton.addActionListener(new DownListener(canvas));
colorButton.addActionListener(new ColorChangeListener(canvas));
}
}
class Lab2Button extends JPanel {
int radius = 5;
int x = -1;
int y = -1;
protected void paintComponent(Graphics g){
if (x<0 || y<0) {
x = getWidth() / 2 - radius;
y = getHeight() / 2 - radius;
}
super.paintComponent(g);
g.setColor(Color.RED);
g.drawOval(x,y, 2 * radius, 2 * radius);
}
public void moveLeft(){
x -= 5;
this.repaint();
}
public void moveRight(){
x += 5;
this.repaint();
}
public void moveUp(){
y -= 5;
this.repaint();
}
public void moveDown(){
y += 5;
this.repaint();
}
public void colorChange(){
this.repaint();
}
}
class LeftListener implements ActionListener{
private Lab2Button canvas;
LeftListener(Lab2Button canvas) {
this.canvas = canvas;
}
public void actionPerformed(ActionEvent e){
canvas.moveLeft();
}
}
class RightListener implements ActionListener{
private Lab2Button canvas;
RightListener(Lab2Button canvas) {
this.canvas = canvas;
}
public void actionPerformed(ActionEvent e){
canvas.moveRight();
}
}
class UpListener implements ActionListener{
private Lab2Button canvas;
UpListener(Lab2Button canvas) {
this.canvas = canvas;
}
public void actionPerformed(ActionEvent e){
canvas.moveUp();
}
}
class DownListener implements ActionListener{
private Lab2Button canvas;
DownListener(Lab2Button canvas) {
this.canvas = canvas;
}
public void actionPerformed(ActionEvent e){
canvas.moveDown();
}
}
class ColorChangeListener implements ActionListener {
private Lab2Button canvas;
ColorChangeListener(Lab2Button canvas) {
this.canvas = canvas;
}
public void actionPerformed(ActionEvent e){
canvas.colorChange();
}
}
按钮移动侦听器类代码:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
class Lab2MoveBallListener extends Lab2Button implements ActionListener {
public void actionPerformed(ActionEvent e){
this.moveLeft();
}
}
好的,改变了这段代码:
public void colorChange(){
this.repaint();
}
这个和它在编译时出错:错误:找不到符号 if(g.getColor()= Color.RED){
public void colorChange(){
if (g.getColor() = Color.RED){
g.setColor(Color.GREEN);
}
else{
g.setColor(Color.RED);
}
this.repaint();
}
答案 0 :(得分:2)
看一下使用JColorChooser。它可以根据需要设置球的颜色。见How to Use Color Choosers
这里你对颜色进行了硬编码,因此无法修改球的颜色。使用班级成员Color
变量并从getColor分配。
除此之外:请记住在调用drawOval
之前设置颜色:
g.setColor(ballColor);
g.drawOval(x, y, 2 * radius, 2 * radius);
答案 1 :(得分:1)
当您调用方法colorChange()
时,您永远不会说要更改颜色,只需重新绘制屏幕即可。你需要在某处改变颜色。要做到这一点,我有一个颜色变量,并在ActionPerformed方法的if语句中为颜色按钮。 if将具有布尔值,如果它为真,则将颜色变量设置为等于此颜色,否则将其设置为等于另一种颜色。现在,g.setColor(Color.RED);
代替paintComponent()
而不是g.setColor(colorVariable);
,{{1}}。希望这有助于解决您的问题。