#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);
}
}
}