Java JScrollpane nicht sichtbar

8

Ich versuche, eine Reihe von Schaltflächen in JScrollpane anzuzeigen. Als ich herumgelesen habe, habe ich es geschafft, mit diesem Code zu beenden, aber nichts wird angezeigt. Ich verstehe einen möglichen Fehler nicht. Danke für die Hilfe

Wie vorgeschlagen habe ich einige Änderungen vorgenommen, die ich bearbeitet habe, aber nicht funktioniert

BEARBEITET oder ich bin dumm, oder hier ist ein anderes Problem. Hier ist mein vollständiger Code mit dem Ausgabebild

%Vor%

    
user2847219 12.12.2017, 14:08
quelle

4 Antworten

3

Okay, aus Ihren Kommentaren in einer anderen Antwort:

  

Kein Problem beim Kompilieren, einfach ist das Jpanel leer. Die Schaltflächen werden nicht angezeigt.

Nach dem Aufruf von this.Avvio(); müssen Sie Folgendes aufrufen:

%Vor%

Dies erzeugt die folgenden Ausgaben (vor und nach der Größenänderung):

Aber es gibt immer noch kein JScrollPanel

Dies löst zumindest das erste Problem, allerdings haben Sie mehr Fehler in Ihrem Code, von denen einige bereits in anderen Antworten kommentiert wurden:

  1. Sie erweitern JFrame , dies wird nicht benötigt, da Sie eine JFrame instance / object erstellen und später verwenden können. Du änderst nie das Verhalten von JFrame und deshalb brauchst du es nicht zu erweitern. Siehe Erweitert JFrame vs. das Erstellen innerhalb des Programms für mehr Informationen dazu.

  2. Sie rufen nicht pack() oder setSize(...) auf, dies erzeugt ein kleines Fenster, das Sie manuell anpassen müssen. Rufen Sie pack() auf, bevor Sie JFrame sichtbar machen. (Wie am Anfang dieser Antwort vorgeschlagen).

  3. Sie rufen .invokeLater() method zweimal auf. Du musst es nur einmal anrufen, ich bevorzuge diesen Weg:

    %Vor%
  4. Sie rufen gridPanel.revalidate(); und gridPanel.repaint() auf, während es Ihr Programm nicht beeinflusst, es wird nicht benötigt, da Ihre GUI immer noch nicht sichtbar ist und diese Aufrufe keine Auswirkungen auf Ihr Programm haben, können Sie sicher entfernen sie.

  5. Sie erstellen ein neues GridBagConstraints -Objekt bei jeder Iteration der for -Schleife, Sie können einfach seine Eigenschaften darin ändern und es außerhalb der for -Schleife deklarieren, wodurch Ihr Programm besser wird .

Wenn Sie die obigen Empfehlungen befolgt haben, können Sie einen Code wie diesen erhalten:

%Vor%

Was diese Ausgabe noch produziert:

ABER ... Wir können es noch ein bisschen verbessern!

Wir können zwei verschachtelte for -Schleifen für die GridBagConstraints -Eigenschaften sowie die Generierung der Schaltflächen haben:

%Vor%

Und dieses Beispiel ist (meiner Meinung nach) einfacher zu lesen und zu verfolgen. Und dies ist die Ausgabe, die der obige Code erzeugt:

Sie können immer noch wählen, welchen Code Sie verwenden möchten, entweder indem Sie die Änderungen im ersten Teil dieser Antwort vornehmen, der zweite den obigen Empfehlungen folgt oder den letzten, der kürzer ist.

    
Frakcool 14.12.2017 18:29
quelle
2

Probleme festgestellt:

  • Avvio - das Fensterlayout wurde während jeder Schleife zurückgesetzt. Stellen Sie es einmal vor der Schleife ein.
  • Avvio - der Bereich wurde zum Rasterbereich in jeder Schleife hinzugefügt. Fügen Sie es nach der Schleife hinzu.
  • Avvio - die Einschränkungen platzieren die Schaltflächen an denselben Rasterpositionen. Wenn die beiden vorherigen Probleme behoben wurden, werden nur die letzten drei Schaltflächen angezeigt.

Ich gehe davon aus, dass Sie drei Knöpfe in einer Reihe haben wollen, also habe ich die Schleife geändert, um den Zähler als Zeilenzähler zu verwenden. Der folgende Code erstellt zehn Zeilen mit drei Schaltflächen.

Was erscheint:

%Vor%     
Michael McKay 14.12.2017 15:16
quelle
1

Es gibt mehrere Dinge zu tun, damit es funktioniert:

  1. Fügen Sie eine main Methode
  2. hinzu
  3. Diese Methode main ist der Einstiegspunkt. Dadurch wird sichergestellt, dass der Swing-Code im AWT-Thread ausgeführt wird. Dies ist die SwingUtilities.invokeLater für
  4. Instanziieren, verpacken und zeigen Sie den Rahmen an. Die Größeneinstellung dient nur zum Experimentieren mit dem Bildlauffeld
  5. Deklarieren Sie gridPanel als Instanzvariable
  6. wickle die gridPanel mit der scrollPane
  7. Optional, wickle die scrollPane mit der borderLayoutPanel
  8. Rufen Sie die Methode Avvio auf, da diese die Schaltflächen
  9. hinzufügt
  10. Fügen Sie dem Rahmen das äußerste Element hinzu

Hier ist der feste Code:

%Vor%     
Tamas Rev 12.12.2017 14:29
quelle
1

Ich habe das Programm vereinfacht und alle Fehler beseitigt und schlechte Praktiken. (Fehlendes Paket, unnötige Panels, Aufruf von invokeLater() zweimal und andere.)

Hier ist ein Arbeitsbeispiel:

%Vor%

Und das ist der Screenshot.

Und da ich GridBagLayout für sehr schlecht halte Layout-Manager, ich habe ein ähnliches Beispiel mit MigLayout erstellt Manager.

Wir brauchen die folgende Maven-Abhängigkeit für dieses Beispiel:

%Vor%

Die Quelle:

%Vor%     
Jan Bodnar 14.12.2017 16:18
quelle

Tags und Links