如何在Java中重新绘制

时间:2015-04-08 01:30:32

标签: java swing repaint

我正在学习GUI编程课程。我很难理解如何使用重新绘制我的Box类来获得不同的颜色。 这是我的GUI类:

public class Box extends JPanel {

    private Color color;
    private int boxNumber;


    public Box(Color color, int boxNumber){
        this.boxNumber = boxNumber;
        this.color = color;
    }

    public void changeColor(){
        setBackgroundColor(Color.WHITE);
        repaint();
    }

    protected void paintComponent(Graphics g){
        super.paintComponent(g);
        setBackground(color);
    }
}

以下是我将其添加到Frame的位置:

public class MainHeader {

    Box box[];
    public MainHeader(){

    }

    private void setBox(){

        box = new Box[4];
        Color color[] = {Color.RED, Color.YELLOW, Color.BLUE, Color.ORANGE};

        for(int i = 0; i < color.length; i ++){
            box[i] = new Box(color[i],i);
        }
    }

    private void gui(){
        JFrame f = new JFrame();
        f.setLayout(new GridLayout(2,2,1,1));
        setBox();
        for(Box b : box)
            f.add(b);
        f.setSize(500,500);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setResizable(false);
        f.setVisible(true); 
    }
}

1 个答案:

答案 0 :(得分:2)

首先,你不需要这样做......

protected void paintComponent(Graphics g){
    super.paintComponent(g);
    setBackground(color);
}

你永远不想在任何绘画方法中改变任何组件的状态,这只会导致问题无法结束,并且可能会使你的程序因为消耗CPU周期而跪下......

其次,您的Box班级构造函数从不设置Box的背景颜色。您实际上并不需要维护对颜色值的引用,因为Box通过它的继承性已经支持此功能

public Box(Color color, int boxNumber){
    this.boxNumber = boxNumber;
    setBackground(color);
}