Ich habe folgendes Problem:
In meiner GUI gibt es eine JList, die 10 sichtbare Einträge besitzt, Eintrag 8 ist selektiert. Klickt man den "dynamic" Button schrumpft die Liste auf 1 sichtbaren Eintrag zusammen. Dann sollte der einzelne selektierte Eintrag sichtbar sein. Das sollte durch "ensureIndexIsVisible(index)" gewährleistet werden, wird allerdings erst nach einem Neuzeichnen der GUI vollzogen. Sollte ein Neuzeichnen nicht automatisch eingeleitet werden?
Der Quellcode:
In meiner GUI gibt es eine JList, die 10 sichtbare Einträge besitzt, Eintrag 8 ist selektiert. Klickt man den "dynamic" Button schrumpft die Liste auf 1 sichtbaren Eintrag zusammen. Dann sollte der einzelne selektierte Eintrag sichtbar sein. Das sollte durch "ensureIndexIsVisible(index)" gewährleistet werden, wird allerdings erst nach einem Neuzeichnen der GUI vollzogen. Sollte ein Neuzeichnen nicht automatisch eingeleitet werden?
Der Quellcode:
Code:
package layout;
import info.clearthought.layout.TableLayout;
import java.awt.Color;
import java.awt.Component;
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;
private JList lstDyn = null;
private JScrollPane scroll = null;
private boolean showFull = true;
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",
"eins", "zwei", "drei",
"eins", "zwei", "drei",
"eins", "zwei", "drei",
"eins", "zwei", "drei"};
lstDyn = new JList(s);
lstDyn.setVisibleRowCount(10);
lstDyn.setSelectedIndex(8);
scroll = new JScrollPane(lstDyn);
double pref = TableLayout.PREFERRED;
double fill = TableLayout.FILL;
double[][] size = {{fill},
{pref, pref}};
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.PREFERRED);
if (showFull) {
lstDyn.setVisibleRowCount(1);
showFull = !showFull;
} else {
lstDyn.setVisibleRowCount(10);
showFull = !showFull;
}
lstDyn.ensureIndexIsVisible(lstDyn.getSelectedIndex());
lstDyn.revalidate();
pane.revalidate();
}
}