JComboBox- Auswahl schließt komplettes Fenster

Status
Nicht offen für weitere Antworten.

waxweazle

Mitglied
Hi,
mein Problem ist folgendes:
Ich habe ein JDialog Fenster in dem mehrere Elemente intigriert sind, unter anderem auch eine JComboBox mit 2 verschiedenen Auswahlmöglichkeiten.
Code:
   combob[i] = new JComboBox(new String[] {"Mensch","Computer"});
Da ich von den Elementen 4 brauche, initialisiere ich es via for Schleife.
Das Fenster funktioniert auch wunderbar, das einzige was nicht funktioniert, ist das JComboBox Element.
Wenn ich dort nämlich die Auswahl der Box öffne und eine der beiden Möglichkeiten auswähle, schließt sich das komplette Fenster einfach....

Ich weiß nicht warum das so ist! Muss man bei JComboBoxen noch Code generieren, der das wechseln der Inhalte bemerkt und anzeigt oder habt Ihr eine Idee warum sich das Fenster einfach schließt???
 
Also das Fenster indem die Elemente stehen schliesst sich? Das wäre das normale Verhalten einer ComboBox (und dann sollte auch die neue Auswahl angezeigt werden).

Falls es ein anderes Fenster ist... dann poste bitte deinen Code, damit man sich das angucken kann.
 
ok der Code ist ein bißchen länger und da es sich noch alles in der Entwicklung befindet, sind noch nicht alle Funktionen so, wie sie einmal sein sollen...

Also es schließt sich nicht nur die ComboBox sondern das komplette Fenster in dem sich die Box befindet!!!

Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.lang.*;


/*
* Dialogfenster um beim Spielstart, den einzelnen Spielern Name und Farben zuzuweisen
* und um auszuwählen, ob der Spieler Mensch oder Computer sein soll
*/
public class SpielerAnzahlDialog extends JDialog implements ActionListener, ItemListener
{
  private GridBagLayout gbl;
  private GridBagConstraints gbc;
  private JPanel pan;

  private JCheckBox[] checkb;
  private JLabel[] farbe;
  private JTextField[] tf;
  private JComboBox[] combob;

  private JLabel lbl1,lbl2;
  private JButton btnStarten, btnAbbrechen;
  private int antwort = 0;


// Layout, des Spieler-Auswahlfensters
  public SpielerAnzahlDialog(Frame owner, String titel)
  {
    super(owner, titel, true);
    gbl = new GridBagLayout();
    getContentPane().setLayout(gbl);
    pan = new JPanel(new GridBagLayout());
    setLocationRelativeTo(null);

    checkb = new JCheckBox[4];
    farbe = new JLabel[4];
    tf = new JTextField[4];
    combob = new JComboBox[4];

/*
* Größe des Fensters wird festgelegt, es wird mittig zum Bildschirm ausgerichtet
* und die Anderung der Größe wird ausgeschalten
*/
    this.setSize(275,200);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    this.setLocation( (d.width - this.getWidth()) / 2,
                     (d.height - this.getHeight()) / 2);
    this.setResizable(false);

    farbe[0] = new JLabel("blau", JLabel.RIGHT);
    farbe[1] = new JLabel("rot", JLabel.RIGHT);
    farbe[2] = new JLabel("gelb", JLabel.RIGHT);
    farbe[3] = new JLabel("grün", JLabel.RIGHT);

//Textzeile wird eingefügt
    lbl1 = new JLabel("Boxen für Spielerauswahl aktivieren");
    gbc = neueZelle(1,4,0,0,0,0);
    gbc.insets =new Insets(5,1,1,1);
    this.getContentPane().add(lbl1, gbc);
/*
* Da wir mit max 4 Spielern spielen, wird die Anordnung der Auswahlfelder
* in einer Schleife realisiert.
* Es wird zuerst jedes Erforderliche Element initialisiert.
* Dannach wird mit der Funktion neueZelle, genau diese mit Ihren Eigenschaften erschaffen
* und nun kann man das erzeugte Element hinzufügen
* Dies geschieht 4 mal
*/
    for(int i=0; i<4; i++)
    {
      checkb[i] = new JCheckBox();
      checkb[i].addItemListener(this);     //zum Abfangen von Ereignissen wir der IL angebunden
      checkb[i].setSelected(false);        //alle Boxen werden default auf disable gesetzt
      gbc = neueZelle(1,1,0,i+1,0,0);
      this.getContentPane().add(checkb[i], gbc);

      gbc = neueZelle(1,1,1,i+1,0,0);
      this.getContentPane().add(farbe[i], gbc);   //Farbenlabels werden implementiert

      tf[i] = new JTextField("Spieler" + (i+1));  //default Spielername ist Spieler 1 , 2 etc
      tf[i].setEditable(false);                   //solange der checkboxbutton nicht aktiviert ist, kann man den Namen nicht ändern
      gbc = neueZelle(1,1,2,i+1,0,0);
      this.getContentPane().add(tf[i], gbc);

      combob[i] = new JComboBox(new String[] {"Mensch","Computer"});   //erstellt Combobox zur Auswahl des Spielertyps
      combob[i].addActionListener(this);
      combob[i].setEnabled(false);                                     //solange der checkboxbutton nicht aktiviert ist,
                                                                       //kann man den Typ nicht ändern
      combob[i].setEditable(false);                                    //editierbarkeit ist ausgeschalten
      gbc = neueZelle(1,1,3,i+1,0,0);
      this.getContentPane().add(combob[i], gbc);
    }

//Leerzeile wird eingefügt
    lbl2 = new JLabel("");
    gbc = neueZelle(1,4,0,5,0,0);
    gbc.insets =new Insets(5,5,5,5);
    this.getContentPane().add(lbl2, gbc);

/*
* nun werden noch 2 Button, Starten und Beenden in das Dialogfenster implementiert
*/
    btnStarten = new JButton("Starten");
    btnStarten.addActionListener(this);
    gbc = neueZelle(1,1,2,6,0,0);
    this.getContentPane().add(btnStarten, gbc);

    btnAbbrechen = new JButton("Abbrechen");
    btnAbbrechen.addActionListener(this);
    gbc = neueZelle(1,1,3,6,0,0);
    this.getContentPane().add(btnAbbrechen, gbc);


  }//end of SpielerAnzahlDialog


// ----- Logik des SpielerAnzahlDialogd Fenster--------------------------------
  public void actionPerformed(ActionEvent ae)
  {
    Object object = ae.getSource();

    if(object.equals(btnStarten))
    {
//prüft wieviele Spieler teilnehmen
        int SpielerAnz = 0;
        for(int i=0 ; i<4; i++)
        {
            if(checkb[i].isSelected()== true)
            SpielerAnz ++;
        }
/*
*wenn mindestens 2 Spieler teilnehmen, wird überprüft, ob es sich um Computerspieler oder Menschliche
*handelt und die entsprechenden Werte werden übergeben. Dann startet das Spiel
*/
        if (SpielerAnz > 1)
       {
          for(int i=0; i<4 ; i++)
        {
          if(checkb[i].isSelected())
          {
             if("Mensch".equals(combob[i].getSelectedItem()))
             {

             }
             if("Computer".equals(combob[i].getSelectedItem()))
             {

             }
          }
        }  
      }
 
// wenn weniger als 2 Spieler ausgewählt sind erscheint eine Fehlermeldung
        else
        {
            JOptionPane.showMessageDialog(this,
               "Sie müssen mindestens zwei Spieler auswählen, um anfangen zu können!",
               "Fehler",JOptionPane.ERROR_MESSAGE);
        }
    }

//Fenster wird wieder geschlossen
    if(object.equals(btnAbbrechen))
    	antwort = 0;

        setVisible(false);
        dispose();
  }

  public int getAntwort()
  {
    return antwort;
  }

/*
* Wenn der Benutzer einer der Checkboxen aktiviert, kann er den Namen des Spielers und dessen Typ auswählen
* Wenn die Checkbox deaktiviert wird, werden auch die entsprechenden Namen und Typfelder wieder deaktiviert
*/
  public void itemStateChanged(ItemEvent ie)
  {
      for(int i=0; i<4; i++)
      {
        if (checkb[i] == ie.getItemSelectable())
        {
          tf[i].setEditable(!tf[i].isEditable());
          combob[i].setEnabled(!combob[i].isEnabled());
          i = 4;
        }
      }

      boolean enabled = false;
      for(int j=0; j<4; j++)
      {
         if (combob[j].isEnabled() && "Computer".equals( (String) combob[j].getSelectedItem()))
         {
            enabled = true;
         }
      }
   }


  //---- GridBagLayout aufbau ---------------------------------------------------

  private GridBagConstraints neueZelle(int hoehe, int breite, int xpos, int ypos, double x_ausd, double y_ausd)
  {
    GridBagConstraints gbc = new GridBagConstraints();
    gbc.insets =new Insets(1,1,1,1);
    gbc.fill = GridBagConstraints.BOTH;
    gbc.gridwidth = breite;
    gbc.gridheight = hoehe;
    gbc.gridx = xpos;
    gbc.gridy = ypos;
    gbc.weightx = x_ausd;
    gbc.weighty = y_ausd;
    return gbc;
  }

}

So ich hoffe das hilft nun weiter !!!!
 
Kein wunder:
Wenn man etwas in der Combobox auswählt wird die actionPerformed Methode aufgerufen bei der dann das passiert:
Code:
    if(object.equals(btnAbbrechen)) 
    
       antwort = 0; 

        setVisible(false); 
        dispose();

Du solltest hier vieleicht mit annonymen inneren Klassen für die actionListener arbeiten:
Code:
    JButton button = new JButton();
     button.addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent e)
        {
            // TODO Auto-generated method stub

        }
    });
 
Es reicht vollkommen aus die Anweisungen im If-Fall in einen Block zu setzen:

Code:
if(object.equals(btnAbbrechen)) { // Neue Klammer
  antwort = 0; 
  setVisible(false); 
  dispose(); 
} // Neue Klammer
 
sky80 hat gesagt.:
Es reicht vollkommen aus die Anweisungen im If-Fall in einen Block zu setzen:
Hab ich auch dran überlegt, war aber nicht sicher ob er das so will, weil ich zu faul war mir den code anzuschauen :wink:
 
Oh, ich wusste gar nicht , dass er, wenn man den ActionListener anhängt, ohne da schon wirklich eine Logik hinter ist, eine andere Funktion (in dem Fall den Abbrechen Button) nimmt.

Ich habe den actionListener erst mal auskommentiert, weil ich mir gerade gar nicht sicher bin, ob ich den überhaupt brauche.... (sieht im Moment ja nicht so aus) und es funktioniert!!!

Dank an alle
 
waxweazle hat gesagt.:
Oh, ich wusste gar nicht , dass er, wenn man den ActionListener anhängt, ohne da schon wirklich eine Logik hinter ist, eine andere Funktion (in dem Fall den Abbrechen Button) nimmt.

Ich habe den actionListener erst mal auskommentiert, weil ich mir gerade gar nicht sicher bin, ob ich den überhaupt brauche.... (sieht im Moment ja nicht so aus) und es funktioniert!!!

Dank an alle

Also, dass, was Du gerade geschrieben hast, verstehe ich nicht!

Was er immer macht, wenn man einen Button klickt, ist die Methode 'actionPerformed' aufrufen.

Und so, wie Du sie implementiert hattest, hat er halt immer
Code:
setVisible(false); 
dispose();
ausgeführt, weil dies nicht in dem if-Block zu deinem btnAbbrechen steht.
 
waxweazle hat gesagt.:
Oh, ich wusste gar nicht , dass er, wenn man den ActionListener anhängt, ohne da schon wirklich eine Logik hinter ist, eine andere Funktion (in dem Fall den Abbrechen Button) nimmt.
Das ist ja auch nicht der Fall.
Code:
     combob[i].addActionListener(this);
hier weist du den listener zu.
Wenn jetzt eine Aktion ausgeführt wird geht er in die actionPerformed Methode wo dann das passiert:
Code:
     if(object.equals(btnAbbrechen)) 
    
       antwort = 0; 
    //hier ist der if-Teil beendet da du keine Klammern gesetzt hast


    //das wird also in jedem Fall ausgeführt
        setVisible(false); 
        dispose();

Wenn du ihn nicht brauchst ist ja gut, aber ich rate trotzdem immer zu annonymen inneren Klasse, da
jede Komponente dann ihre eigene actionPerformed Methode hat und es so übersichtlicher wird.
[edit]2l8[/edit]
 
ähm ja eigentlich soll ja auch jedes Element seine eigene Funktion mittels ActionListener bekommen...
ich glaube, ich muss noch mal in den Code schauen und Klammern suchen...
denn so wir Ihr das meint, wollte ich es ja auch machen ?!?!? :?
 
waxweazle hat gesagt.:
ähm ja eigentlich soll ja auch jedes Element seine eigene Funktion mittels ActionListener bekommen...
Wie gesagt, das geht dann so:

Code:
     JButton button = new JButton(); 
     button.addActionListener(new ActionListener() 
    { 
        public void actionPerformed(ActionEvent e) 
        { 
            doSomething(); 

        } 
    });

     JButton button2 = new JButton(); 
     button2.addActionListener(new ActionListener() 
    { 
        public void actionPerformed(ActionEvent e) 
        { 
            doSomethingDifferent(); 

        } 
    });
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben