Lassen Sie uns Ihren Code für eine Sekunde dauern und @Override
zu Ihrem paintComponent
Methode hinzufügen ...
public class Game {
//...
@Override
public void paintComponent(Graphics g) {
panel.paintComponents(g);
g.setColor(Color.RED);
g.drawRect(100, 10, 30, 40);
g.fillRect(10, 10, 20, 10);
}
}
Und jetzt haben wir einen Compiler-Fehler! Dies liegt daran, Game
erweitert Object
und hat keine paintComponent
Methode. Dies bedeutet, dass die Methode von keinem Teil des vorhandenen Malsystems aufgerufen werden kann und daher nie aufgerufen wird.
Komponenten machen schlechte „Spiel“ Entitäten, sie haben eine Menge „Sanitär“ haben, die sie nicht sehr effizient für diese Art von Arbeit macht, sind Sie in der Regel besser, eine komplette kundenspezifische Malerei Route
hinunter
import javax.swing.*;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
public class Game {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Game().createGui();
}
});
}
JFrame window;
GamePanel panel;
int charPosX = 0;
int charPosY = 0;
public Boolean createGui() {
window = new JFrame("Game");
window.setSize(1000, 500);
window.setResizable(false);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panel = new GamePanel();
panel.setBackground(new Color(65, 130, 92));
window.add(panel);
window.setVisible(true);
return true; //returns true if ran and will be ran by check status in Main.
}
public class GamePanel extends JPanel {
private Rectangle entity = new Rectangle(100, 10, 30, 40);
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
g2d.setColor(Color.RED);
g2d.draw(entity);
g2d.setColor(Color.BLUE);
g2d.fill(entity);
g2d.dispose();
}
}
}
beachten sie auch, rief ich window.setVisible(true);
erst, nachdem ich die panel
zum window
hinzugefügt hatte, ist dies, weil Swing-faul, wenn es um das Hinzufügen/Entfernen von Komponenten kommt. Wenn Sie Komponenten hinzufügen oder entfernen möchten, nachdem die Benutzeroberfläche auf dem Bildschirm erkannt wurde, müssen Sie revalidate
und repaint
auf dem Container aufrufen, um ein Layout und einen Farbdurchlauf auszulösen. Beachten Sie auch, dass ein Unterschied besteht paintComponent
und paintComponents
;)
ich würde ein besseres Verständnis davon, wie Malerarbeiten zu gewinnen in Swing sehr empfehlen einen Blick auf Painting in AWT Swing und Performing Custom Painting hat und wie Sie die Vorteile davon
nehmen Sie sich diese Frage stellen, wer eigentlich ist Rufen Sie Ihre 'paintComponent' Methode auf? Fügen Sie Ihrer 'paintComponent'' 'Override' hinzu und sehen Sie, was das heißt – MadProgrammer
Shell, wir diskutieren auch, dass Ihr' Panel' keine definierbare Größe hat und auch keine untergeordneten Komponenten verwalten kann, die Sie hinzufügen könnten. Als generelle Empfehlung würde ich die Verwendung von Komponenten auf diese Weise vermeiden und die Funktionalität durch benutzerdefinierte Malansätze implementieren, da sie effizienter und weniger fehleranfällig ist. – MadProgrammer
Was meinen Sie mit benutzerdefinierten Ansätzen für das Malen? ???? – Blockeus