Java [GridBagLayout] Wie festen gefüllten Bereich mit <JTextPane> realisieren?

T

Tersus

Gast
Guten Abend,

ich möchte, dass sich einige (im Beispiel lediglich zwei) Objekte vom Typ javax.swing.JTextPane den Ihnen zur Verfügung stehenden Platz gleichmäßig teilen und dabei alles ausfüllen.

Weiterhin soll die Texteingabe eines dieser Objekte nicht dazu führen, dass die anderen Objekte verdrängt werden und die Gleichmäßigkeit durcheinander gebracht wird.

Die Bereiche, die sie haben, sollen fest in Bezug auf die Eingabe sein, nicht in Bezug auf die Größe des Fensters. Heißt, dass bei wachsender Fenstergröße, auch die Objekte mitwachsen, nicht jedoch bei Texteingabe.

Code:
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JFrame;
import javax.swing.JTextPane;

@SuppressWarnings("serial")
public class MyJFrame extends JFrame {
    
    public MyJFrame() {
                
        setSize(400, 400);
        
        getContentPane().setLayout(new GridBagLayout());
        
        JTextPane jt_a = new JTextPane();
        jt_a.setBackground(new Color(0, 0xaa, 0xff));
        
        JTextPane jt_b = new JTextPane();
        jt_b.setBackground(new Color(0, 0xff, 0xaa));
        
        
        GridBagConstraints gbc = new GridBagConstraints();
        
        gbc.anchor  = GridBagConstraints.BASELINE;
        gbc.fill    = GridBagConstraints.BOTH;
        gbc.weightx = 1.0;
        gbc.weighty = 1.0;  
        
        getContentPane().add(jt_a, gbc);
        getContentPane().add(jt_b, gbc); 
        
        setVisible(true);
        
    }

}

Wäre klasse, wenn mir jemand helfen kann! :)

Grüße
 
Kann dir jetzt nicht direkt helfen, vor allem ist es schon viele Jahre her das ich Swing verwendet hab.
Allerdings hab ich eine Essenz mitgenommen damals und die war verwende einen anderen LayoutManager *gg*

Ich hab damals http://www.miglayout.com/ verwendet kannst es ja mal anschauen.
 
MigLayout bedarf einiger Einarbeitung. Aber damit kann man so gut wie jedes Layout-Problem erschlagen. Und kann das Erlernte sogar für andere Toolkits gebrauchen, da auch SWT und JavaFX unterstützt werden. Den muss man sich anschauen!
 
Ich habe es nun mit MigLayout versucht, aber stoße aufgrund meines mangelhaften Wissens auch hier an Grenzen.

Code:
import java.awt.Color;

import javax.swing.JFrame;
import javax.swing.JTextPane;

import net.miginfocom.swing.MigLayout;

@SuppressWarnings("serial")
public class MyJFrame extends JFrame {
    
    public MyJFrame() {
                
        setSize(400, 400);
        
        getContentPane().setBackground(Color.white);
        
        getContentPane().setLayout(new MigLayout());
        
        JTextPane jt_a = new JTextPane();
        jt_a.setBackground(new Color(0, 0xaa, 0xff));
        
        JTextPane jt_b = new JTextPane();
        jt_b.setBackground(new Color(0, 0xff, 0xaa));
        
        JTextPane jt_c = new JTextPane();
        jt_c.setBackground(new Color(0, 0xaa, 0xff));
        
        getContentPane().add(jt_a, "w 100%, h 100%");
        getContentPane().add(jt_b, "w 100%, h 100%"); 
        getContentPane().add(jt_c, "w 100%, h 100%"); 
        
        setVisible(true);
        
    }

}

Damit geht es auf den ersten Blick. Doch sobald der Text länger wird, als der entsprechende JPane hoch ist, werden die anderen beiden nach unten verrückt ... :rolleyes: Sehr merkwürdiges Verhalten. Sie sollten bleiben, wo sie sind.
 
Tersus schrieb:
Ich habe es nun mit MigLayout versucht

Sehr löblich :)

Tersus schrieb:
Damit geht es auf den ersten Blick. Doch sobald der Text länger wird, als der entsprechende JPane hoch ist, werden die anderen beiden nach unten verrückt ... :rolleyes: Sehr merkwürdiges Verhalten. Sie sollten bleiben, wo sie sind.

Leider ist die Lernkurve mit MigLayout etwas hoch und die Layout-Beschreibung mitunter ziemlich komplex. Der Rest des Codes vereinfacht sich aber signifikant.

Probier mal folgendes:

Code:
add(jt_a, "grow, push, sg t");
add(jt_b, "grow, push, sg t");
add(jt_c, "grow, push, sg t");

Eine sizegroup ist die IMHO einfachste Möglichkeit hier gleiche Größe zu erreichen.

BTW, jeweils getContentPane() aufzurufen ist nicht (mehr) nötig.
Ergänzung ()

Mist, jetzt habe ich doch noch etwas vergessen:

Code:
add(jt_a, "grow, push, h 0::, w 0::, sg t");
add(jt_b, "grow, push, h 0::, w 0::, sg t");
add(jt_c, "grow, push, h 0::, w 0::, sg t");
 
Zuletzt bearbeitet:

Ähnliche Themen

Zurück
Oben