Почему цвет фона не будет заполнен перекраской(e)?

#java #swing #repaint

Вопрос:

Поэтому я не уверен, в чем проблема с методом перекраски. Он не будет заполнять новый цвет фона. Похоже, он не распечатывает текст в этом методе всякий раз, когда я пытался его отладить. У меня есть 3 класса: интерфейс игры, Визуализатор и настройка перерисовки. Конфигурация RepaintConfiguration расширяется из класса GameInterface и реализует ActionListener.

 public class GameInterface {

public static GameInterface gameInterface;   

public static JFrame jframe;

private String title;

private Container container;

public GameInterface() {
    gameInterface = this;
    jframe = new JFrame();
    jframe.setSize(1500, 800);
    jframe.setResizable(false);
    jframe.setTitle("Jetpack");
   
    jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    jframe.setVisible(true);
  } 
}
   

public class Renderer extends JPanel {

  
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        RepaintConfiguration.repaintConfiguration.repaint(g);
      }
}


public class RepaintConfiguration extends GameInterface implements ActionListener
{

    public static RepaintConfiguration repaintConfiguration;
    public static Renderer renderer;
   
    public static GameInterface gameInterface;
    

    public RepaintConfiguration() {
        super();
        repaintConfiguration = this;
        renderer = new Renderer();
        super.jframe.add(renderer);
   
        
        
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        renderer.repaint();
    }
    
    
    
    public void repaint(Graphics g) {
        g.setColor(Color.red);
        g.fillRect(0, 0, 1500, 800);
    }

    
}
 

Комментарии:

1. Попробуйте использовать JFrame.setBackground(Color) или JPanel.setBackground(Color) в зависимости от того, что вы хотите сделать.

2. Я понятия не имею, почему код такой сложный. Просто выполните рендеринг игры в методе paintComponent() вашей панели визуализации. Прочитайте учебник Swing по пользовательской живописи для простых примеров.

3. У вас очень сложный процесс инициализации, но я замечаю одну вещь: панель «Визуализатор» добавляется в кадр после его отображения. Это означает, что вам необходимо повторно проверить и перекрасить рамку, прежде чем будут показаны изменения.

4. Вы могли бы значительно упростить этот рабочий процесс за счет использования делегирования — и гораздо меньше полагаться на static

Ответ №1:

Мне удалось скомпилировать и запустить ваш код. Публичные классы должны быть внутренними классами.

Я добавил main метод. Я добавил вызов SwingUtilities invokeLater метода. Этот метод гарантирует, что компоненты Swing создаются и выполняются в потоке отправки событий.

Я переупорядочил JFrame вызовы методов. JFrame Методы должны вызываться в определенном порядке. Это порядок, который я использую для всех своих приложений Swing.

Вы не определяете размер JFrame . Вы определяете размер рисунка JPanel . В JFrame комплект входят украшения, которые занимают некоторое пространство.

Я оставил твой запутанный код для рисования. У вас возникнут большие трудности с расширением этого кода для реального создания игры.

Вот полный исполняемый код.

 import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class GameInterface {

    private JFrame jframe;

    private Renderer renderer;

    private RepaintConfiguration repaintConfiguration;
    
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new GameInterface();
            }
        });
    }

    public GameInterface() {
        this.repaintConfiguration = new RepaintConfiguration(this);

        jframe = new JFrame();
        jframe.setTitle("Jetpack");
        jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jframe.setResizable(false);

        this.renderer = new Renderer(repaintConfiguration);
        jframe.add(renderer, BorderLayout.CENTER);

        jframe.pack();
        jframe.setLocationByPlatform(true);
        jframe.setVisible(true);
    }

    public Renderer getRenderer() {
        return renderer;
    }

    public class Renderer extends JPanel {

        private static final long serialVersionUID = 1L;
        
        private RepaintConfiguration repaintConfiguration;

        public Renderer(RepaintConfiguration repaintConfiguration) {
            this.repaintConfiguration = repaintConfiguration;
            this.setPreferredSize(new Dimension(1500, 800));
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            repaintConfiguration.repaint(g);
        }
    }

    public class RepaintConfiguration implements ActionListener {

        private GameInterface gameInterface;

        public RepaintConfiguration(GameInterface gameInterface) {
            this.gameInterface = gameInterface;
        }

        @Override
        public void actionPerformed(ActionEvent event) {
            gameInterface.getRenderer().repaint();
        }

        public void repaint(Graphics g) {
            g.setColor(Color.red);
            g.fillRect(0, 0, 1500, 800);
        }

    }

}