使用按钮更新图形颜色



我正在尝试更新一些椭圆和线条的颜色,这些线条是在构建框架时绘制的。然后我想使用框架上的按钮来改变颜色。

package animation.test;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Ellipse2D;
import javax.swing.JButton;
import javax.swing.JFrame;
public class GraphDisplayTest extends JFrame {
static GraphDisplayTest gui;
private JButton changeColorBtn = new JButton("Change Color");
private Graphics2D g2;
private Ellipse2D e1;
private Ellipse2D e2;
private Ellipse2D e3;
private Ellipse2D e4;
int x = 50, y = 50, w = 20, h = 20;
public static void main(String[] args) {
    gui = new GraphDisplayTest();
    gui.launch();
}
public void launch(){
    gui.setLayout(new BorderLayout());
    gui.add(changeColorBtn, BorderLayout.SOUTH);
    changeColorBtn.addActionListener(new ChangeColor());
    gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    gui.setTitle("Graph Display Example");
    gui.setSize(350, 400);
    gui.setVisible(true);
}
public class ChangeColor implements ActionListener{
    public void actionPerformed(ActionEvent e){
    //HERE IS THE PROBLEM - the colors are not being reset
        g2.setPaint(Color.BLACK);
        g2.fill(e1);
        g2.drawLine(x+10, y+10, x+210, y+10);
        g2.setColor(Color.WHITE);
    }
}

public void paint(Graphics g) {
    g2 = (Graphics2D)g;
    g2.drawLine(x+10, y+10, x+210, y+10);
    g2.setColor(Color.BLACK);
    g2.drawLine(x+210, y+10, x+210, y+210);
    g2.setColor(Color.BLACK);
    g2.drawLine(x+10, y+210, x+210, y+210);
    g2.setColor(Color.BLACK);
    g2.drawLine(x+10, y+10, x+10, y+210);
    g2.setColor(Color.BLACK);
    e1 = new Ellipse2D.Double(x, y, w, h);
    g2.setPaint(Color.BLUE);
    g2.fill(e1);
    e2 = new Ellipse2D.Double(x+200, y, w, h);
    g2.setPaint(Color.RED);
    g2.fill(e2);
    e3 = new Ellipse2D.Double(x, y+200, w, h);
    g2.setPaint(Color.GREEN);
    g2.fill(e3);
    e4 = new Ellipse2D.Double(x+200, y+200, w, h);
    g2.setPaint(Color.YELLOW);
    g2.fill(e4);
}

}

我已经评论了我不知道该怎么做!有人能帮忙吗?

提前感谢Josh

每次调用paint时,您都会覆盖具有颜色信息的旧图形

最好添加一个初始化为Color.BLACK的字段颜色,在paint中使用并在侦听器的actionPerformed中更新

另一个注意事项是

保存图形并在油漆"事件"之外使用它是不推荐的

不要存储图形对象的值(在本例中为g2)。

创建一个新属性来存储e1的颜色:

Color c = Color.BLUE;

删除actionPerformed(...)中的所有代码,并将c的值设置为新颜色。然后,呼叫repaint()

c = Color.BLACK;
repaint();

paint(...)中,更改行:

g2.setPaint(Color.BLUE);
g2.fill(e1);

:

g2.setPaint(c);
g2.fill(e1);

图形对象只在paint-method中进行真正的更改。因此保存graphics -对象(在您的例子中是g2)是没有用的。相反,将颜色放入一个变量中,并在按下按钮时更改颜色。在paint-方法中使用color变量,这样在下次调用paint时,它将使用新颜色重新绘制。

也许你还需要调用repaint()。命令awt线程重新调用paint.

你在ActionListener中使用的Graphics对象已经在屏幕上了。依靠它是行不通的。您所要做的就是保持一个字段,在其中跟踪颜色(*)。当动作监听器运行时,将颜色设置为您想要的任何颜色,然后调用repaint()。这是JFrame的一个方法,它将使窗口重新绘制,它将调用您编写的paint(Graphics g)。在该方法中,检查您持有的颜色(与我用星号*标记的颜色相同)。根据颜色,设置图形对象的颜色,然后绘制。

最新更新