2011-01-09 8 views
0

Ich habe eine sehr einfache JTabbedPane erstellt, indem ich zuerst ein leeres JTabbedPane-Objekt erstellt habe, dann 2 JPanels, die ich später hinzufüge. Jedes JPanel hält ein Objekt, das JButton erweitert und MouseListener implementiert. Jeder von diesen enthält ein anderes Bild, das aus einer Datei geladen wird. Das Bild wird lokal als gepuffertes Bild und als Bildsymbol usw. gehalten, was alles gut funktioniert. Der Sinn von all dem ist es, die Größe des Bildes zu ändern, wenn die Größe der Schaltfläche geändert wird (mit GetscaledInstance()), weil die Größe des Panels geändert wird, weil JTabbedPane in der Größe des JFrame geändert wird. Ich überschreibe paintComponent(), um dies in der Klasse zu erreichen, die JButton erweitert. Ich benutze MigLayout Manager, und alles ist gut auf dieser Vorderseite Kontrolle Layout Einschränkungen, wachsen, Füllung, Anfangsgrößen, bevorzugte Größen, etc. Die Bilder, die die Tasten haben unterschiedliche Größen und Proportionen, aber dies verursachte keine Probleme vorher.JTabbedPane: nur die erste Registerkarte wird gezeichnet, die zweite ist immer leer (Neuling Q)

Bis vor 2 Tagen hat alles gut geklappt. Ich habe einige Änderungen vorgenommen, um einige Probleme mit der Größenänderung zu beheben, als ich den MigLayout-Manager abholte. Zu der Zeit spielte ich herum mit der Einstellung verschiedener Min-, Max- und Preferred-Größen unter Verwendung der von den Komponenten bereitgestellten Methoden, nicht des Layout-Managers. Ich habe auch ein wenig mit pack(), validate(), visible(), opaque() usw. getäuscht, und ja, ich habe den Artikel über Swing und AWT-Malerei hier gelesen: , und ich habe mich immer mehr auf MigLayout verlassen. Zu einem nicht verwandten Hinweis scheint es, dass JFrames Maxsize nicht honoriert.

Irgendwie, heute, mit und ohne die Verwendung dieser Methoden von swing, mit oder ohne MigLayout-Manager verwenden, um einige dieser Fragen statt, habe ich jetzt eine JTabbedPane, die korrekt die erste JPanel ich hinzufügen, aber nicht angezeigt Das zweite JPanel - das, obwohl es als Tab vorhanden ist, wird nicht angezeigt, wenn ausgewählt. Ich habe die Reihenfolge, in der das Feld zuerst hinzugefügt wird, geändert, und dies gilt immer noch, unabhängig davon, welches JPanel ich zuerst hinzufüge, und mir sagen, dass die JPanels in Ordnung sind, und das Problem liegt höchstwahrscheinlich im JTabbedPane. Ich klicke auf die zweite Registerkarte, die JTabbedPane-Schalter, aber ich habe eine scheinbar leere Schaltfläche im JPanel. Einige Konsolen-Systemout-Anweisungen zeigen Folgendes an: a) dass das zweite Panel und seine Schaltfläche erstellt werden b) keine Mausereignisse erfasst werden, wenn ich auf die Stelle klicke, an der sich das zweite Panel und die Schaltfläche befinden sollten, als ob sie nicht vorhanden wäre an diesem Punkt; c) Wenn ich auf die zweite Registerkarte wechsle, wird die überlagerte paintComponent() -Methode der Schaltfläche innerhalb dieser zweiten JPanel nie aufgerufen, so dass sie tatsächlich nicht gezeichnet wird, obwohl die Registerkarte, in der sie sich befindet, sichtbar wird; d) das JTabbpedPane getComponentCount() gibt nach dem Hinzufügen des zweiten Panels einen korrekten Wert von 2 zurück; e) MigLayout Manager tatsächlich rockt, aber ich schweife ab ...

Ich kann jetzt nicht zu meinem älteren Code zurückkehren, und trotz meiner besten Bemühungen, die Änderungen rückgängig zu machen, die dies verursacht, kann ich mein neues Problem nicht beheben. Ich habe alles außer den wichtigsten Aufrufen auskommentiert: Konstruktoren für jedes Objekt - mit MigLayout; add() zum Platzieren der Schaltflächen in den Panels mit String-Argumenten, die für MigLayout geeignet sind; add() zum Platzieren der Panels auf dem JTabbedPane, auch mit MigLayout String-Argumenten; Festlegen des Standardoperators für den JFrame; und Einstellen des JFrame sichtbar. Das bedeutet, dass ich mich nicht mit Optimierungseinstellungen, Doppelpufferungseinstellungen und undurchsichtigen Einstellungen beschäftige, sondern sie als Standard belasse und immer noch nicht fixiere; Das zweite Panel wird nicht angezeigt. Jedes Panel, das ich hinzufügen sollte, wenn es das erste ist, das geladen wird, funktioniert gut und bekräftigt erneut, dass die Panels und Buttons selbst in Ordnung sind.

Hier ist Teil dessen, was ich tue:

//Note: BuildaButton is a class that merely constructs my instances 
File f = new File("/foo.jpg"); 
button1 = new BuildaButton().BuildaButton(f).buildfoo1Button(); 

f = new File("/foo2.jpg"); 
button2 = new BuildaButton().BuildaButton(f).buildfoo2Button(); 

MigLayout ml = new MigLayout("wrap 1", "[fill, grow]0[fill, grow]", 
    "[fill, grow]0[fill, grow]"); 
MigLayout ml2 = new MigLayout("wrap 2", "[fill, grow]5[fill, grow]", 
"[fill, grow]0[fill, grow]"); 

foo1panel = new JPanel(ml); 
foo1panel.add(button1, "w 234:945:, h 200:807:"); 

foo2panel = new JPanel(ml); 
foo2panel.add(button2, "w 186:752:, h 200:807:"); 



tabs.add("foo1", foo1panel); 
tabs.add("foo2", foo2panel); 
System.out.println("contents of tabs: " + tabs.getComponentCount() + " elements"); 
mainframe.setLayout(ml2); 
mainframe.setMinimumSize(new Dimension(850,800)); 
mainframe.add(tabs, "w 600:800:, h 780:780:"); 
//controlpanel is a still blank jpanel that holds nothing--it is a space holder for now & will be utilized 
mainframe.add(controlpanel, "w 200:200:200, h 780:780:"); 
mainframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
mainframe.setVisible(true); 

Danke im Voraus für jede Hilfe können Sie geben.

Antwort

2

Sie können nicht dieselbe Layoutinstanz auf verschiedenen Panels verwenden. Erstellen Sie einfach eine zweite Instanz des Layouts genau so wie ml und stellen Sie diese auf dem zweiten Panel ein:

... 
MigLayout ml = new MigLayout("wrap 1", "[fill, grow]0[fill, grow]", 
    "[fill, grow]0[fill, grow]"); 
MigLayout mla = new MigLayout("wrap 1", "[fill, grow]0[fill, grow]", 
    "[fill, grow]0[fill, grow]"); 
MigLayout ml2 = new MigLayout("wrap 2", "[fill, grow]5[fill, grow]", 
"[fill, grow]0[fill, grow]"); 

BorderLayout test = new BorderLayout(5,5); 

foo1panel = new JPanel(ml); 
foo1panel.add(button1, "w 234:945:, h 200:807:"); 

foo2panel = new JPanel(mla); 
foo2panel.add(button2, "w 186:752:, h 200:807:"); 
... 
Verwandte Themen