JOptionPane.showOptionDialog 使用自定义面板无法正常工作

JOptionPane.showOptionDialog using custom panel is not working properly

在我的应用程序中,需要在用户提供输入时频繁显示 JOptionPane.showOptionDialog。

有时不显示,等待用户输入并挂起。

我在这里附上了示例代码以重现相同的内容。

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]);
    }
}
}

o/p 显示为

"Test question message index = 0" 并单击确定

"Test question message index = 1" 并单击确定

随机上一个,JOptionPane.showOptionDialog不显示。

请任何人帮助我!!!提前致谢。

您需要如下更改代码。

        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();
        }