Divider zentrieren bei Gui Start

Status
Nicht offen für weitere Antworten.

tokitok

Mitglied
Hallo,

ich habe eine JSplitPane, dessen Divider immer in der Mitte sein soll.

Mit einem HierarchyBoundsListener funktioniert das auch ganz gut, sobald der Benutzer JFrame verändert.

Nur beim Start der GUI hängt der Divider ganz links. In der init Methode bleibt der Befehl setDividerLocation(0.5) ohne Wirkung. Ich denke das liegt daran, dass die Größe des JSplitPanes erst später steht.

Kann mir da jemand helfen?

Gruß,
To
 

tokitok

Mitglied
Code:
Runnable runnable = new Runnable(){
		   public void run() {
			   splitPan.setDividerLocation(0.5);			   
		   }
	   };
	   javax.swing.SwingUtilities.invokeLater(runnable);

Das hat das Problem leider nicht behoben..
 

tokitok

Mitglied
hatte ich nicht.

Aber jetzt starte ich die GUI auch über SwingUtilities.invokeLater

Das Problem ist aber leider immer noch dasselbe..
 

André Uhres

Top Contributor
Du musst dich wohl irren, denn wenn wir die GUI Initialisierung und Sichtbarmachung auf den EventDispatchThread schicken, und danach setDividerLocation, dann haben wir threadsicher programmiert. Du machst einfach ein kurzes, selbständiges und kompilierbares Beispiel, um es selbst zu sehen.
 

Ebenius

Top Contributor
tokitok, kannst Du mal testweise die beiden Komponenten von dem SplitPane runter nehmen und statt dessen new JButton("button1"); und new JButton("button2"); auf das SplitPane setzen? Passiert dann das gleiche Problem?

Ich habe nur den ganz leisen Verdacht, dass es irgendwas mit preferred sizes oder minimum sizes oder sowas zu tun hat. Hab zwar schon lange kein SplitPane mehr verwendet, aber ich erinnere mich daran, dass diese Komponente als weniger gelungen bezeichnet werden muss.

Ebenius
 

André Uhres

Top Contributor
Splitpane respektiert in der Regel immer die "divider location" beim Startup.
Aber sobald der Benutzer den Divider verschiebt, kann es sein,
daß es nicht mehr möglich ist, zu der programmatisch angegebenen Position zurückzuschieben
(wegen der Grösse der enthaltenen Komponenten).
 

Ebenius

Top Contributor
Unsinn. Guckst Du:
Code:
final JSplitPane splitPane = new JSplitPane();
splitPane.setPreferredSize(new Dimension(400, 400));
splitPane.setLeftComponent(new JButton());
splitPane.setRightComponent(new JButton());
splitPane.setDividerLocation(0.5);

final JFrame f = new JFrame("Transparent Text Pane");
f.setContentPane(splitPane);
f.pack();
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.setVisible(true);

splitPane.png


// EDIT: Die API-Doc sagt dazu übrigens:
This method immediately changes the size of the split pane based on its current size. If the split pane is not correctly realized and on screen, this method will have no effect (new divider location will become (current size * proportionalLocation) which is 0).

tokitok, probier doch mal, ob setResizeWeight(0.5) Dich schon weiter bringt.

Ebenius
 

Ebenius

Top Contributor
André, ich entwickle seit 7 Jahren beinahe täglich Swing-GUIs beruflich. Natürlich habe ich setDividerLocation auch im EventListenerThread probiert, bevor ich gepostet habe. Das hilft nix. Es sei denn man fügt ...
Code:
SwingUtilities.invokeLater(new Runnable() {
  public void run() {
    splitPane.setDividerLocation(0.5);
  }
}
... so ein, dass das SplitPane bereits displayable und visible ist, wenn setDividerLocation(0.5) aufgerufen wird.

Konkret heißt das in meinem Code-Beispiel, dass es nicht funktioniert, wenn ich den Code-Block in Zeile 2-7 einfüge. Wenn ich ihn in Zeile >8 einfüge klappts. Woran das liegt liest Du in oben erwähnter API-Doc nach.

//EDIT:
Splitpane respektiert in der Regel immer die "divider location" beim Startup.

Und genau dieser Ausspruch ist Unsinn, wenn Du in die API-Doc guckst!

Ebenius
 

Ebenius

Top Contributor
Oh, Du meinst mit "Sichtbarmachung" nicht "setVisible()" (was ja sichtbar heißt), sondern "isShowing() == true"? Bist Du sicher, dass der Thread Opener das so verstanden hat? Ich verstand das so nicht. Sorry. :)
 

André Uhres

Top Contributor
Selbstverständlich meinte ich mit 'Sichtbarmachung' "setVisible(true)" (eine andere Möglichkeit gibt es auch nicht).
 

Ebenius

Top Contributor
Damn it, wir reden aneinander vorbei. :) Egal.

tokitok, das SplitPane muss angezeigt werden (isShowing == true), wenn man setDividerLocation() benutzt. Entweder baust Du Deine GUI so auf, dass erst das Fenster sichtbar gemacht wird und danach setDividerLocation() für das SplitPane benutzt wird. Oder Du nutzt set setResizeWeight(double), sofern das für Dich passt.

Ebenius
 

André Uhres

Top Contributor
Ebenius hat gesagt.:
wir reden aneinander vorbei
Nimm einfach den Code oben von tokitok und bau ihn ein, etwa so:
Code:
/*
 * SwingBasicDemo.java
 */

import java.awt.*;
import javax.swing.*;

public class SwingBasicDemo extends JFrame {

    private javax.swing.JSplitPane splitPan;

    public SwingBasicDemo() {
        initComponents();
        Runnable runnable = new Runnable() {

            public void run() {
                splitPan.setDividerLocation(0.5);
            }
        };
        javax.swing.SwingUtilities.invokeLater(runnable);
    }

    private void initComponents() {
        splitPan = new JSplitPane();
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        splitPan.setPreferredSize(new Dimension(400, 300));
        getContentPane().add(splitPan, BorderLayout.CENTER);
        pack();
    }

    public static void main(final String[] args) {
        Runnable gui = new Runnable() {

            @Override
            public void run() {
                new SwingBasicDemo().setVisible(true);
            }
        };
        //GUI must start on EventDispatchThread:
        SwingUtilities.invokeLater(gui);
    }
}
 

tokitok

Mitglied
Hallo,

also, ich habe jetzt dank Eurer Informationen was hinbekommen, das funktioniert.
Das SplitPane ist auf einem Panel, welches erst angezeigt wird, nach dem ein bestimmter button gedrückt wurde. Also zentriere ich einfach danach den Divider und schon funktionierts.
Allerdings habe ich das jetzt aus der aufrufenden Klasse heraus gemacht, nicht im meinem "ComparePanel" = SplitPane, was ich etwas unschön finde..

Danke Euch,
To
 

tokitok

Mitglied
Nö, das hat leider auch nichts gebracht.

Kann man denn nicht einen Event abfangen der eintritt, wenn die Komponente Visible wird?
 

Ebenius

Top Contributor
Hab noch ein bisschen rumprobiert. Das da funktioniert, wenn das SplitPane tatsächlich in der GUI die richtige Größe bekommt (hängt also von den Layout Managern der Parent Panels ab):
Code:
final JSplitPane splitPane = new JSplitPane();
splitPane.setLeftComponent(new JButton("Extra extra huge"));
splitPane.setRightComponent(new JButton("small"));
splitPane.setPreferredSize(new Dimension(400, 400));
splitPane.setSize(new Dimension(400, 400));
splitPane.setDividerLocation(0.5);
splitPane.validate();

JFrame.setDefaultLookAndFeelDecorated(true);
final JFrame f = new JFrame("Split Pane Fun");
f.setContentPane(splitPane);
f.pack();
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.setVisible(true);

Ebenius
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J SplitPane Aussehen des Divider verändern AWT, Swing, JavaFX & SWT 7
L JSplitPane Divider Location beim Maximieren AWT, Swing, JavaFX & SWT 6
C JSplitPane Divider fixieren AWT, Swing, JavaFX & SWT 2
M JSplitPane Divider setzen? AWT, Swing, JavaFX & SWT 3
S Splitpane - Divider fix? AWT, Swing, JavaFX & SWT 2
MiMa Optimieren einer Methode zum Zentrieren von Fenstern AWT, Swing, JavaFX & SWT 0
Hatsi09 Kinofilm zentrieren AWT, Swing, JavaFX & SWT 3
MrSnake Zahlen in Tabellenzelle zentrieren AWT, Swing, JavaFX & SWT 3
S JavaFX MenuItem in hoher (height größer) MenuBar vertikal zentrieren AWT, Swing, JavaFX & SWT 4
OlafHD JLabel im JFrame Zentrieren AWT, Swing, JavaFX & SWT 2
stylegangsta JLabel anzuzeigenden Text zentrieren AWT, Swing, JavaFX & SWT 9
V Anwendung im Vollbild zentrieren AWT, Swing, JavaFX & SWT 13
M Swing Jtable zellen zentrieren AWT, Swing, JavaFX & SWT 4
H Gif Animationen zentrieren AWT, Swing, JavaFX & SWT 9
P Rectangle on JPanel zentrieren AWT, Swing, JavaFX & SWT 20
C jPanel auf jScrollPane zentrieren AWT, Swing, JavaFX & SWT 3
reibi SWT Bild auf Composite zentrieren AWT, Swing, JavaFX & SWT 7
U Elemente im Panel zentrieren mit GridLayout AWT, Swing, JavaFX & SWT 3
B 2D-Grafik Text in einem Kreis zentrieren AWT, Swing, JavaFX & SWT 3
S Swing Component vertikal und hochizontal zentrieren? AWT, Swing, JavaFX & SWT 5
T Text in JTextPane vertikal (!) zentrieren AWT, Swing, JavaFX & SWT 4
D JTabbedPane zentrieren AWT, Swing, JavaFX & SWT 2
N JPanel vertikal im BorderLayout zentrieren AWT, Swing, JavaFX & SWT 2
B setTitle() Titel zentrieren AWT, Swing, JavaFX & SWT 7
K Panel zentrieren AWT, Swing, JavaFX & SWT 10
D Swing JScrollbar zentrieren AWT, Swing, JavaFX & SWT 3
Y JTable Zelleninhalt zentrieren AWT, Swing, JavaFX & SWT 2
hdi SWT Label Text vertikal zentrieren AWT, Swing, JavaFX & SWT 6
J Bilder in JScrollPane zentrieren AWT, Swing, JavaFX & SWT 5
C Swing Text vertikal zentrieren??? AWT, Swing, JavaFX & SWT 3
G Zentrieren mittels setLocationRelativeTo(null);? AWT, Swing, JavaFX & SWT 14
K Mainframe zentrieren AWT, Swing, JavaFX & SWT 4
DeeDee0815 SWT Label horizontal und vertikal zentrieren AWT, Swing, JavaFX & SWT 7
G BorderLayout - zentrieren AWT, Swing, JavaFX & SWT 1
M JSplitPane ein JPanel hinzufügen und zentrieren. AWT, Swing, JavaFX & SWT 9
M Makierten Text in JTextPane zentrieren AWT, Swing, JavaFX & SWT 2
G JScrollpage: Viewport beim Zoomen immer relative zentrieren AWT, Swing, JavaFX & SWT 5
S Text in einem JLabel zentrieren AWT, Swing, JavaFX & SWT 4
F [SWT] Buttons vertikal zentrieren AWT, Swing, JavaFX & SWT 7
Noar Infofenster zentrieren und HTML-formatierten Text readonly a AWT, Swing, JavaFX & SWT 7
A Zentrieren von drawstring() in einem fillRect() AWT, Swing, JavaFX & SWT 3
W jInternal Frame Zentrieren AWT, Swing, JavaFX & SWT 10
L JTable - zentrieren AWT, Swing, JavaFX & SWT 7
V JTable: Spalteninhalt zentrieren AWT, Swing, JavaFX & SWT 2
K JInternalFrame: internes Fenster zentrieren AWT, Swing, JavaFX & SWT 2
G Text zentrieren in einem JTextField ? AWT, Swing, JavaFX & SWT 2
L Programmfenster zentrieren . AWT, Swing, JavaFX & SWT 5
S Fenster zentrieren AWT, Swing, JavaFX & SWT 11
M Frame zentrieren AWT, Swing, JavaFX & SWT 9
M Image auf Button zentrieren AWT, Swing, JavaFX & SWT 7
H JavaFX Prozess bei dem Start pausieren AWT, Swing, JavaFX & SWT 5
D Start JUNG application with an Empty plot or visualisation AWT, Swing, JavaFX & SWT 1
D Swing Komponenten nicht sichtbar nach Start AWT, Swing, JavaFX & SWT 12
beli3ver JavaFX Anwendung startet nicht, kann den Fehler nicht finden (Exception in Application start method) AWT, Swing, JavaFX & SWT 1
Z JavaFX Exception in Application start method AWT, Swing, JavaFX & SWT 2
R NullPointerException beim Start des Fensters AWT, Swing, JavaFX & SWT 1
Bluedaishi JavaFX Programm start mit zwei scenen bzw Fenster AWT, Swing, JavaFX & SWT 1
S Swing Bei start des Programmes kein Fenster zu sehen AWT, Swing, JavaFX & SWT 1
L JavaFX JavaFXThread, launch, start AWT, Swing, JavaFX & SWT 0
L Java FX Exception beim start AWT, Swing, JavaFX & SWT 2
J Splashscreen Start Anwendung AWT, Swing, JavaFX & SWT 14
A JavaFX DatePicker in Swing beim Start nicht sichtbar AWT, Swing, JavaFX & SWT 2
D JavaFX (WebStart) Graues Fenster beim Start AWT, Swing, JavaFX & SWT 4
C JavaFX Auf Nodes einer FXML-Datei in start Methode zugreifen AWT, Swing, JavaFX & SWT 5
M Start-/ Stop-Button Problem AWT, Swing, JavaFX & SWT 2
J 2D-Grafik JPanel wird erst 1-2sek nach start des JFrames angezeigt AWT, Swing, JavaFX & SWT 3
javampir 3D-Grafik JPCT Start AWT, Swing, JavaFX & SWT 2
D Erste Knoten des JTrees bei Start offen AWT, Swing, JavaFX & SWT 8
propra Wieso wird paintComponent() beim Start 2 malausgeführt? AWT, Swing, JavaFX & SWT 4
M Beim Start von TableEditor Inhalt der Zelle markieren. AWT, Swing, JavaFX & SWT 2
V Start Button und Wert Eingabe in ein Fenster AWT, Swing, JavaFX & SWT 2
B JFrame nach Start leer, größer ziehen zeigt Inhalt an AWT, Swing, JavaFX & SWT 2
A Kompilierfehler: illegal start of expression AWT, Swing, JavaFX & SWT 2
R Eingabeaufforderungs-Fenster beim start schliessen - wie? AWT, Swing, JavaFX & SWT 6
V Daten ins JTable laden bei Start der GUI AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben