我是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,如果是这样的话,有关如何改进代码结构的任何建议吗?
答案 0 :(得分:2)
使用paintComponent()
代替paint()
public class Board extends JPanel{
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
...
}
}
欲了解更多信息,请查看以下帖子:
答案 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);
}
}
}