Hallo,
ich habe mich Heute angemeldet, weil wir seit einigen Stunden am selben Problem sitze. Wir haben eine JTable in der sich unter anderem ein JComboBox befindet. Diese CB soll nun beim aufklappen befüllt werden. Dies soll erst beim aufklappen passieren, da zum einen die Einträge in der ComboBox von der jeweiligen Zeile und von den selektierten Elementen in den anderen ComboBoxen der selben Spalte abhängig sind.
Dazu habe ich einen PopupMenuListener auf die ComboBox regestriert und dann die popupMenuWillBecomeVisible Methode implementiert. Das befüllen dürfte prinzipiell funktionieren, jedoch kann ich dann nichts mehr auswählen, weil die ComboBox, nach der Befüllung, sofort wieder zugeklappt wird. Ich habe versucht, das ganze aus der eigentlichen GUI um euch ein Stück lauffähigen Code präsentieren zu können.
Beim googeln bin ich auf einen Bug Report auf der Sun Seite gestoßen (hier) der ein Stück Beispielcode enthält, was im Prinzip die selbe Konfiguration nutzt, aber ohne diesen Bug funktioniert. Wir hatten auch schon einen eigenen CellEditor und Renderer geschrieben, jedoch ohne Erfolg. :noe:
Wir haben schon alles mögliche versucht und wären sehr froh, wenn jemand eine Lösung für dieses Problem kennt. Für Profi-GUI Programmieren ist das doch sicher eine Kleinigkeit.
Vielen Dank im voraus!
Florian und Christian
ich habe mich Heute angemeldet, weil wir seit einigen Stunden am selben Problem sitze. Wir haben eine JTable in der sich unter anderem ein JComboBox befindet. Diese CB soll nun beim aufklappen befüllt werden. Dies soll erst beim aufklappen passieren, da zum einen die Einträge in der ComboBox von der jeweiligen Zeile und von den selektierten Elementen in den anderen ComboBoxen der selben Spalte abhängig sind.
Dazu habe ich einen PopupMenuListener auf die ComboBox regestriert und dann die popupMenuWillBecomeVisible Methode implementiert. Das befüllen dürfte prinzipiell funktionieren, jedoch kann ich dann nichts mehr auswählen, weil die ComboBox, nach der Befüllung, sofort wieder zugeklappt wird. Ich habe versucht, das ganze aus der eigentlichen GUI um euch ein Stück lauffähigen Code präsentieren zu können.
Java:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.DefaultCellEditor;
import javax.swing.ComboBoxEditor;
import javax.swing.ComboBoxModel;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
public class DienstEinteilenPanel extends JFrame {
private JTable m_table;
private JScrollPane m_scrollPane;
private DefaultTableModel m_tableModel;
private JComboBox m_comboBox;
private DefaultComboBoxModel m_comboModel;
DienstEinteilenPanel() {
initLayout();
}
void initLayout() {
// Tabelle initialisieren
String[] spaltenNamen = { "Position", "Person", "Solist", "Stimmführer" };
Object[][] daten = { {"Geige", "", new Boolean(false), new Boolean(true)},
{"Flöte", "", new Boolean(false), new Boolean(false)},
{"Kontrabass", "", new Boolean(true), new Boolean(false)}
};
m_tableModel = new DefaultTableModel(daten, spaltenNamen);
m_table = new JTable(m_tableModel);
m_comboModel = new DefaultComboBoxModel();
m_comboBox = new JComboBox(m_comboModel);
m_table.getColumnModel().getColumn(1).setCellEditor(new DefaultCellEditor(m_comboBox));
m_comboBox.addPopupMenuListener(new PopupMenuListener() {
public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
if (e.getSource() instanceof JComboBox) {
final JComboBox box = (JComboBox) e.getSource();
SwingUtilities.invokeLater(new Runnable() {
public void run() {
System.out.println("************** im LISTENER *****************");
m_comboModel.removeAllElements();
Object[] ob = { "Musiker 1", "Musiker 2", "Musiker 3", "Musiker 4", "Musiker 5" };
if (ob.length > 0) {
for (Object o : ob) {
m_comboModel.addElement(o);
}
m_comboModel.setSelectedItem(ob[0]);
m_comboBox.revalidate();
}
}
});
}
}
public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { }
public void popupMenuCanceled(PopupMenuEvent e) { }
});
// Tabelle formatieren
m_table.setIntercellSpacing(new Dimension(5, 5));
m_table.setRowHeight(24);
m_table.setRowSelectionAllowed(false);
m_table.setShowGrid(false);
m_table.setShowHorizontalLines(true);
m_table.setDefaultRenderer( JComponent.class, new JComponentCellRenderer() );
m_table.setDefaultEditor( JComponent.class, new JComponentCellEditor() );
m_scrollPane = new JScrollPane(m_table);
add(m_scrollPane);
}
public static void main(String[] args) {
DienstEinteilenPanel d = new DienstEinteilenPanel();
d.setSize(400, 500);
d.setVisible(true);
d.addWindowListener( new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
Beim googeln bin ich auf einen Bug Report auf der Sun Seite gestoßen (hier) der ein Stück Beispielcode enthält, was im Prinzip die selbe Konfiguration nutzt, aber ohne diesen Bug funktioniert. Wir hatten auch schon einen eigenen CellEditor und Renderer geschrieben, jedoch ohne Erfolg. :noe:
Wir haben schon alles mögliche versucht und wären sehr froh, wenn jemand eine Lösung für dieses Problem kennt. Für Profi-GUI Programmieren ist das doch sicher eine Kleinigkeit.
Vielen Dank im voraus!
Florian und Christian
Zuletzt bearbeitet: