2016-06-07 7 views
-1
public void display() { 

    pan.repaint(); 
    fen.add(pan); 
    fen.addKeyListener(this); 
    fen.setResizable(false); 
    fen.setTitle("Le Jeu 2D"); 
    img.setText("Coucou"); 
    pan.add(img); 
    pan.repaint(); 
    pan.setBackground(Color.yellow); 
    fen.setVisible(true); 
    fen.setSize(480, 272); 
    pan.repaint(); 
    fen.revalidate(); 

} 

public void paintComponent(Graphics g) { 

    System.out.println("zzz"); 
    pan.paint(g); 
    g.setColor(Color.red); 
    g.drawRect(10, 10, 10, 10); 
} 

Es zeichnet nichts. Warum? Ich habe die Farbkomponentenmethode definiert, deshalb verstehe ich nicht warum. Edit: Ich bearbeitet meinen Code, bitte werfen Sie einen BlickWarum kann ich kein JPanel einzeichnen?

+0

ok aber das gleiche, es funktioniert nicht –

+0

Warum erstellen Sie einen JFrame innerhalb des JPanel in erster Linie? –

Antwort

1

Sie erstellen nie eine Instanz der Game Klasse und Sie fügen nie die Game Klasse in den Rahmen. Selbst wenn Sie eine Instanz erstellen würden, wäre die Größe immer noch (0, 0), also würde es nichts zu malen geben.

Grundsätzlich ist die gesamte Struktur Ihres Codes falsch.

Ich schlage vor, Sie beginnen neu und beginnen mit dem Demo-Code im Swing-Tutorial auf Custom Painting gefunden.

+0

Sie wissen das nicht. vielleicht ist es nicht sein kompletter Quellcode .. aber du hast Recht .. etwas ist aus .. warum erstelle ich eine JFrame Instanz innerhalb des JPanels. Sollte andersherum sein. –

+0

Ich habe meinen Code bearbeitet, werfen Sie einen Blick –

+0

@ JohnData, die Bearbeitung Ihres Codes wird nicht helfen. Basierend auf dem angegebenen Code ist die gesamte Struktur Ihres Codes falsch. Es gibt keine Abkürzungen, um Swing zu lernen. Lesen Sie das Tutorial. Laden Sie den Arbeitscode herunter. Nehmen Sie sich Zeit, um den Demo-Code zu verstehen. Dann modifiziere den Code. Es ist einfacher, mit gut strukturiertem Code zu beginnen und Änderungen vorzunehmen. – camickr

2

Sie erstellen keine Instanz Ihrer Game Klasse und fügen sie nicht zur JFrame hinzu. Hier

ist der Spielkonsole, die Sie malen auf:

Game.java

public class Game extends JPanel { 
    @Override 
    public final void paintComponent(final Graphics g) { 
     super.paintComponent(g); 
     g.setColor(Color.red); 
     g.drawRect(10, 10, 10, 10); 
    } 

    @Override 
    public Dimension getMinimumSize() { 
     return new Dimension(300, 300); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(300, 300); 
    } 

    @Override 
    public Dimension getMaximumSize() { 
     return new Dimension(300, 300); 
    } 
} 

Sie brauchen dann eine Instanz dieses Spiel Panel zu erstellen, und fügen Sie Ihre JFrame:

GameFrame.java

public class GameFrame extends JFrame { 
    public GameFrame() { 
     setLocationRelativeTo(null); 
     setResizable(false); 
     setTitle("2D Game"); 
     Game game = new Game(); 
     setContentPane(game); 
     pack(); 
     setVisible(true); 
    } 
} 

Dann, wenn Sie eine Instanz des JFrame erstellen:

Example.java

public class Example { 
    public static void main(String[] args) { 
     new GameFrame(); 
    } 
} 

Das Panel hinzugefügt werden, und gemalt:

enter image description here

+0

minimales, sauberes, lauffähiges Beispiel, das den Punkt veranschaulicht und nichts mehr! ich mag das. eigentlich wollte ich das selbe machen aber du warst schneller :) –

+0

Du solltest die Größe des Frames nicht einstellen. Jede Swing-Komponente sollte für die Bestimmung ihrer eigenen bevorzugten Größe verantwortlich sein. Also sollte die Spielklasse ihre eigene Größe bestimmen.Das Swing-Tutorial zeigt, wie dies gemacht werden kann. – camickr

+0

@camickr korrigiert, danke – explv

-1

Die Grundstruktur deines Codes scheint seltsam. Sie könnten einen JFrame in Ihrer Hauptsteuerklasse instanziieren, dh. Es sollte in diesem Fall GAME-Klasse sein. Dann können Sie eine neue JPanel-Klasse erstellen und ihr Objekt in das JPanel-Objekt einfügen. Innerhalb der JPanel-Klasse können Sie alle benötigten Elemente erstellen und entsprechende Parameter festlegen. Sie können den Ereignis-Listener auch in einer inneren Klasse oder einer separaten Klasse hinzufügen.

Verwandte Themen