Ich benutze bei diesem Beispielprogramm das TableLayout und habe drei statische JButtons und einen dynamischen, der zusammen mit einer JTextArea in einem JPanel steckt. Klickt man den dynamischen Button soll die JTextArea eingeblendet werden und der Rest dadrunter dementsprechend verschoben werden. Dies passiert allerdings erst verzögert, nachdem man die Größe des gesamten JFrame verändert hat, also wenn die Elemente sowieso alle neu ausgerichtet werden müssen.
Im TableLayout Tutorial steht es müsse...
pane.invalidate();
pane.validate();
...aufgerufen werden, aber ich scheine noch etwas zu übersehen. Habe meinen Beispielcode angehängt.
Im TableLayout Tutorial steht es müsse...
pane.invalidate();
pane.validate();
...aufgerufen werden, aber ich scheine noch etwas zu übersehen. Habe meinen Beispielcode angehängt.
Code:
package layout;
import info.clearthought.layout.TableLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.UIManager;
import javax.swing.WindowConstants;
public class MainFrame extends JFrame {
private JPanel plDyn = null;
public static void main(String[] args) {
new MainFrame();
}
public MainFrame() {
super("TableLayout test");
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
// Tries to set the default system Look&Feel.
try {
UIManager.setLookAndFeel(
UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
System.err.println("Look&Feel nicht unterstützt. "+e.getMessage());
}
Container pane = getContentPane();
pane.add(packMainPanel());
pane.setPreferredSize(new Dimension(100, 300));
pack();
setVisible(true);
}
private JPanel packMainPanel() {
JButton btOne = new JButton("one");
JButton btTwo = new JButton("two");
JButton btThree = new JButton("three");
double pref = TableLayout.PREFERRED;
double fill = TableLayout.FILL;
double[][] size = {{fill},
{pref, pref, pref, pref, fill}};
TableLayout layout = new TableLayout(size);
JPanel pane = new JPanel();
pane.setLayout(layout);
pane.add(btOne, "0, 0");
pane.add(btTwo, "0, 1");
pane.add(packDynamicPanel(), "0, 2");
pane.add(btThree, "0, 3");
//added empty fill-space here?
return pane;
}
private JPanel packDynamicPanel() {
JButton btDyn = new JButton("dynamic");
btDyn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
toggleDyn(plDyn);
}
});
String[] s = {"eins", "zwei", "drei",
"eins", "zwei", "drei",
"eins", "zwei", "drei",
"eins", "zwei", "drei"};
JList lst = new JList(s);
JScrollPane scroll = new JScrollPane(lst);
scroll.setPreferredSize(lst.getPreferredScrollableViewportSize());
double pref = TableLayout.PREFERRED;
double fill = TableLayout.FILL;
double[][] size = {{fill},
{pref, 0}};
TableLayout layout = new TableLayout(size);
plDyn = new JPanel();
plDyn.setLayout(layout);
plDyn.setBackground(Color.RED);
plDyn.add(btDyn, "0, 0");
plDyn.add(scroll, "0, 1");
return plDyn;
}
private void toggleDyn(JPanel pane) {
TableLayout layout = (TableLayout)pane.getLayout();
if (layout.getRow(1) == 0) {
layout.setRow(1, TableLayout.FILL);
} else {
layout.setRow(1, 0);
}
pane.invalidate();
pane.validate();
}
}