Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JButton来回改变某物的颜色?_Java_Swing - Fatal编程技术网

Java JButton来回改变某物的颜色?

Java JButton来回改变某物的颜色?,java,swing,Java,Swing,我需要制作一个按钮,将红色圆圈的颜色更改为绿色,非常简单。但是每次你按下按钮时,颜色应该在红色和绿色之间变化,你是怎么做到的?我可以让它变色一次,但仅此而已 这是我的小组: import javax.swing.*; import java.awt.*; import java.awt.event.*; public class mypanel extends JPanel implements ActionListener { JButton b; Color c1, c2;

我需要制作一个按钮,将红色圆圈的颜色更改为绿色,非常简单。但是每次你按下按钮时,颜色应该在红色和绿色之间变化,你是怎么做到的?我可以让它变色一次,但仅此而已

这是我的小组:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class mypanel extends JPanel implements ActionListener {
    JButton b;
    Color c1, c2;
    int x, y, z, q;
    public mypanel() {
        this.setVisible(true);
        this.setBackground(Color.darkGray);
        b = new JButton("change color");
        add(b);
        b.setBounds(110, 0, 30, 50);
        b.addActionListener(this);
        c1 = Color.green;
        c2 = Color.red;
        x = 80;
        y = 130;
    }
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        this.requestFocus();
        g.setColor(Color.black);
        g.fillRect(110, 70, 60, 100);
        g.setColor(c2);
        g.fillOval(125, x, 30, 30);
    }
    public void actionPerformed(ActionEvent e) {
        repaint();
        if (e.getSource() == b) {
            c2 = c1;
            x = y;
        }
    }
}

您需要使用代码更改多个内容:

  • 第三个
    Color
    对象存储当前
    Color
  • 检查currentColor是红色还是绿色的方法:我使用了
    布尔值
  • 删除
    y
    变量
我注意到的最重要的事情是你改变当前变量值的方式。但这使得无法返回到旧值,因为现在有两个引用指向同一对象

您应该对此进行操作,阅读有关引用或基元值的信息

注意:这可以简化,但为了清晰起见,我更喜欢添加更多的步骤。这样就更容易理解了


解决方案
您需要使用代码更改多个内容:

  • 第三个
    Color
    对象存储当前
    Color
  • 检查currentColor是红色还是绿色的方法:我使用了
    布尔值
  • 删除
    y
    变量
我注意到的最重要的事情是你改变当前变量值的方式。但这使得无法返回到旧值,因为现在有两个引用指向同一对象

您应该对此进行操作,阅读有关引用或基元值的信息

注意:这可以简化,但为了清晰起见,我更喜欢添加更多的步骤。这样就更容易理解了


解决方案
最直接的方法是为状态添加一个变量,并设计一种基于该变量的绘制方法,在这种情况下,一个布尔变量就足够了:

boolean on = false; //when on use green circle
然后在
paintComponent()
中,使用颜色和位置更改行以使用此变量:

g.setColor(on?c1:c2); //uses green when on
g.fillOval(125, on?y:x, 30, 30); //uses lower position when on
有了这些更改,您只需更新状态即可
actionPerformed()

if (e.getSource() == b) 
   on = !on; //toggle state

我们绘制的方式现在完全取决于我们当前的状态,因此我们不会更改任何描述正在绘制的圆的核心变量。

最直接的方法是为状态添加一个变量,并设计一种基于该变量的绘制方法,在这种情况下,一个布尔变量就足够了:

boolean on = false; //when on use green circle
然后在
paintComponent()
中,使用颜色和位置更改行以使用此变量:

g.setColor(on?c1:c2); //uses green when on
g.fillOval(125, on?y:x, 30, 30); //uses lower position when on
有了这些更改,您只需更新状态即可
actionPerformed()

if (e.getSource() == b) 
   on = !on; //toggle state

我们绘制的方式现在完全取决于我们当前的状态,因此我们不会更改任何描述正在绘制的圆的核心变量。

什么是
z
q
?您似乎没有使用它们。@Linus在解决此问题后,他可能正在使用它们。什么是
z
q
?您似乎没有使用它们。@Linus解决此问题后,他可能正在使用它们。谢谢。。我还是个初学者,所以我很感谢你的帮助。@heisenfgt,不客气。如果您有任何其他问题,请随时发布。:)非常感谢。我还是个初学者,所以我很感谢你的帮助。@heisenfgt,不客气。如果您有任何其他问题,请随时发布。:)