繁体   English   中英

初学者Graphics2D Java:repaint()

[英]Beginner Graphics2D Java : repaint()

我试图在操作处理程序中更改我的Red Cirlces的颜色,然后repaint() ,但我不知道为什么它不起作用。

在这里进口

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import static javax.swing.JFrame.EXIT_ON_CLOSE;
import javax.swing.JPanel;

我在这里的课:

public class CirclePanel extends JPanel implements ActionListener  {
    static JFrame f;
    static JButton run1, run2, reset, quit;
    static JPanel btnPanel;
    static CirclePanel circlePanel;
    static final int NUM = 5;
    static Color c;
    static Graphics2D g2;
    static Graphics2D g3; 

    public CirclePanel(){

        f = new JFrame();

        f.setTitle("Dining Philosophers");
        f.setDefaultCloseOperation(EXIT_ON_CLOSE);
        f.setSize(1000,1000);
        f.setLayout(new BorderLayout());

        btnPanel = new JPanel();
        btnPanel.setPreferredSize(new Dimension(250, 100));
        btnPanel.add(run1 = new JButton("Run 1"));
        btnPanel.add(run2 = new JButton("Run 2"));
        btnPanel.add(reset = new JButton("Reset"));
        btnPanel.add(quit = new JButton("Quit"));

        run1.setPreferredSize(new Dimension(180, 50));
        run2.setPreferredSize(new Dimension(180, 50));
        reset.setPreferredSize(new Dimension(180, 50));
        quit.setPreferredSize(new Dimension(180, 50));

        run1.addActionListener(this);


        f.add(btnPanel, BorderLayout.SOUTH);

        f.add(this, BorderLayout.CENTER);

        f.setVisible(true);
    }


    @Override
    public void paintComponent(Graphics g){

        super.paintComponent(g);
        g2 = (Graphics2D) g;
        g3 = (Graphics2D) g;
        g2.translate(470, 400);

        c = Color.red;

        for(int i = 0; i <  NUM; ++i){
            c = Color.red;

            g2.setColor( c);

            g2.fillOval(150, 0, 100, 100);

            g3.setColor(Color.BLACK);
            g3.fillOval(90, 0, 30, 30);

            g2.rotate(2*Math.PI/ NUM);
        }
    }

如您所见,当我按下按钮Run1时,它确实进入了动作处理程序并执行了repaint方法,但是没有任何变化。

    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == run1) {
            System.out.println("Entered Action Handler");

            g2.setColor(Color.green);

            repaint();

        }
    }

这是我的主要内容:

    public  static void main(String[] args) {

         new CirclePanel();
    }

}

Graphics对象不是长期存在的,不稳定的,并且您不应该以这种方式使用它们。 无需设置g2或任何其他Graphics 字段 ,而是创建一个Color字段,例如称为Color circleColor = ...; ,并更改此设置 protected void paintComponent(Graphics g)方法中,调用g.setColor(circleColor); ,这应该可行。

请删除这些字段,因为它们很危险:

// static Graphics2D g2;
// static Graphics2D g3; 

此外,您的代码还显示了对static修饰符的过度使用,因此,我建议您除常数外,建议您所有字段都不是静态的:

static final int NUM

repaint()方法最终将调用面板的paintComponent()方法。 Swing将传递要在绘画中使用的Graphics对象。

在绘画代码中,您始终将颜色硬编码为红色。 不要这样

相反,您需要在面板类中定义一个变量。 假设“ circleColor”(即,“ circleColor”替换了您的“ c”变量,因为变量名称应更具描述性,而不仅仅是一个字符)。

然后在您的ActionListener代码中执行以下操作:

//g2.setColor(Color.green);
circleColor = Color.green;

您可以在paintCompnent()方法中执行以下操作:

//c = Color.red;
g.setColor(circleColor);

也:

static Graphics2D g2;
static Graphics2D g3; 

不需要任何这些变量。 您始终使用传递给绘画方法的Graphics对象。

阅读Swing教程上有关Custom Paint的部分,以获取更多信息以及有关如何构建代码的更好示例。 例如,您不应该使用静态变量。

发生了什么事:

  • 您正在动作监听器中更改g2颜色。
  • 然后调用repaint(); 因此将调用paintComponent(Graphics g)
  • paintComponent(Graphics g)方法中,您将g2颜色设置为c因此您将覆盖在动作侦听器中所做的更改。

这就是为什么圆圈最终不会变色的原因。

您应该设置c = Color.RED; 在构造函数中,而不是在for循环中,则只需在操作侦听器中更改c的值c = Color.GREEN;

另外,您正在设置c = Color.RED; 无论是在for循环中还是在它之前都没有用。

编辑:
正如@camickr所建议的@camickr您的代码结构也很糟糕。

  • 您不需要g2g3因为您可以使用同一个Graphics g对象绘制多个形状。
  • 在您的情况下,您甚至不需要在paintComponent方法之外调用g ,因为您可以像我上面所说的那样简单地更改Color c变量。
  • 您也不需要所有这些static变量。 只是将它们设为private ,如果您需要从课程之外访问它们,则应该创建一些getterssetters

在这里,您将找到有关静态变量的更多信息和一些示例。
在这里,您将找到有关吸气剂,设置器和封装的更多信息。

有关如何更改代码的示例:

public class CirclePanel extends JPanel implements ActionListener  {

    private JFrame f;
    private JButton run1, run2, reset, quit;
    private JPanel btnPanel;
    private int NUM;
    private Color c;

    public CirclePanel(){

        color1 = Color.red;
        color2 = Color.black;

        NUM = 5;

        // Setup JFrame and stuff as you were doing.

    }


    @Override
    public void paintComponent(Graphics g){

        super.paintComponent(g);

        g.translate(470, 400);

        for(int i = 0; i < NUM; i++){

            g.setColor(color1);
            g.fillOval(150, 0, 100, 100);

            g.setColor(color2);
            g.fillOval(90, 0, 30, 30);

            g.rotate(2*Math.PI/ NUM);
        }
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == run1) {
            System.out.println("Entered Action Handler");

            color1 = Color.green;

            repaint();
        }
    }

    // GETTERS and SETTERS if needed
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM