Swing ComboBox und doppelter Event!?

Status
Nicht offen für weitere Antworten.

ralfz

Aktives Mitglied
Hallo,

ich habe eine Combobox, bei der ich auf den ActionEvent lausche. Wenn der Wert verändert wurde, soll ein Dialog hoch kommen, der fragt, ob das bisherige Element gespeichert werden soll. Problem ist nur, dass der Dialog immer 2x erscheint... Woran kann das liegen?

Hier der Code aus dem Listener:
Java:
private void listProjectsActionPerformed(java.awt.event.ActionEvent evt) {                                             
       //get index
        int i = listProjects.getSelectedIndex();  //listProjects is a ComboBox
        // load Project with ID

        if (project != null && indexLastProject >= 0 && i != indexLastProject) {
            //ask if changes should be saved, else lost

            int n = JOptionPane.showConfirmDialog(this,
                    "Do you want to save changes for last element?",
                    "Project:Save changes...",
                    JOptionPane.YES_NO_CANCEL_OPTION);
            if (n == JOptionPane.YES_OPTION) {

                ((Project) ((DefaultComboBoxModel) listProjects.getModel()).getElementAt(indexLastProject)).save();
            } else if (n == JOptionPane.CANCEL_OPTION) {
                listProjects.setSelectedIndex(indexLastProject);
                return;
            }

        }
        indexLastProject = listProjects.getSelectedIndex();
        project = (Project) listProjects.getSelectedItem();
        if (project != null) {
          //...
        }
Gruß
Ralf
 

Marco13

Top Contributor
Bei einer List ist es so, dass z.B. bei einem SelectionListener zwei events kommen: Einmal für "unselected" (das bisherige Element) und einmal für "selected" (das neue Element) - bei ComboBox und ActionEvents sollte das eigentlich NICHT so sein, aber du kannst dir mal interessehalber das
int i = listProjects.getSelectedIndex(); //listProjects is a ComboBox
am Anfang mit System.out.println ausgeben lassen. Wenn dort ZWEI mal etwas anderes als "-1" erscheint, wäre mein nächster Tipp, dass du das ganze versehentlich ZWEI mal mit addActionListener zur ComboBox hinzufügst...
 

Ebenius

Top Contributor
Lass Dir mal die [c]actionCommand[/c]-Eigenschaft des [c]ActionEvent[/c] ausgeben. ;-) Die [c]JComboBox[/c] ist editierbar, oder?

Ebenius
 

ralfz

Aktives Mitglied
Hallo Marco,

also ich hab die GUI mittels Netbeans/Matisse erstellt und für die ComboBox gibt es nur einen Listener.

Beim starten der App, setze ich nach dem Laden der Elemente aus der DB die Liste und selekted auf '0'.

Damit erhalte ich mittels
System.out.printf("Projekt-Selected:'%d' von '%s'%n",i,evt.getSource().toString());

am Anfang den folgenden Output:
Projekt-Selected:'0' von 'javax.swing.JComboBox[,10,113,207x20,invalid,layout=com.sun.java.swing.plaf.windows.WindowsComboBoxUI$3,alignmentX=0.0,alignmentY=0.0,border=com.sun.java.swing.plaf.windows.XPStyle$XPStatefulFillBorder@1b3f8f6,flags=328,maximumSize=,minimumSize=,preferredSize=,isEditable=false,lightWeightPopupEnabled=true,maximumRowCount=8,selectedItemReminder=TestProjekt1]'
Projekt-Selected:'0' von 'javax.swing.JComboBox[,10,113,207x20,layout=com.sun.java.swing.plaf.windows.WindowsComboBoxUI$3,alignmentX=0.0,alignmentY=0.0,border=com.sun.java.swing.plaf.windows.XPStyle$XPStatefulFillBorder@1b3f8f6,flags=328,maximumSize=,minimumSize=,preferredSize=,isEditable=false,lightWeightPopupEnabled=true,maximumRowCount=8,selectedItemReminder=TestProjekt1]'

und zwar ohne den Dialog, was ja auch gewünscht ist.

wähle ich nun ein anderes Projekt
bekomme ich bei Element Nr. 2 (Index 1) =
Projekt-Selected:'1' von ....

Da ist mir doch gerade was aufgefallen....
Wenn ich das neue Element wähle, kommt sofort der Dialog hoch, allerdings ist die ComboBox noch nicht wieder geschlossen.
Der erste Klick auf den Dialog wird also gar nicht ausgeführt, sondern schließt erst die ComboBox, und dann kann ich erst klicken.
Daher das Gefühl, man muss 2 Dialoge anklicken.

Ist das normal? Ok, rhetorische Frage... was tue ich dagegen? Kann man die ComboBox manuell schließen?

Gruß
Ralf
 

Ebenius

Top Contributor
Prüf trotzdem mal das [c]actionCommand[/c]!
Java:
System.out.print(evt.getActionCommand());

Ebenius
 

ralfz

Aktives Mitglied
Ok,

hier das Command:

Direkt nach dem Start:
Projekt-Selected:'0' von ...
Projekt-Selected: ActionCommand=comboBoxChanged
Projekt-Selected:'0' von ...
Projekt-Selected: ActionCommand=comboBoxChanged

Wahl von Element 2 (Index 1):
Projekt-Selected:'1' von ...PROJEKT]'
Projekt-Selected: ActionCommand=comboBoxChanged

Erster Klick in der ComboBox auf ein Element öffnet das Fenster, aber die Liste der ComboBox bleibt offen. Also erst irgendwo hinklicken und dann kann ich erst erfolgreich auf einen Button des Dialogs klicken.

Die CB ist übrigens nicht editierbar...

Gruß
Ralf
 

ralfz

Aktives Mitglied
Ich hab zwar jetzt ne Lösung, indem ich innerhalb der Methode:
Java:
listProjects.setPopupVisible(false);
aufrufe und es jetzt klappt, aber ich finde das trotzdem seltsam!

Kann mir das jemand erklären? Ist das nen Bug, oder normales Verhalten?
Gruß
Ralf
 

Ebenius

Top Contributor
Mach mal ein KSKB (Maus über die Abkürzung, falls unbekannt). Einfach nur eine JComboBox mit drei Werten und Ausgabe auf die Konsole. Mir ist das Verhalten unbekannt, oder ich verstehe Dein Problem falsch (oder nicht vollständig).

Ebenius
 

ralfz

Aktives Mitglied
Hi,

also ich hab in der Zwischenzeit versucht das Beispiel vereinfacht nachzubauen. Problem, oder eigentlich auch nicht: In der Demo verhällt sich die Combobox so wie sie sollte...

Ich hab das Beispiel sowohl als einfachen JFrame als auch als SingelFrameApplication, so wie das Original erstellt und ich hab der Combobox sowohl einfache Strings, als auch einfach Elemente die ihre Werte mittels toString() mitteilen erstellt. Es klappt immer, nur in meiner Applikation nicht :(

-Könnte es irgendwie noch an dem Laden aus der DB hängen?
-Ich erstelle und setze innerhalb der action-Methode der ComboBox ein ListModel für eine JList, auf die wiederum ein Listener horcht, der auf der Auswahl beruhend 2 Tabellen bestückt. Kann das hiermit zusammenhängen?

Im Anhang mal ein Screenshot der Application, sowie die beiden (korrekt) funktionierenden Beispiele...
Also Reihenfolge der Listener: Combobox-> befüllt JList-> befüllt die beiden JTables

Hier noch ein wenig mehr Code-Schnippsel der Original-App zum Verständnis:
Java:
//Einstieg:
public class ETESGUIapplication extends SingleFrameApplication {
     /**
     * At startup create and show the main frame of the application.
     */
    @Override protected void startup() {
        //show(new ETESGUIapplicationView(this));
        logger.info(this,"[START] Starting up the Application:"+new Date());
        show(new EtesGui()); // Nur Start meines JFrame !!!
    }

    /**
     * This method is to initialize the specified window by injecting resources.
     * Windows shown in our application come fully initialized from the GUI
     * builder, so this additional configuration is not needed.
     */
    @Override protected void configureWindow(java.awt.Window root) {
    }

    /**
     * A convenient static getter for the application instance.
     * @return the instance of ETESGUIapplication
     */
    public static ETESGUIapplication getApplication() {
        return Application.getInstance(ETESGUIapplication.class);
    }

    /**
     * Main method launching the application.
     */
    public static void main(String[] args) {
        logger.info(ETESGUIapplication.class,"[START] Launching the Application:"+new Date());
        launch(ETESGUIapplication.class, args);
    }
}

// meine GUI Klasse
public class EtesGui extends javax.swing.JFrame {
    private static AccessDB db;
    private static IniConfig ini;
    private static Log2 logger = new Log2();
    // Models:
    private DefaultComboBoxModel listModelProjects = new DefaultComboBoxModel();
    private DefaultListModel listModelTables = new DefaultListModel();
    //...
    private String[] projects;
    private Vector<Project> projectList = new Vector<Project>();
    //...
    protected Project project; // the current project
    private DecisionTable dtable_cur; // workingcopy of decision table
    private int indexLastProject;
    private int indexLastDTable;

//Konstruktor
public EtesGui() {
        logger.fine(this,"Entering Constructor."+this.getClass().getSimpleName());
        try {
            initComponents();

            db = new AccessDB();
            ini = new IniConfig();
            if (!db.isConnected) {
                JOptionPane.showMessageDialog(this, db.getErrText(), "ETES_ERROR: DB Connection Error!", JOptionPane.ERROR_MESSAGE);
                System.exit(1);
            }
            listDTs.setModel(listModelTables); //Model für die JList
            listProjects.setModel(listModelProjects); // Model für die ComboBox
            indexLastProject = -1;
            loadProjectList(); // Laden der Projekt-Elemente aus der DB und setzen des ComboBoxModel
            dtable_cur = null;
            indexLastDTable = -1;
            //Listener einer JTable zum Syncen der Ansicht
            tblConditions.getColumnModel().addColumnModelListener(new MyTableColumnListener(tblConditions, tblActions));   

        logger.info(this, "The GUI (ETESGUI) is started");
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(EtesGui.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(EtesGui.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

private void loadProjectList() {
//...
// hole Projektliste für die Auswahl
    projects = db.loadProjectList().toArray(new String[0]);
    projectList = new Vector<Project>();
// For-Schleife zum befüllen des ComboBoxModel ...
//...
    listProjects.validate();
    if (listModelProjects.getSize() > 0) {
            listProjects.setSelectedIndex(0);
            indexLastProject = 0;
            listProjects.repaint();
            project = (Project) listModelProjects.getElementAt(0);
    }
        indexLastDTable = -1; // old-Index

}

}

Alle weiteren Elemente und Methoden, soweit sie die GUI betreffen befinden sich ebenfalls in 'ETESGui' und die Klasse hat derzeit etwa 7500 Zeilen Code inkl. Kommentaren und vom GUI Builder generiertem Code. Dazu kommt dann noch die Form-Datei, mit etwa 6000 Zeilen.

Gruß
Ralf
 
Zuletzt bearbeitet:

ralfz

Aktives Mitglied
Finde den eigentlichen Fehler leider nicht, aber mit dem workaround kann ich erst mal leben. Danke.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Element aus comboBox mit observableList löschen AWT, Swing, JavaFX & SWT 3
T Combobox mit Autocomplete-Funktion AWT, Swing, JavaFX & SWT 7
J Eingaben aus Textfield & ComboBox speichern und in ComboBox wieder ausgeben AWT, Swing, JavaFX & SWT 3
N Promt Text der Combobox AWT, Swing, JavaFX & SWT 0
Doppel JavaFX ComboBox AWT, Swing, JavaFX & SWT 5
P JavaFX ClassCastException bei ComboBox.getValue AWT, Swing, JavaFX & SWT 4
F Wie bekomme ich den Wert der ComboBox in eine Variable gespeichert welche ich für meinen ActionListener nutzen kann? AWT, Swing, JavaFX & SWT 3
M Swing Java Swing/AWT Combobox Bug AWT, Swing, JavaFX & SWT 3
M Combobox bild anklicken AWT, Swing, JavaFX & SWT 2
L JavaFX Wiederspenstige ComboBox AWT, Swing, JavaFX & SWT 0
P Combobox und Enum AWT, Swing, JavaFX & SWT 3
L ComboBox Wert automatisch auswählen AWT, Swing, JavaFX & SWT 6
L Methode zum Füllen einer ComboBox AWT, Swing, JavaFX & SWT 4
K Nullpointer Combobox Listener AWT, Swing, JavaFX & SWT 2
K JavaFX Combobox, Textfield & setOnMouseClicked AWT, Swing, JavaFX & SWT 2
it_is_all Swing Button, ComboBox,... -- Unterschied: NetBeans Design <-> Ausführung AWT, Swing, JavaFX & SWT 2
D JavaFX ComboBox String setzen AWT, Swing, JavaFX & SWT 20
offi Combobox in TableCell AWT, Swing, JavaFX & SWT 1
D Javafx Combobox Abfrage aus mysql AWT, Swing, JavaFX & SWT 8
K Event Handling ComboBox Event Handler AWT, Swing, JavaFX & SWT 7
MrSnake ComboBox-Einträge werden unsichtbar AWT, Swing, JavaFX & SWT 0
L ComboBox: slider positionieren AWT, Swing, JavaFX & SWT 0
M JavaFX ComboBox: Update zur Laufzeit AWT, Swing, JavaFX & SWT 16
M JavaFX Combobox bindBidirectional AWT, Swing, JavaFX & SWT 4
D [Anfänger]ComboBox erstellt Einträge in einer anderen ComboBox AWT, Swing, JavaFX & SWT 3
T JavaFX Editable Combobox Text-Selektierung nach Trigger AWT, Swing, JavaFX & SWT 4
H Combobox aktualisieren AWT, Swing, JavaFX & SWT 2
G Swing ComboBox: Auswahl eines Items der Liste durch Eingabe eines Buchstabens AWT, Swing, JavaFX & SWT 3
M JavaFX ComboBox AWT, Swing, JavaFX & SWT 5
T Problem: ComboBox und addItem AWT, Swing, JavaFX & SWT 5
J ComboBox als Filter benutzen AWT, Swing, JavaFX & SWT 1
M ausgewählte Inhalt von ListItem inn ComboBox in der Tabelle speichern AWT, Swing, JavaFX & SWT 0
Developer_X Java JTable - Combobox + Checkbox - Cellrenderer + Editor AWT, Swing, JavaFX & SWT 3
G Dynamische ComboBox AWT, Swing, JavaFX & SWT 3
U Combobox mit individuellen Texten AWT, Swing, JavaFX & SWT 5
M JavaFX Combobox - Item Auswahl mit Tasten AWT, Swing, JavaFX & SWT 8
F JavaFX Daten aus Tabelle in ComboBox AWT, Swing, JavaFX & SWT 9
C Beschriftungen von Tabellenspalten mit Combobox aussuchen AWT, Swing, JavaFX & SWT 2
G JavaFX ComboBox .getItems().add() Problem AWT, Swing, JavaFX & SWT 9
D Swing [Frage] ComboBox + Label AWT, Swing, JavaFX & SWT 3
F SWT Problem mit Tabelle und Combobox in einem Wizard AWT, Swing, JavaFX & SWT 5
B JAVAFX icon in ComboBox einfügen AWT, Swing, JavaFX & SWT 5
W Swing Combobox Abhängigkeit AWT, Swing, JavaFX & SWT 1
S ComboBox-Werte aus einem Array an Textfields übergeben AWT, Swing, JavaFX & SWT 3
A Swing GUI mit ComboBox, wenn Item ausgewählt wurde neues GUI AWT, Swing, JavaFX & SWT 7
S Combobox aktualisieren AWT, Swing, JavaFX & SWT 3
B Erstellen eigener Combobox ("CellFactory") AWT, Swing, JavaFX & SWT 4
C Swing ComboBox - ActionListener deaktivieren AWT, Swing, JavaFX & SWT 2
A combobox automatisch in ein textfeld wechseln AWT, Swing, JavaFX & SWT 3
J Swing Drive-ComboBox AWT, Swing, JavaFX & SWT 7
C TextFeld in Verbindung zur ComboBox automatisch aktualisieren AWT, Swing, JavaFX & SWT 7
L Swing Model für ComboBox AWT, Swing, JavaFX & SWT 14
H Combobox in einer einzelnen Zelle der Jtable AWT, Swing, JavaFX & SWT 2
T Java Combobox Problem AWT, Swing, JavaFX & SWT 3
C SWT Combobox mit Textdatei füllen AWT, Swing, JavaFX & SWT 2
M comboBox Listener? AWT, Swing, JavaFX & SWT 2
R Datenbanktabellen in Combobox AWT, Swing, JavaFX & SWT 3
C Combobox bei Tabellenänderung mit aktualisieren AWT, Swing, JavaFX & SWT 11
1 CellEditor mit ComboBox richtig beenden AWT, Swing, JavaFX & SWT 4
L SWT Actionlistener Combobox öffnen AWT, Swing, JavaFX & SWT 4
E Swing CellEditor mit Combobox durch Tastatureingabe editieren?! AWT, Swing, JavaFX & SWT 3
GianaSisters Swing ComboBox im jTable (in bestimmter Zelle nicht über die ganze Spalte) AWT, Swing, JavaFX & SWT 4
T Daten mittels ComboBox in ein JTable adden AWT, Swing, JavaFX & SWT 7
N Filternde Combobox in JTable verliert Fokus nach erster Eingabe AWT, Swing, JavaFX & SWT 2
F Wert zu Eintrag in ComboBox speichern?! AWT, Swing, JavaFX & SWT 7
P Swing ComboBox(en) in JTable auslesen und ausgeben AWT, Swing, JavaFX & SWT 11
M Index von Combobox AWT, Swing, JavaFX & SWT 20
L ComboBox in Action AWT, Swing, JavaFX & SWT 4
D ComboBox & CellListRenderer AWT, Swing, JavaFX & SWT 6
D ComboBox-Model mit Observer AWT, Swing, JavaFX & SWT 3
B Taschenrechner mit ComboBox AWT, Swing, JavaFX & SWT 7
T ComboBox auslesen AWT, Swing, JavaFX & SWT 11
P Combobox liesst falschen Wert AWT, Swing, JavaFX & SWT 10
C Combobox im JFrame aus Datenbank befüllen AWT, Swing, JavaFX & SWT 6
M Combobox soll Farbe einer Komponente setzen AWT, Swing, JavaFX & SWT 2
M Swing ComboBox ein SelectedItem übergeben/anzeigen AWT, Swing, JavaFX & SWT 7
J Werte aus Combobox speichern AWT, Swing, JavaFX & SWT 3
J Combobox als Filterkriterium (Gruppierung) in JTable AWT, Swing, JavaFX & SWT 7
M SWT Wie Textfeld hinzufügen, nach Auswahl von einem bestimmten Combobox-item? AWT, Swing, JavaFX & SWT 3
M SWT ComboBox mit DB-Inhalten Designfrage AWT, Swing, JavaFX & SWT 5
W MouseListener im editable ComboBox AWT, Swing, JavaFX & SWT 14
W Combobox mit eingabefeld AWT, Swing, JavaFX & SWT 7
T Editable ComboBox / kein Weiterspringen AWT, Swing, JavaFX & SWT 12
M Combobox in JTable AWT, Swing, JavaFX & SWT 4
S Swing ComboBox aus Array befüllen AWT, Swing, JavaFX & SWT 2
K Per ComboBox Dateien einlesen AWT, Swing, JavaFX & SWT 23
0 Hintergundfarbe von editierbarer ComboBox ändern AWT, Swing, JavaFX & SWT 2
M Frage zu ComboBox AWT, Swing, JavaFX & SWT 7
O Bitte um Hilfe bei ComboBox in TableHeader AWT, Swing, JavaFX & SWT 9
A NetBeans und ComboBox AWT, Swing, JavaFX & SWT 2
SuperSeppel13 Combobox zur Farbwahl kollidiert mit NimbusLookAndFeel AWT, Swing, JavaFX & SWT 7
D ComboBox(Model) mit dummyItem AWT, Swing, JavaFX & SWT 10
D Inhalt von Textfield nach ComboBox AWT, Swing, JavaFX & SWT 2
GilbertGrape nochmal editierbare Combobox AWT, Swing, JavaFX & SWT 3
GilbertGrape JTable mit Combobox-Editierung schon nach einem Klick AWT, Swing, JavaFX & SWT 7
E Swing Button ActionListener Infos aus Textfield und ComboBox AWT, Swing, JavaFX & SWT 3
G ComboBox wird nicht angezeigt beim anhängen an eine Gruppe AWT, Swing, JavaFX & SWT 2
G Combobox Event AWT, Swing, JavaFX & SWT 4
G ComboBox aktualisieren AWT, Swing, JavaFX & SWT 13
C Binding eines EntityBean als SelectionInList in ComboBox AWT, Swing, JavaFX & SWT 7

Ähnliche Java Themen

Neue Themen


Oben