GridBagLayout breite begrenzen

Hey Leute.
Ich habe hier folgenden Salat:


JScrollPane 
   JPanel (GridBagLayout)
      JPanel
         Inhalt (zB oder eigentlich immer JLabel)    
      JPanel
         Inhalt (zB oder eigentlich immer JLabel)    
      JPanel
         Inhalt (zB oder eigentlich immer JLabel)    

Das ganze ist ein Chat Programm und sieht so aus:

Das Problem: Wird der Text zu lang passiert das:

Was ja irgendwie logisch und eigentlich auch richtig ist. Ich will die Breite des JPanels, welches in
der ScrollPane liegt aber irgendwie begrenzen… Bekomme das aber nicht hin…

Hat jemand eine Idee?
Danke ^^

setPreferredSize(new Dimension(breite, irgendwas)) mit breite 0 oder einen bestimmten Wert
auf Inhalt, JLabel oder Panel zu testen?

siehe zuletzt
JLabel.setText() zerstört das Layout.

hmm. hab gar nicht realisiert das es ein ähnliches problem ist… muss ich mal schauen

also aufs panel die preferred breite 0 setzen funktioniert zwar, aber da die höhe ja dann auch
explizit angegeben werden muss, wächst das ding nicht in y richtung… was es ja soll, wenn der
content sich vergrößert

*** Edit ***

das panel hat gerade das flowlayout drin… deshalb kann ich dem inhalt keine preferred size 0 geben, weil die
dann auch so interpretiert wird… ich denke da muss ein anderer manager hin… aber welcher?

denkbar als Hack evtl. noch Überschreiben der getPreferredSize-Methode bei allen relevanten Komponenten, evtl. nur eine eigene Panel-Klasse,
erst super.getPreferredSize() aufrufen, Höhe davon übernehmen + feste Breite und das zurückgeben,

aber ist die Höhe überhaupt groß variabel?

Naja je mehr text man reinhaut, desto höher soll das ding werden… also der text soll umgebrochen werden,
ich denke ich hab mich da noch nicht deutlich genug ausgedrückt.

*** Edit ***

moment… so hab ich das ja noch gar nicht gesagt, sorry. also ja… der text soll quasi umgebrochen werden, und die panels mit dem text
sollen nicht breiter sein als ihr weightx wert, in den screens 0.7

Hier ein Kskb dass das grundprinzip zeigt:


import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.KeyStroke;
import javax.swing.UIManager;

public class Kskb {
	
	private int row;
	
	public Kskb(){
		JFrame f = new JFrame();
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.getContentPane().setPreferredSize(new Dimension(800, 600));
		final JPanel content = new JPanel(new GridBagLayout());
		final JPanel empty = new JPanel();
		empty.setPreferredSize(new Dimension(0, 0));
		GridBagConstraints gbc = new GridBagConstraints();
		content.add(empty, gbc);
		content.getInputMap().put(KeyStroke.getKeyStroke("ENTER"), "§");
		content.getActionMap().put("§", new AbstractAction(){
			@Override
			public void actionPerformed(ActionEvent e){
				JPanel p = new JPanel();
				p.setBackground(Color.GRAY);
				JLabel text = new JLabel("ABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABC");
				p.add(text);
				
				GridBagConstraints gbc = new GridBagConstraints();
				gbc.insets = new Insets(10, 10, 10, 10);
				gbc.weightx = 1.0;
				gbc.gridy = row++;
				gbc.fill = GridBagConstraints.HORIZONTAL;
				gbc.gridwidth = GridBagConstraints.REMAINDER;
				gbc.anchor = GridBagConstraints.NORTHWEST;
				
				content.add(p, gbc);
				
				content.remove(empty);
				gbc.gridy = row;
				gbc.weighty = 1.0;
				content.add(empty, gbc);
				
				content.revalidate();
			}
		});
		JScrollPane scrollPane = new JScrollPane(content);
		f.pack();
		f.setLocationRelativeTo(null);
		f.add(scrollPane);
		f.setVisible(true);
	}
	
	public static void main(String[] args) throws Exception {
		UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
		new Kskb();
	}
}

ich versuch das jetzt da erstmal zu fixen.

*** Edit ***

(enter drücken um neue komponente hinzuzufügen)

Ich glaube das ist Timothy_Truckle’s Spezialgebiet, mehrere Köche verderben den Brei, bzw. dann nicht mehr sicher/eindeutig.^^

Aaalso danke Slater, aber ich habs ausnahmsweise mal ohne hack hinbekommen ^^
Das Scrollable Interface hilft hier weiter.

Kskb läuft nun:


import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.LayoutManager;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.KeyStroke;
import javax.swing.Scrollable;
import javax.swing.UIManager;

public class MyKskb {
	
	private int row;
	
	class SomethingPanel extends JPanel implements Scrollable {

		public SomethingPanel(LayoutManager manager){
			super(manager);
		}
		
		@Override
		public Dimension getPreferredScrollableViewportSize(){
			return getPreferredSize();
		}

		@Override
		public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction){
			return 5;
		}

		@Override
		public boolean getScrollableTracksViewportHeight(){
			return false;
		}

		@Override
		public boolean getScrollableTracksViewportWidth(){
			return true;
		}

		@Override
		public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction){
			return 1;
		}
    }
	
	public MyKskb(){
		JFrame f = new JFrame();
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.getContentPane().setPreferredSize(new Dimension(800, 600));
//		final JPanel content = new JPanel(new GridBagLayout());
		final SomethingPanel content = new SomethingPanel(new GridBagLayout());

//		final JPanel empty = new JPanel();
//		empty.setPreferredSize(new Dimension(0, 0));
//		GridBagConstraints gbc = new GridBagConstraints();
//		content.add(empty, gbc);
		content.getInputMap().put(KeyStroke.getKeyStroke("ENTER"), "§");
		content.getActionMap().put("§", new AbstractAction(){
			@Override
			public void actionPerformed(ActionEvent e){
				JPanel p = new JPanel(new BorderLayout());
				p.setBorder(BorderFactory.createLineBorder(Color.BLACK, 2));
				p.setBackground(Color.GRAY);
				
				GridBagConstraints gbc = new GridBagConstraints();
				gbc.insets = new Insets(10, 10, 10, 10);
				gbc.weightx = 1.0;
				gbc.gridx = 0;
				gbc.gridy = row++;
				gbc.fill = GridBagConstraints.HORIZONTAL;
				
//				content.remove(empty);
//				gbc.gridy = row;
//				gbc.weighty = 1.0;
//				content.add(empty, gbc);
			
				JTextArea text = new JTextArea(
						Math.random() > 0.5 ? 
						"ABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABC" : 
						"FFFFFFFFFFFFABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABC");
				text.setLineWrap(true);
				p.add(text);
				content.add(p, gbc);
				content.revalidate();
			}
		});
		JScrollPane scrollPane = new JScrollPane(content);
		f.pack();
		f.setLocationRelativeTo(null);
		f.add(scrollPane);
		f.setVisible(true);
	}
	
	public static void main(String[] args) throws Exception {
		UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
		new MyKskb();
	}
}

Dein Beispiel erzeugt bei mir nur ein leeres Fenster, in dem nichts passiert. Hmmm.

Edit: Ah ok, man muss ENTER drücken. Steht ja auch im Code. schmunzelt

hehe ja, sorry ^^