Java Swing / Graphics - repaint()或validate()不起作用?

时间:2015-11-17 17:12:53

标签: java swing graphics repaint

我来自德国。我的英语不是很好,但我尽量减少错误。此外,这是我在这个社区的第一个问题,我希望我能得到一个有用且有用的答案(我已经向Google询问了20多次)

所以,我写了一个绘制两个不同颜色矩形的程序。当我点击一个按钮时,其中一个矩形的颜色应该改变,但它不会改变。我试过repaint(),validate()和我不理解的东西:pack() 什么都没有帮助。当我调整窗口大小时颜色会发生变化但是当我点击按钮时它会发生变化... 有人对这个问题有想法或答案吗?

我的代码:

import java.awt.Graphics2D;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JButton;

@SuppressWarnings("serial")

public class Test extends JFrame {

    public static boolean buttonClicked = false;

    public Test() {
        initComponents();
    }

    private void initComponents() {

        zeichne z = new zeichne();

        JFrame frame = new JFrame();
        frame.setTitle("Grafiktest");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(500, 500);
        Dimension dm = new Dimension(500,500);
        frame.setMinimumSize(dm);

        JPanel panel = new JPanel();
        panel.setLayout(new BorderLayout());

        JButton button = new JButton("Push me!");
        button.setSize(100, 50);

        button.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buttonActionPerformed(evt);
            }
        });

        panel.add(z);
        panel.add(button, BorderLayout.SOUTH);

        frame.setContentPane(panel);

        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {

        new Test();
    }

    private void buttonActionPerformed(java.awt.event.ActionEvent evt){
        if(buttonClicked == false)
            buttonClicked = true;
        else
            buttonClicked = false;

        repaint();
    }

    public static boolean getClicked() {
        return buttonClicked;
    }
 }

 @SuppressWarnings("serial")

 class zeichne extends JPanel {

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.drawRect(0, 0, 150, 100);
        g2.setColor(Color.black);
        g2.fillRect(0, 0, 150, 100);

        boolean clicked = Test.getClicked();

        if(clicked) {
            g2.setColor(Color.red);
        }
        else {
            g2.setColor(Color.gray);
        }
        g2.fillRect(10,10,130,80);

        System.out.println(g2.getColor());

    }
 }

2 个答案:

答案 0 :(得分:3)

应在组件中定义组件的属性。例如,当您使用JLabel时,您可以使用setText(...),setForeground(...),setFont(...)等来更改标签的状态,然后标签将重新绘制自己。

因此,当你做自定义绘画时,你应该做同样的事情。那是在你的" Zeichne"在类中创建一个方法来改变类的状态,如setSelected(...)。所以你的代码可能是这样的:

public void setSelected(boolean selected)
{
    this.selected = selected;
    repaint();
}

您还需要创建isSelected()方法,以便可以访问该属性的状态。然后在paintComponent(...)方法中执行:

g2.setColor( selected ? Color.RED : Color.GRAY );
g2.fillRect(10,10,130,80);

最后在ActionListener中,代码为:

z.setSelected( !z.isSelected() );

答案 1 :(得分:0)

我懂了! JFrame的扩展和JFrame的附加声明是问题所在。我删除了声明,将super()放入方法Test()并调整了JFrame的使用方法。现在它正在发挥作用。

感谢您的帮助!