【问题标题】:Change the color of an oval at click in Java AWT在 Java AWT 中单击时更改椭圆的颜色
【发布时间】:2014-05-18 18:58:46
【问题描述】:

我必须在 Java 中绘制一些椭圆,然后单击更改它们的颜色。 一开始我尝试在 20 毫秒后更改颜色,但它不起作用。

我的代码是:

public class MyComponentNew extends Frame {

    public Graphics2D g2d;

    public MyComponentNew(String title) {
        super(title);
        setSize(400, 550);
    }

    @Override
    public void paint(Graphics g) {
        this.g2d = (Graphics2D) g;

        this.g2d.setColor(Color.red);
        this.g2d.fillOval(10, 55, 50, 100);
    }

    public void changeColor () {        
        this.g2d.setColor(Color.blue);
        this.g2d.fillOval(10, 55, 50, 100);
    }
}

在我的主要方法的类中:

MyComponentNew m;

m = new MyComponentNew("Fereastra cu baloane");
m.setVisible(true);

m.addWindowListener(new WindowAdapter() {
    @Override
    public void windowClosing(WindowEvent we) {
        System.exit(0);
    }
});

try {
    Thread.sleep(20);
} catch(InterruptedException e) {} 

m.changeColor();

椭圆的颜色保持红色。

【问题讨论】:

  • 你到底想点击什么?
  • 椭圆形,但一开始我尝试在 20 毫秒后更改椭圆形的颜色
  • @Cristina 如果你用 Focus Listener 试过这个,请在​​ cmets 中告诉我。我正在尝试使用 Focus Listener 更改形状的颜色。

标签: java awt paint thread-sleep


【解决方案1】:

原因是 AWT 会定期调用您的 paint 方法,它会很快用原来的红色椭圆覆盖新的蓝色椭圆。您可以通过将椭圆颜色存储在成员变量中、在 paint 方法中读取它并在您的 changeColor 方法中更改它来获得您想要的行为。

public class MyComponentNew extends Frame {

    private Color ovalColor;

    public MyComponentNew(String title) {
        super(title);
        setSize(400, 550);
        ovalColor = Color.red; // initial oval color
    }

    @Override
    public void paint(Graphics g) {
        Graphics2D g2d = (Graphics2D)g;

        g2d.setColor(ovalColor); // use whatever the current color is
        g2d.fillOval(10, 55, 50, 100);
    }

    public void changeColor() {    
        ovalColor = Color.blue; // change color
        repaint(); // force redraw with new color
    }
}

【讨论】:

    【解决方案2】:

    你需要在 JFrame 上调用 repaint() 方法,但正如代码所示,由于调用了paint-method,红色椭圆将再次绘制。你需要像这样改变它:

    import java.awt.Graphics2D;
    
    public class MyComponentNew extends Frame{
    
        public Graphics2D g2d;
        public Color color = Color.red;
    
        public MyComponentNew(String title) {
            super(title);
            setSize(400, 550);
    
        }
    
        @Override
        public void paint(Graphics g) {
            this.g2d = (Graphics2D) g;
            this.g2d.setColor(color);
            this.g2d.fillOval(10, 55, 50, 100);
            //this.g2d.drawLine (WIDTH, WIDTH, WIDTH, WIDTH);
        }
    
        public void changeColor (){ 
            color = Color.blue;
            this.repaint();
        }
    }
    

    颜色现在是一个在 changeColor 方法期间设置的实例变量。

    /尼克

    【讨论】:

      【解决方案3】:

      您需要查看Performing Custom Painting。你有点有这个概念,但你的 changeColor 方法对你没有任何作用。

      一些注意事项。

      • 首先您需要添加一个MouseListener。更多信息请访问How to Write MouseListeners

      • 您要做的第二件事就是拥有一个Color color 变量。您使用该变量来设置颜色。你的方法changeColor 应该只改变颜色和repaint()。类似的东西

        public class MyComponentNew extends JPanel {
            private Color color = Color.BLUE;
        
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.setColor(color);
            }
        
            public void changeColor() {
                if (color == Color.BLUE) {
                    color = Color.RED:
                } else {
                    color = color.BLUE;
                }
                repaint();
            }
        }
        
      • 请注意我如何使用JPanel 而不是JFrame。这是首选方法。

      • 第四,您应该使用 Swing 而不是 AWT。


      这是一个完整的例子,上面有这些要点

      import java.awt.Color;
      import java.awt.Dimension;
      import java.awt.Graphics;
      import java.awt.Graphics2D;
      import java.awt.event.MouseAdapter;
      import java.awt.event.MouseEvent;
      import java.awt.geom.Ellipse2D;
      
      import javax.swing.JFrame;
      import javax.swing.JPanel;
      import javax.swing.SwingUtilities;
      
      public class CircleChangeColor extends JPanel {
          private Ellipse2D circle = new Ellipse2D.Double(0, 0, 200, 200);
          private Color color = Color.blue;
      
          public CircleChangeColor() {
              addMouseListener(new MouseAdapter(){
                  public void mousePressed(MouseEvent e) {
                      if (circle.contains(e.getPoint())) {
                          changeColor();
                      }
                  }
              });
          }
      
          protected void paintComponent(Graphics g) {
              super.paintComponent(g);
              Graphics2D g2 = (Graphics2D)g;
              g2.setColor(color);
              g2.fill(circle);
          }
      
          public Dimension getPreferredSize() {
              return new Dimension(200, 200);
          }
      
          public void changeColor() {
              if (color == Color.BLUE) {
                  color = Color.RED;
              } else {
                  color = color.BLUE;
              }
              repaint();
          }
      
          public static void main(String[] args) {
              SwingUtilities.invokeLater(new Runnable(){
                  public void run() {
                      JFrame frame = new JFrame();
                      frame.add(new CircleChangeColor());
                      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                      frame.pack();
                      frame.setVisible(true);
                  }
              });
      
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-05
        • 2012-01-21
        • 1970-01-01
        • 1970-01-01
        • 2019-01-03
        • 1970-01-01
        相关资源
        最近更新 更多