为什么重新绘制()没有在摆动计时器中调用paintcomponent



当我在swing timer方法startTimer中使用paint((时,它只是不调用paintcomponent((。除了repaint((之外,所有东西都在timer方法内部工作。我是java的新手,所以如果有人能帮我解决这个问题或指出任何其他错误,我将不胜感激。谢谢

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Scanner;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
public class Board extends JPanel {
Timer timer;
int count;
int clockNumber;
@Override
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.fillRect(30, 30, 640, 640);//makes a black square
for(int i=30;i<=510; i+=160)//adds white columns
{
for(int j=30; j<=510; j+=160)
{
g.clearRect(i,  j,  80,  80);
}
}
for(int i=110; i<=590; i+=160)//adds black columns
{
for(int j=110; j<=590; j+=160)
{
g.clearRect(i, j, 80, 80);
}
}
g.setFont(new Font("Monospace", Font.BOLD, 30));
g.setColor(Color.WHITE);
g.drawString("a", 85, 660);
g.drawString("c", 245, 660);
g.drawString("e", 405, 660);
g.drawString("g", 565, 660);
g.drawString("7", 35, 140);
g.drawString("5", 35, 300);
g.drawString("3", 35, 460);
g.drawString("1", 35, 620);

g.setColor(Color.BLACK);
g.drawString("b", 165, 660);
g.drawString("d", 325, 660);
g.drawString("f", 485, 660);
g.drawString("h", 645, 660);
g.drawString("8", 35, 60);
g.drawString("6", 35, 220);
g.drawString("4", 35, 380);
g.drawString("2", 35, 540);
System.out.println(clockNumber);
g.drawString(String.valueOf(clockNumber), 300, 300);
}
public void showX(Graphics g)
{
g.setFont(new Font("wrongFont", Font.BOLD, 200)); 
g.setColor(Color.RED);
g.drawString("X", 35, 540);
}
public void boardImage()
{
JFrame frame=new JFrame();
frame.setSize(600, 600);
frame.getContentPane().add(new Board());
frame.setLocationRelativeTo(null);
frame.setBackground(Color.LIGHT_GRAY);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
CoordinateGame game=new CoordinateGame();
frame.addMouseListener(new MouseAdapter() 
{
public void mouseClicked(MouseEvent e) 
{
int x=e.getX();
int y=e.getY();

}
}); 
}
public int clockNumber()
{
return clockNumber;
}
public void startTimer(int seconds)
{
ActionListener action=new ActionListener()
{
public void actionPerformed(ActionEvent e) 
{
clockNumber=count;
if(count==0)
{
timer.stop();
}
else
{
System.out.println(count);
clockNumber--;
count--;
repaint();
}
}

};
timer=new Timer(1000, action);
timer.setInitialDelay(0);
timer.start();
count=seconds;
}   
}

由于您没有提供可运行的示例,我认为您正在做类似的事情

Board board=new Board();
board.boardImage();
board.startTimer();

问题出在boardImage((中,它创建了Board的一个新实例,并将该实例添加到JFrame,而不是启动计时器的原始board

所以更换

frame.getContentPane().add(new Board());

带有

frame.getContentPane().add(this);

还可以考虑删除框架上的显式setSize,并在自定义组件上添加覆盖getPreferredSize,然后使用frame.pack()根据板自动调整框架大小。

最新更新