Почему repaint () не вызывает компонент paintcomponent в таймере поворота?

Когда я использую repaint () в методе startTimer таймера поворота, он просто не вызывает paintcomponent (). Внутри метода таймера работает все, кроме repaint (). Я новичок в 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;
    }   
}
# graphics swing repaint paint
Источник
  • 2
    (1-) Создание фрейма НЕ должно быть частью класса Board. Ваш метод main () должен создать JFrame и добавить компонент Board во фрейм. Я дал вам ссылку на учебник Swing по Custom Painting в вашем последнем вопросе: stackoverflow.com/q/67807288/131872 и заявил, что вы должны использовать рабочий код в качестве отправной точки, чтобы у вас был лучше структурированный код. Вы не следовали руководству, и у вас нет лучше структурированного кода. Вы НЕ ДОЛЖНЫ добавлять MouseListener во фрейм. Это НЕ то, что делает учебник. Прочтите учебник !!!
Codelisting
за 0 против

Поскольку вы не предоставили работоспособный пример, я должен предположить, что вы делаете что-то вроде

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() для автоматической настройки размера рамки на плату.

  • 0
    Боже, спасибо, брат
Codelisting
Популярные категории
На заметку программисту