Java setBackground()混乱

时间:2014-05-05 18:34:31

标签: java swing graphics jframe jpanel

我是Java swing库的新手,我目前在设置JFrame的背景时遇到了一些麻烦。

我已阅读jframe-setbackground-not-working-why及其中的链接,但它似乎并不适合这里。

这是我的代码:

public class Board extends JPanel{

    public enum pointType{
        EMPTY,
        CARRIER,
        BALL;
    }

    private class Point{
        int x;
        int y;
        pointType type;

        public void paint (Graphics2D g2){
            // color changes depends on pointType
            g2.setColor(Color.WHITE);
            g2.fillOval(x,y,25,25);
        }
    }

    Point[][] myBoard;

    public Board(){
        //constructor, myBoard = 2d List of points
    }

    //.. other methods and class variables

    public void paint(Graphics g){
        Graphics2D g2 = (Graphics2D) g;
        for(int k =HEIGHT; k>=0; k--){
            for(int i=WIDTH; i>=0; i--){
                // call paint method for each points on board
                myBoard[i][k].print(g2);
            }
        }
    }

    public static void main(String[] args){
        Board board = new Board();
        JFrame myFrame = new Jframe("Game");

        myFrame.add(board);
        board.setBackground(Color.YELLOW);
        myFrame.setVisible(true);

        mtFrane.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   }
}

我的代码根据其pointType成功打印所有点,但未正确设置电路板颜色(仍为默认背景)。

以下是问题:

1)我应该如何正确设置背景?

2)我觉得我的代码没有正确使用JPanels / JFrames / Graphics,如果是这样的话,有关如何改进代码结构的任何建议吗?

2 个答案:

答案 0 :(得分:2)

使用paintComponent()代替paint()

public class Board extends JPanel{
     @Override
     public void paintComponent(Graphics g){
        super.paintComponent(g);
        ...
    }
}

欲了解更多信息,请查看以下帖子:

enter image description here

答案 1 :(得分:1)

paintComponent()中的默认JPanel方法使用JPanel实例变量中存储的背景颜色;但是,您重写的paintComponent()方法并未使用实例变量,因此使用setBackground()更改它不会做任何事情。

如果您想坚持覆盖paintComponent()方法,则应在JPanel方法中使用所需的颜色绘制一个填充paintComponent()整个区域的框。 / p>

paintComponent()的新Board方法如下所示:

@Override
public void paintComponent(Graphics g){
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;
    g2.setColor(Color.YELLOW);
    g2.fillRect(0, 0, getWidth(), getHeight()); // Fill in background

    // Do everything else
    for(int k =HEIGHT; k>=0; k--){
        for(int i=WIDTH; i>=0; i--){
            // call paint method for each points on board
            myBoard[i][k].print(g2);
        }
    }
}