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…
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,
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();
}
}