Ich habe eine JSplitPane
mit einem linken und rechten Bereich. Auf der linken Seite ist ein JPanel
eingebettet in eine JScrollPane
, weil dieses vertikal recht lang werden kann.
In diesem JPanel
befindet sich ein JTextField
, welches ich testweise in eine weitere JScrollPane
eingebettet habe.
Wird hier nun ein langer Text abgelegt (oder eingegeben und das Fenster bewegt), so wird das JPanel
breiter als es die JSplitPane vorgibt, was das Layout zerstört.
Ich habe ein Testprogramm zu dem Problem geschrieben, welches das Problem verdeutlicht:
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextField;
import javax.swing.UIManager;
public class TooLongJTextField {
private JFrame frame;
private JTextField textField;
public TooLongJTextField() {
createFrame();
frame.setVisible(true);
}
private void createFrame() {
setNiceLayoutManager();
frame = new JFrame("Too long text field in slit pane");
frame.setLayout(new BorderLayout());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(createSplitPane(), BorderLayout.CENTER);
frame.add(createButtons(), BorderLayout.SOUTH);
frame.setPreferredSize(new Dimension(900, 650));
frame.setLocation(100, 75);
frame.pack();
}
public static void setNiceLayoutManager() {
try {
UIManager.setLookAndFeel(
"com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
}
catch (Exception e) {
e.printStackTrace();
}
}
private Component createSplitPane() {
JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
createDataPart(),
createDocumentPart());
splitPane.setDividerLocation(600);
return splitPane;
}
private Component createDataPart() {
JPanel panel = new JPanel();
panel.setLayout(new VerticalLayout(0, VerticalLayout.BOTH));
panel.setBorder(BorderFactory.createTitledBorder(""));
panel.add(createTextFieldPart());
panel.add(createLabelPart("und"));
panel.add(createLabelPart("so"));
panel.add(createLabelPart("manche"));
panel.add(createLabelPart("andere"));
panel.add(createLabelPart("Felder"));
panel.add(createLabelPart("zum"));
panel.add(createLabelPart("Eingeben"));
panel.add(createLabelPart("von"));
panel.add(createLabelPart("weiteren"));
panel.add(createLabelPart("Daten"));
panel.add(createLabelPart("."));
panel.add(createLabelPart("."));
panel.add(createLabelPart("."));
panel.add(createLabelPart("."));
panel.add(createLabelPart("."));
panel.add(createLabelPart("."));
panel.add(createLabelPart("."));
panel.add(createLabelPart("."));
return new JScrollPane(panel);
}
private Component createTextFieldPart() {
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.setBorder(BorderFactory.createTitledBorder(""));
panel.add(new JLabel("Name "), BorderLayout.WEST);
textField = new JTextField();
//textField.setMaximumSize(new Dimension(100, 100));
panel.add(new JScrollPane(textField), BorderLayout.CENTER);
//panel.add(textField, BorderLayout.CENTER);
return panel;
}
private Component createLabelPart(String text) {
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.setBorder(BorderFactory.createTitledBorder(""));
panel.add(new JLabel(text), BorderLayout.CENTER);
return panel;
}
private Component createDocumentPart() {
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.setBorder(BorderFactory.createTitledBorder(""));
panel.add(new JLabel("irgendwelche anderen Gui-Elemente"), BorderLayout.CENTER);
return panel;
}
public static void main(String[] args) {
new TooLongJTextField();
}
private Component createButtons() {
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.setBorder(BorderFactory.createTitledBorder(""));
panel.add(createLongTextButton(), BorderLayout.EAST);
panel.add(createShortTextButton(), BorderLayout.WEST);
return panel;
}
private Component createLongTextButton() {
return createButton("long",
"Ein sehr langer Name der das Layout durch seine exorbitante, unfassbare, schier "
+ "unglaubliche Länge sprengt und alles völlig unansehnlich macht...");
}
private Component createShortTextButton() {
return createButton("short", "Max Mustermann");
}
private JButton createButton(String title, String text) {
JButton button = new JButton(title);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
fillText(text);
}
});
return button;
}
private void fillText(String text) {
textField.setText(text);
frame.revalidate();
}
}```
In der Methode `createTextFieldPart()` sieht man andere Versuche von mir, das Problem zu lösen. Im echten Anwendungsfall sind noch Gui-Elemente rechts neben dem Namensfeld, die dann einfach verschwinden und alles unhandlich machen. Im Normalfall sind die Namen kurz, aber ab und an kommen recht lange Namen vor.
Die `JScrollPane` mit `new JScrollPane(textField, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);` verbirgt nur die ScrollBar, aber verändert nicht das Fehlverhalten.