简体   繁体   中英

How to repaint in Java

I'm taking a course in GUI programing. I'm having a hard time understanding how to use the repaint my Box class to a different color. Here is my GUI class:

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

Here is where I add it to 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); 
    }
}

First, you don't need to do this...

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

You never want to change the state of ANY component from within ANY paint method, this will simply cause no end of issues and could bring your program to it's knees as it consumes the CPU cycles...

Second, your Box class's constructor never sets the Box 's background color. You don't actually need to maintain a reference to the color value, as the Box , via it's inheriancy, already supports this functionality

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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