【问题标题】:Update a graphic color using a button使用按钮更新图形颜色
【发布时间】:2011-12-25 12:33:35
【问题描述】:

我正在尝试更新构建框架时绘制的一些省略号和线条的颜色。 然后我想使用框架上的按钮更改颜色。

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);

}


}

我已经评论了我不知道该怎么做的地方!谁能帮忙?!?!

非常感谢提前 乔什

【问题讨论】:

    标签: java swing user-interface colors graphic


    【解决方案1】:

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

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

    另外,不建议保存图形并在绘制“事件”之外使用它

    【讨论】:

      【解决方案2】:

      不要存储 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);
      

      【讨论】:

        【解决方案3】:

        图形对象仅在绘制方法中进行真正的更改。所以保存图形对象(在你的情况下是 g2)是没有用的。而是将颜色放入变量中,并在按下按钮时更改颜色。在paint-method中使用color-variable,这样下次调用paint时它会用新的颜色重新绘制。

        也许您还需要致电repaint()。这会命令 awt-thread 进行新的绘画调用。

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-01-30
            • 1970-01-01
            • 2017-12-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-07-31
            • 1970-01-01
            相关资源
            最近更新 更多