2017-04-02 1 views
0

Warum wird JPanel (Panel) nicht auf den grünen Hintergrund (das jpanel) gezeichnet? Ich möchte in der Lage sein, dies zu tun, ohne j-Panel zu erweitern ...Warum wird JPanel (Panel) nicht auf den grünen Hintergrund (das jpanel) gezeichnet?

Darüber hinaus sollte ich für Java-Spiele Keybindings oder Keylistener in Java verwenden.

import javax.swing.*; 
import java.awt.event.*; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 

public class Game { 

JFrame window; 
JPanel 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); 
    window.setVisible(true); 

    panel = new JPanel(); 
    panel.setVisible(true); 
    panel.setLayout(null);; 
    panel.setBackground(new Color(65,130,92)); 

    window.add(panel); 

    return true; //returns true if ran and will be ran by check status in Main. 
} 

public void paintComponent(Graphics g) { 
    panel.paintComponents(g); 
    g.setColor(Color.RED); 
    g.drawRect(100,10,30,40); 
    g.fillRect(10, 10, 20, 10); 
} 



} 
+0

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

+1

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

+0

Was meinen Sie mit benutzerdefinierten Ansätzen für das Malen? ???? – Blockeus

Antwort

1

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

Example

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

+0

ok .. Danke! sehr viel – Blockeus

+0

btw ich versuche, dies zu tun, damit ich ein Spiel in der Schule oder etwas idk spielen kann. – Blockeus

+0

warten was ist GamePanel von. ???? Auch wenn Sie das Jpanel (Gamepanel idk, was es ist) erstellt haben, aber bereits erweitert JPanel – Blockeus