JOptionPane.showOptionDialog verhindert Vollendung des Programms- Java

ascawath

Mitglied
Hi,

ich habe habe jetzt zwei JOptionPanes hintereinander gesetzt, die auch soweit funktionieren.
Mit den Dialogen lasse ich Namen eintragen. Wenn das zweite Fenster fertig ist, soll das wieder in die vorherige Methode gehen,
wo dann auch repaint() aufgerufen wird. Bis dahin geht das auch, aber die Methode paint() wird nie wirklich aufgerufen, weswegen

diese beiden Dialoge das Programm irgendwie blockieren. Wenn ich die Methode auskommentiere, klappt das aller gut.

Code:
public void setPlayer() {
		Object[] options1 = { "Erstellen" };
		Object[] options2 = { "Weiteren Spieler hinzufügen", "Spielen" };

		JPanel panel1 = new JPanel();
		panel1.add(new JLabel("Bitte den Namen des Spielers eingeben"));
		JTextField textField = new JTextField(15);
		panel1.add(textField);
		
		JPanel panel2 = new JPanel();
		String input = "";

		int result = JOptionPane.showOptionDialog(this,
				panel1,
				"Spieler - Charackter",
				JOptionPane.YES_OPTION,
				JOptionPane.PLAIN_MESSAGE,
				null,
				options1,
				null);
		if (result == JOptionPane.YES_OPTION){
			if(input.equals(null)) {
				input = textField.getText();
			}	
			panel2.add(new JLabel("Der Spieler "+input+" wurde erstellt"));
			result = JOptionPane.showOptionDialog(this,
					panel2,
					"Spieler - Charackter",
					JOptionPane.YES_NO_OPTION,
					JOptionPane.PLAIN_MESSAGE,
					null,
					options2,
					null);
			Player pl = new Player(textField.getText());
			Players.insert(pl);
		}
		if (result == JOptionPane.YES_OPTION){
			setPlayer();
		}
	}

Die Methode setPlayer() wird in der Methode content() aufgerufen, die wiederum vom Konstruktor aufgerufen wird.

Vielleicht wisst ihr ja etwas.

MfG Ascawath
 
Ich habe das jetzt einfach mal so gelöst, dass ich das in einen anderen Thread gepackt habe.

Aber falls ihr noch andere Ideen habt, die nehme ich gerne an.
 
Hab das Ganze jetzt mal so einfach wie möglich getestet:

Java:
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Player extends JFrame{
    /**
    * 
    */
    private static final long serialVersionUID = 1L;
   
    public static void main(String[]args){
        Player p = new Player();
        p.setPlayer();
    }
    public Player(){
       
    }
    public void setPlayer() {
        String[] options1 = { "Erstellen" };
        String[] options2 = { "Weiteren Spieler hinzufügen", "Spielen" };

        JPanel panel1 = new JPanel();
        panel1.add(new JLabel("Bitte den Namen des Spielers eingeben"));
        JTextField textField = new JTextField(15);
        panel1.add(textField);
       
        JPanel panel2 = new JPanel();
        String input = "";

        int result = JOptionPane.showOptionDialog(this,
                panel1,
                "Spieler - Charackter",
                JOptionPane.YES_OPTION,
                JOptionPane.PLAIN_MESSAGE,
                null,
                options1,
                null);
        if (result == JOptionPane.YES_OPTION){
            if(input.equals(null)) {
                input = textField.getText();
            }  
            panel2.add(new JLabel("Der Spieler "+input+" wurde erstellt"));
            result = JOptionPane.showOptionDialog(this,
                    panel2,
                    "Spieler - Charackter",
                    JOptionPane.YES_NO_OPTION,
                    JOptionPane.PLAIN_MESSAGE,
                    null,
                    options2,
                    null);
//            Player pl = new Player(textField.getText());
//            Players.insert(pl);
        }
        if (result == JOptionPane.YES_OPTION){
            setPlayer();
        }
    }
}

Das was du da machst sollte eigentlich ohne eigenen Thread funktionieren. Ohne den gesamten Code ist das allerdings schwer zu beurteilen.

Eine Kleinigkeit noch verwende nie den Datentyp Objekt. Du möchtest hier zwei String Arrays übergeben diese leiten von der Klasse Objekt ab. JOptionPane nimmt alle Arrays welche von Objekt ableiten(alles) entgegen und ruft intern die toString Methode auf um den Text zurückzugeben. Die Verwendung des Datentyp Objekt macht einen Code meist unnötig kompliziert. Da hier so tolle Dinge funktionieren wie:

Java:
Object[] NimmAllesEntgegen = {'a', "peter", 15};

Viele Grüße
Youza
 

Neue Beiträge

Zurück