# Popup in Swing



## kpvonnichts (30. Jan 2011)

Hallo,

ich habe ein recht simple Frage zum Erstellen eines Popups in Swing. Und zwar möchte ich mit dem Drücken eines Buttons ein Popup erstellen, in dem es ein Feld gibt, wo man eine Zahl eingeben kann, und einen Knopf, mit dem man diese Zahl abrufen kann. Ich komme da nicht so wirklich weiter, weiß nämlich nicht, wie ich das mit dem Abfragen des Inhaltes vom JNumberField mache und wie ich da noch einen Button in das Popup integriere (mache sowas jetzt zum ersten mal).


```
public void knopf_ActionPerformed(ActionEvent evt) {
      Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
      int x = (d.width - getSize().width) / 2;
      int y = (d.height - getSize().height) / 2;
      PopupFactory factory = PopupFactory.getSharedInstance();
      popup = factory.getPopup(new JFrame(), new JNumberField(), x, y);
      popup.show();
```


----------



## z-mon (30. Jan 2011)

Hallo kpvonnichts,

hast du dich schon einmal mit den grafischen Eingabedialogen JOptionPane auseinandergesetzt? 

Grüße,
Simon


----------



## kpvonnichts (30. Jan 2011)

Hallo,

danke erstmal für die schnelle Antwort. Mit JOptionPane habe ich mich noch nicht auseinandergesetzt, kennst Du da evtl. ein gutes Tutorial zu?

Edit: Hoppla, Du hast ja was verlinkt. Dankeschön, werde ich nachher mal versuchen.


```
String s = javax.swing.JOptionPane.showInputDialog( "Gib hier die Zahl ein" );
int i = Integer.parseInt( s );
```

Verstehe ich das richtig, man wird damit zu einer Zahleingabe aufgefordert und der String s wird dann in ein int umgewandelt? Und muss ich das überhaupt in das Popup integrieren oder ist dieses showInputDialog an sich schon ein Popup?


----------



## turing (30. Jan 2011)

showInputDialog(...) öffnet den Dialog, der blockiert, bis man dort auf OK oder Abbrechen gedrückt hat. Die Eingabe (oder null) kommt als String zurück und wird in s gespiechert. Dieser wird dann in einen int umgewandelt. Wenn es nicht klappt (Benutzer gibt irgendeine Zeichenkette ein), dann knallt's... Sollte natürlich abgefangen werden.


----------



## kpvonnichts (30. Jan 2011)

OK... habe jetzt nur noch ein Problem:

```
public void knopf_ActionPerformed(ActionEvent evt) {
      String nummer = javax.swing.JOptionPane.showInputDialog( "Gib hier die Zahl ein" );
      int zahl= Integer.parseInt( nummer );
      Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
      int x = (d.width - getSize().width) / 2;
      int y = (d.height - getSize().height) / 2;
      PopupFactory factory = PopupFactory.getSharedInstance();
      popup = factory.getPopup(new JFrame(), new JTextArea(this.zahlen.zeigeZahl(zahl)), x, y);
      popup.show();
```

Bekomme die Fehlermeldung "void type not allowed here" in Zeile 8 bei "zahlen.zeigeZahl[...]". Hier der entsprechende Code in der Klasse Zahlen:


```
public void zeigeZahl(int zahl)
    {
        if(zahl < 0) {
        }
        else if(zahl< anzahlZahlen()) {
            System.out.println( zahlen.get(zahl));
        }
        else {
        }
    }
```

Ich habe schon versucht, das in ein int umzuwandeln und zahlen.get(zahl) dann mit return auszugeben, hat aber nicht geklappt.
@turing: Hast Du gerade eine Idee, wie ich das Eingeben von Zeichen, die keine Zahlen sind, unterbinden kann?


----------



## turing (30. Jan 2011)

Was sollt deine Methode zeigeZahl machen? Bisher machst Sie nur eine Ausgabe auf die Konsole, doch verwendest sie als ein Argument in einem Konstruktor, wo ein String erwartet wird. Dann muss sie wohl auch eine String ->zurückgeben, damit dsa funktioniert. 

Ich vermute (!) mal, ohne eine Ahnung zu haben, was "zahlen" bei Dir genau ist, dass Du den ausgebenen Text als Zeichenkette zurückgeben möchtest bzw. einen Leerstring, wenn die entsprechende Bedingung nicht eintritt. Unter Berücksichtigung der unötigen If-Else-Verschachtelungen:


```
public String zeigeZahl(int zahl) {
  if(zahl >= 0 && zahl < anzahlZahlen()) {
    return Integer.toString(zahlen.get(zahl)));
  } else {
    return "";
  }
}
```

Aber wie gesagt, nur Spekulationen, weil ich Dein restliches Programm nicht kenne.


----------



## kpvonnichts (30. Jan 2011)

"zahlen" sind im Prinzip keine zahlen, sondern eine Arraylist (private ArrayList<String> zahlen; ). Jetzt soll eben ein Element davon (zahlen.get(zahl) ) ausgegeben werden.
Sorry, ich habe nicht ganz verstanden, was Dein Code bewirken soll. Kannst Du mir das bitte nochmal erklären?


----------



## turing (30. Jan 2011)

..."this.zahlen.zeigeZahl(zahl)"...

wird dann aber wohl verkehrt sein, da zeigeZahl bestimmt nicht eine Methode in Deiner ArrayList ist, sondern vermutlich in der Klasse, in der Du dich zum Zeitpunkt des Aufrufes befindet. Also:

..."this.zeigeZahl(zahl)"...
 (auch ohne this an dieser Stelle)

Ich habe deine Methode abgeändert, so dass sie einen Wert (String) zurückgibt.


----------



## kpvonnichts (30. Jan 2011)

Doch doch, zeigeZahl(int zahl) ist eine Methode in der Klasse mit der ArrayList. Die möchte ich ganz einfach im GUI ausführen, indem man eingibt, welche Zahl man angezeigt bekommen möchte. Der Wurm ist hier drin:

```
popup = factory.getPopup(new JFrame(), new JTextArea(this.zahlen.zeigeZahl(zahl)), x, y);
```
Wie gesagt, da steht void not allowed here.

Habe versucht, Deine Methode einzubauen. Vielen Dank aufjedenfall schonmal. Jetzt ist nur das Problem, dass er toString nicht findet. Was muss ich dafür importieren?


----------



## turing (30. Jan 2011)

Wenn es String s sind in der ArrayList brauchst du natürlich nicht mit toString umzunwandeln. Hatte gedacht, es wären Integer. Also dann einfach:


```
public String zeigeZahl(int zahl) {
  if(zahl >= 0 && zahl < anzahlZahlen()) {
    return zahlen.get(zahl);
  } else {
    return "";
  }
}
```


----------



## kpvonnichts (30. Jan 2011)

Danke für Deine Hilfe es hat funktioniert!


----------

