2016-04-27 12 views
1

Ich bin neu in Java GUI-Programmierung. Ich habe eine JFrame erstellt. In diesem JFrame habe ich eine JPanel erstellt. Innerhalb dieser JPanel habe ich eine andere JPanel erstellt (nennen wir es "A").Ich kann unter JPanel in JPanel in JFrame nicht sehen

Ich habe in "A" ein Rechteck gezeichnet und wollte Schaltflächen mit Grafiken erstellen. Es gibt kein Rechteck in meiner GUI. Ich konnte sehen, dass die paintComponent() Methode in "A" nicht aufgerufen wird.

Code: Die JPanels: (das Kind JPanel ist innere Klasse)

public class MemoryPanel extends JPanel { 

    public MemoryPanel(){ 
     setPreferredSize(new Dimension(350,448)); 
    } 

    @Override 
    public void paintComponent(Graphics g) {  
     //POSITIONING 
     setLayout(new BorderLayout()); 

     //CREATE MEMORY BUTTONS 
     MemButton a=new MemButton(); 

     //Drawing Rectangles for Memory 
     add(a,BorderLayout.CENTER); 

    } 



    private class MemoryButton extends JPanel{ 
     public MemoryButton(){ 
      setLayout(null); 
      setPreferredSize(new Dimension(87,40)); 
     } 

     @Override 
     public void paintComponent(Graphics g){ 
      Graphics2D td= (Graphics2D)g; 
      td.drawRect(0, 0, 20, 20); 
     } 
    } 
} 

EDIT: bedankt sich bei allen, ich hatte ein anderes Paket, das in ihm mit der gleichen Klassennamen für das Problem verursacht. Es scheint, als ob es jetzt funktioniert.

+1

1) Die 'paintComponent' Methode sollte zum Zeichnen von Grafiken verwendet werden, nicht zum Erstellen und Hinzufügen von Komponenten. Mach das im Konstruktor. 2) Wenn Sie die Schaltfläche zu "BorderLayout.CENTER" hinzufügen, wird 'setPreferredSize' nicht das tun, was Sie erwarten. Die Schaltfläche belegt den gesamten verfügbaren Speicherplatz. 3) Vergiss nicht 'super.paintComponent() 'am Anfang der' paintComponent' Methode zu nennen. Ist "MemButton" genauso wie "MemoryButton"? - Bitte denken Sie daran, ein [mcve] zu veröffentlichen, das das Problem reproduziert. –

Antwort

1

Ich habe eine einfache GUI gemacht, um Ihren Code zu testen und das Rechteck erscheint korrekt. Ich habe in dem von Ihnen geposteten Code keine relevanten Änderungen vorgenommen.

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

public class SimpleJFrameProgram extends JFrame { 
    private static final long serialVersionUID = 1L; 

    public SimpleJFrameProgram() { 
     super("TEST"); 

     initComponents(); 

     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.pack(); 
     this.setLocationRelativeTo(null); 
     this.setVisible(true); 
    } 


    private void initComponents() { 
     MemoryPanel memoryPanel = new MemoryPanel(); 

     this.add(memoryPanel); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        new SimpleJFrameProgram(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 
} 

Ich habe applyed kleinere Änderungen an Ihrer MemoryPanel: ersetzt MemButton durch Ihre MemoryButton und füllen Sie das Rechteck in rot die Sichtbarkeit für den Test zu verbessern. Ohne diese letzte Änderung erscheint auch das Rechteck.

import java.awt.BorderLayout; 
    import java.awt.Color; 
    import java.awt.Dimension; 
    import java.awt.Graphics; 
    import java.awt.Graphics2D; 

    import javax.swing.JPanel; 

    public class MemoryPanel extends JPanel { 

    public MemoryPanel(){ 
     setPreferredSize(new Dimension(350,448)); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     // POSITIONING 
     setLayout(new BorderLayout()); 

     // CREATE MEMORY BUTTONS 
     MemoryButton a = new MemoryButton(); 

     // Drawing Rectangles for Memory 
     add(a,BorderLayout.CENTER); 

    } 

    private class MemoryButton extends JPanel{ 
     public MemoryButton(){ 
      setLayout(null); 
      setPreferredSize(new Dimension(87,40)); 
     } 

     @Override 
     public void paintComponent(Graphics g) { 

      Graphics2D td = (Graphics2D) g; 
      td.setColor(Color.red); 
      td.fillRect(0, 0, 20, 20); 
     } 
    } 
} 

Dies ist das erhaltene Ergebnis:

enter image description here

Vielleicht ist Ihr Problem auf die Initialisierung der Eltern JFrame befindet.

+1

Danke, ich habe das Problem gefunden. Ich hatte ein anderes Paket im selben Projekt mit dem Namen "MemButton und das von dort initialisierte Objekt". – ALUFTW

2

Sie sollten die JButtons zuerst programmieren, damit Ihre Grafiken als Schaltflächen funktionieren. Ich glaube dieser Beitrag wird Ihnen dabei helfen:

Creating a custom button in Java

ich Sie ein Rechteck wollen, dass der Hintergrund für Ihre Tasten werden Sie es in Ihrem Hauptfeld ziehen kann und die Tasten auf hinzufügen. Verwenden Sie verschiedene Layouts, um eine bestimmte Reihenfolge einzuhalten.