我正在尝试更新构造框架时绘制的一些椭圆和线条的颜色。 然后,我想使用框架上的按钮更改颜色。
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);
}
}
我已经表示我不知道该怎么做!有人可以帮忙吗?!?!
非常感谢提前 约什
答案 0 :(得分:2)
每次调用paint时,都会覆盖具有颜色信息的旧图形
最好添加一个初始化为Color.BLACK
的字段颜色,你在paint中使用它并在actionPerformed中更新内部颜色
在另一个说明中保存图形并在油漆“事件”之外使用它不建议
答案 1 :(得分:1)
图形对象只在paint-method中进行真正的更改。因此保存Graphics-object(在你的情况下为g2)没有用。而是将颜色放在变量中,并在按下按钮时更改颜色。在paint-method中使用color-variable,因此下次调用paint时将使用新颜色重新绘制。
也许您还需要致电repaint()
。这会命令awt-thread对绘制进行新的调用。
答案 2 :(得分:1)
您在ActionListener中使用的Graphics对象已在屏幕上。借鉴它将无法运作。您需要做的是保持一个跟踪颜色(*)的字段。当动作侦听器运行时,将颜色设置为您想要的任何颜色,然后调用repaint()
。这是一个JFrame的方法,它将使窗口重新绘制,这将调用您编写的paint(Graphics g)
。在该方法中,检查您持有的颜色(与我用星号*标记的相同)。根据颜色,设置Graphics对象的颜色,然后绘制。
答案 3 :(得分:1)
不要存储Graphics对象的值(在这种情况下: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);