2016-06-14 15 views
0

In meiner Anwendung muss JOptionPane.showOptionDialog häufig angezeigt werden, wenn Benutzer Eingabe bereitstellen.JOptionPane.showOptionDialog mit benutzerdefinierten Panel funktioniert nicht richtig

Manchmal wird es nicht angezeigt und es wartet auf Benutzereingaben und hängt.

Hier habe ich den Beispielcode hinzugefügt, um das gleiche zu reproduzieren.

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.GridBagLayout; 

import javax.swing.JLabel; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.JTextPane; 
import javax.swing.ToolTipManager; 
import javax.swing.text.BadLocationException; 
import javax.swing.text.DefaultStyledDocument; 
import javax.swing.text.Style; 
import javax.swing.text.StyleConstants; 
import javax.swing.text.StyleContext; 
import javax.swing.text.StyledDocument; 

public class TestJOptionPane { 

public static void main(String[] args) { 

    for (int index = 0; index < 20; index++) { 
     String serverMessage = "Test question message index = "+index; 
     String hintText = "Test question hint index = "+index; 

     JPanel mainPanel = new JPanel(new BorderLayout(0,4)); 
     JPanel answerPanel = new JPanel(new GridBagLayout()); 

     StyleContext context = new StyleContext(); 
     StyledDocument document = new DefaultStyledDocument(context); 

     Style style = context.getStyle(StyleContext.DEFAULT_STYLE); 
     StyleConstants.setFontFamily(style, "Dialog"); 
     StyleConstants.setFontSize(style, 12); 
     StyleConstants.setBold(style, true); 

     try { 
      document.insertString(document.getLength(), serverMessage, style); 
     } catch (BadLocationException badLocationException) { 
      System.out.println(badLocationException.getMessage()); 
     } 

     JTextPane questionTA = new JTextPane(document); 
     questionTA.setEditable(false); 
     questionTA.setOpaque(false); 

     final JTextField answerField = new JTextField(); 
     answerField.setPreferredSize(new Dimension(410,23)); 
     answerField.requestFocus(); 

     JLabel hint = new JLabel(); 

     ToolTipManager.sharedInstance().setDismissDelay(10000); 
     hint.setText("Hint"); 
    // hint.setIcon(Utility.getIcon("HintQuestion.png")); 

     answerPanel.add(answerField); 
     answerPanel.add(new JPanel().add(hint));       
     answerPanel.setPreferredSize(new Dimension(450, 30)); 
     mainPanel.add(questionTA,BorderLayout.NORTH); 
     mainPanel.add(answerPanel,BorderLayout.SOUTH); 

     hint.setToolTipText(hintText); 

     String[] options = {"OK"}; 
     JOptionPane.showOptionDialog(null, mainPanel, "Test showOptionDialog", JOptionPane.OK_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[0]); 
    } 
} 
} 

Die o/p angezeigt wie

"Test Frage Nachricht index = 0" und klicken Sie auf OK

"Test Frage Nachricht Index = 1" und klicken Sie auf OK

Auf einem zufälligen Der JOptionPane.showOptionDialog wird nicht angezeigt.

Bitte jeder kann mir helfen !!! Danke im Voraus.

+1

Siehe [* Anfängliche Themen *] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html). – trashgod

Antwort

2

Sie müssen Ihren Code wie folgt ändern.

 try { 
      SwingUtilities.invokeAndWait(new Runnable() { 

       @Override 
       public void run() { 
        int result = JOptionPane.showOptionDialog(null, mainPanel, "Test showOptionDialog", JOptionPane.OK_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[0]); 
       } 
      }); 
     } catch (InvocationTargetException e) { 
      e.printStackTrace(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
+0

Danke für Ihre Antwort Beniton. Eigentlich meine Methode sieht wie public Object Sendresponse (String Status, String serverMessage, String functionName-, String hintText) throws Remote { // Über Code und das Rückbenutzereingaben an den Server } Wenn ich invokeAndWait verwenden, ist es seperate thread dann wie gebe ich answerField.getText() an meine Aufrufer-Methode zurück – Tamil

+1

@Lokesh Sie können ObserverPattern implementieren. Machen Sie das Textfeld beobachtbar und haben Sie einen Beobachter, der benachrichtigt werden soll, wenn er den userInput zurückgibt. – Beniton