Hallo zusammen,
ich hänge nun schon seit mehreren Tagen an einem Problem. Ich möchte das Verhalten einer JComboBox in einer JTable zu einer der normalen JComboBox angleichen.
Etwas genauer:
Bei einer normalen ComboBox kann man einträge mit den Pfeiltasten im PopDown-Menu selektieren. Bei jeder Selektion wird der Wert in der EditorComponent mit verändert. Sobald man also TAB drückt wechselt der Focus und der zuvor angewählte Wert bleibt in der ComboBox stehen.
In der JTable wird nun bei der ComboBox folgende ClientProperty gesetzt:
Dadurch verändert sich dieses Verhalten. Nun werden die Werte nicht mehr automatisch in der EditorComponent aktualisiert, die Folge wenn man nun weiter tabbt wird der selektierte Wert (im PopDown-Menu) nicht übernommen. Ich möchte dieses Verhalten ändern jedoch sind meine Versuche bisher fehlgeschlagen. Hier mal die 2 die ich für am viel versprechensten gehalten hatte.
1. Versuch:
Über KeyBindings. Ich habe versucht die Action "enterPressed" die logischerweise auf der Taste Enter liegt, mit der Tab-Taste zu teilen. Das klappt auch, es wird bei Tab, quasi Enter gedrückt, allerdings ist dann unmöglich aus der Zelle in der Tabelle rauszutabben. Irgendwie wird dadurch die FocusTraversalPolicy der JTable durcheinander gebracht.
2. Versuch:
Da ich keinen Listener finden konnte der bei einer Selektion im DropDown-Menu feuert habe ich mir schnell einen eigenen Renderer geschrieben der genau das erledigt hatte. Das funktioniert auch wunderbar, allerdings zerstöre ich damit die Autovervollständigung. Das geschieht dadurch: Man tippt etwas in die Editierbare Combobox, dadurch wird die Selektion im DropDown-Menu getriggert, diese feuert und in der Editor-Component wird der neue Wert übernommen.
Ich hatte noch ca 8 andere Versuche die aber schon früher gescheitert sind, die naive Methode die ClientProperty einfach wieder auf False zu setzen klappt leider nicht da dann die JComboBox überhaupt nicht mehr funktioniert. Dies war bei den meisten meiner anderen Versuche ebenfalls der Fall.
Ich habe viel Zeit mit Suchen verbracht eine ähnliche Implementierung konnte ich nur hier finden:
Tab in and out JComboBox in JTable : Table Renderer EditorSwing JFCJava
Als ich die Autovervollständigung darin mit implementieren wollte ging das aber leider wieder schief.
Hier mal eine kleines Testscript bei der ihr die Problematik hoffentlich gut verstehen könnt. Ihr benötigt dazu allerdings die SwingX-Libary. Zu finden gibts die unter anderem hier: Maven Repository: org.swinglabs » swingx-core
Ich hoffe ihr habt irgend eine Lösung oder einen Ansatz für mich. Das wäre echt super wenn ich das mit eurer Hilfe irgendwie schaffen würde
Viele Grüße,
fireflyer
ich hänge nun schon seit mehreren Tagen an einem Problem. Ich möchte das Verhalten einer JComboBox in einer JTable zu einer der normalen JComboBox angleichen.
Etwas genauer:
Bei einer normalen ComboBox kann man einträge mit den Pfeiltasten im PopDown-Menu selektieren. Bei jeder Selektion wird der Wert in der EditorComponent mit verändert. Sobald man also TAB drückt wechselt der Focus und der zuvor angewählte Wert bleibt in der ComboBox stehen.
In der JTable wird nun bei der ComboBox folgende ClientProperty gesetzt:
Java:
comboBox.putClientProperty("JComboBox.isTableCellEditor", Boolean.TRUE);
Dadurch verändert sich dieses Verhalten. Nun werden die Werte nicht mehr automatisch in der EditorComponent aktualisiert, die Folge wenn man nun weiter tabbt wird der selektierte Wert (im PopDown-Menu) nicht übernommen. Ich möchte dieses Verhalten ändern jedoch sind meine Versuche bisher fehlgeschlagen. Hier mal die 2 die ich für am viel versprechensten gehalten hatte.
1. Versuch:
Über KeyBindings. Ich habe versucht die Action "enterPressed" die logischerweise auf der Taste Enter liegt, mit der Tab-Taste zu teilen. Das klappt auch, es wird bei Tab, quasi Enter gedrückt, allerdings ist dann unmöglich aus der Zelle in der Tabelle rauszutabben. Irgendwie wird dadurch die FocusTraversalPolicy der JTable durcheinander gebracht.
2. Versuch:
Da ich keinen Listener finden konnte der bei einer Selektion im DropDown-Menu feuert habe ich mir schnell einen eigenen Renderer geschrieben der genau das erledigt hatte. Das funktioniert auch wunderbar, allerdings zerstöre ich damit die Autovervollständigung. Das geschieht dadurch: Man tippt etwas in die Editierbare Combobox, dadurch wird die Selektion im DropDown-Menu getriggert, diese feuert und in der Editor-Component wird der neue Wert übernommen.
Ich hatte noch ca 8 andere Versuche die aber schon früher gescheitert sind, die naive Methode die ClientProperty einfach wieder auf False zu setzen klappt leider nicht da dann die JComboBox überhaupt nicht mehr funktioniert. Dies war bei den meisten meiner anderen Versuche ebenfalls der Fall.
Ich habe viel Zeit mit Suchen verbracht eine ähnliche Implementierung konnte ich nur hier finden:
Tab in and out JComboBox in JTable : Table Renderer EditorSwing JFCJava
Als ich die Autovervollständigung darin mit implementieren wollte ging das aber leider wieder schief.
Hier mal eine kleines Testscript bei der ihr die Problematik hoffentlich gut verstehen könnt. Ihr benötigt dazu allerdings die SwingX-Libary. Zu finden gibts die unter anderem hier: Maven Repository: org.swinglabs » swingx-core
Java:
import java.awt.FlowLayout;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JTable;
import org.jdesktop.swingx.autocomplete.AutoCompleteDecorator;
import org.jdesktop.swingx.autocomplete.ComboBoxCellEditor;
public class TableComboBox extends JFrame {
private static final long serialVersionUID = 4313249824505939683L;
private JTable table;
private JComboBox cbox, tcbox;
private Object[][] data = {{"A", "B", "C"},{"D", "E", "F"}};
private String[] cols = {"c1", "c2"};
public static void main(String[] args) {
new TableComboBox();
}
public TableComboBox() {
table = new JTable(data, cols);
this.cbox = new JComboBox(new Object[] {"Ernie", "Bert", "Cookie"});
this.tcbox = new JComboBox(new Object[] {"Ernie", "Bert", "Cookie"});
this.cbox.setEditable(true);
this.tcbox.setEditable(true);
AutoCompleteDecorator.decorate(cbox);
AutoCompleteDecorator.decorate(tcbox);
table.getColumnModel().getColumn(0).setCellEditor(new ComboBoxCellEditor(tcbox));
this.init();
}
private void init() {
this.setLayout(new FlowLayout());
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.add(this.cbox);
this.add(this.table);
this.pack();
this.setVisible(true);
}
}
Ich hoffe ihr habt irgend eine Lösung oder einen Ansatz für mich. Das wäre echt super wenn ich das mit eurer Hilfe irgendwie schaffen würde
Viele Grüße,
fireflyer
Zuletzt bearbeitet von einem Moderator: