这是我面对游戏时遇到的一个问题。这是一款Tic-Tac-Toe用户和朋友可以一起玩的游戏。我还没有完成,但这就是我所拥有的。只要窗口被最小化或被另一个窗口覆盖,绘制的图形部分(X和O)就会被删除。我真的不知道如何处理这个问题,有一种方法可以让图形不被删除。我的主类的paintComponent()
方法只是设置了电路板的设计。
感谢任何帮助,谢谢!
private class DrawXO implements MouseListener {
public void mousePressed(MouseEvent evt) {
int x = evt.getX();
int y = evt.getY();
Graphics gContext = getGraphics();
Graphics2D graphics = (Graphics2D) gContext;
graphics.setStroke(new BasicStroke(8));
if (playerOneTurn) {
Player1.drawCircle(gContext, x, y );
checkForWinner();
if(playerOneWins) {
System.out.println("Player one wins");
}
playerTwoTurn = false;
} else {
// Still need to implement drawing for this ~
checkForWinner();
}
}
public void mouseExited(MouseEvent evt) {}
public void mouseEntered(MouseEvent evt) {}
public void mouseClicked(MouseEvent evt) {}
public void mouseReleased(MouseEvent evt) {}
}
答案 0 :(得分:1)
请勿使用getGraphics();
您需要了解如何在Swing中完成自定义绘画。浏览Performing Custom Painting。您会注意到,绘画需要使用paintComponent
方法(在JPanel
或JComponent
类中),其中包含Graphics
(已创建 > you)用于执行自定义绘制的上下文。所有绘画都应该在这种背景下完成。
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
// do painting here
}
注意:永远不要明确调用此方法,它会自动调用
要更新图形,您将对某些绘制变量进行一些更新,然后调用repaint()
。也许是这样的:
@Override
public void mousePressed(MouseEvent e) {
x = e.getX();
y = e.getY();
repaint();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
g2.fillRect(x, y, width, height);
}
如果要添加/绘制多个对象,比如单击鼠标,则保留List
个对象,并在paintComponent
方法中遍历列表。单击鼠标时,将另一个对象添加到列表并重新绘制。像
List<Rectangle2D> rectangles;
...
@Override
public void mousePressed(MouseEvent e) {
x = e.getX();
y = e.getY();
rectangles.add(new Rectangle2d.Double(x, y, width, height);
repaint();
}
...
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
for (Rectangle2D rect: rectangles) {
g2.fill(rect);
}
}