当前位置: 首页 > 知识库问答 >
问题:

JoptionPane.ShowMessageDialog未显示文本

司寇山
2023-03-14

在使用joptionPane.showMessageDialog()方法时,我似乎遇到了一些问题。当我使用该方法时,唯一正确设置的是对话框的标题。它不想显示我提供的文本。

下面是我用来创建警报的代码:

 JOptionPane.showMessageDialog(null, "alert", "alert", JOptionPane.ERROR_MESSAGE);

上面的代码提供了下面的图像:

如果有人能告诉我,我做错了什么,或者有没有一个不同的方法,我应该使用,我将非常感谢。

编辑:

我的主类:这创建了一个GUI,用户在其中输入信息“host”和“displayName”。当他们单击“Connect”时,就会创建一个新线程(ClientConnectSocket)。

public class Main extends JFrame {

public static JPanel contentPane;
private JTextField hostTxt;
public static JTextField displayNameTxt;

JLabel lblDisplayName = new JLabel("Display Name:");
JButton btnConnect = new JButton("Connect");
JLabel lblHost = new JLabel("Host:");


public static String username = "None :(";
public static String host = "localhost";

public static boolean connected = false;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                Main frame = new Main();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the frame.
 */
public Main() {
    setType(Type.UTILITY);
    setTitle("Java Chat Client - v0.1");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 390, 200);
    contentPane = new JPanel();
    this.setResizable(false);
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(null);


    lblHost.setBounds(60, 11, 56, 19);
    contentPane.add(lblHost);

    hostTxt = new JTextField();
    hostTxt.setBounds(165, 10, 103, 20);
    contentPane.add(hostTxt);
    hostTxt.setColumns(10);


    btnConnect.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            if (hostTxt.getText() == null || displayNameTxt.getText() == null){

            }else{
                Thread ccs = new ClientConnectSocket(hostTxt.getText(), displayNameTxt.getText());
                ccs.start();
                while (!connected){
                    //System.out.println("Not connected yet..");
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("Yey, connected");
                username = displayNameTxt.getText();
                host = hostTxt.getText();

                EventQueue.invokeLater(new Runnable() {
                    public void run() {
                        try {
                            Chat frame = new Chat();
                            frame.setVisible(true);

                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                });
                dispose();

            }
        }
    });
    btnConnect.setBounds((this.getWidth()/2)- 70, 76, 89, 23);

    contentPane.add(btnConnect);

    displayNameTxt = new JTextField();
    displayNameTxt.setColumns(10);
    displayNameTxt.setBounds(165, 45, 103, 20);
    contentPane.add(displayNameTxt);


    lblDisplayName.setBounds(60, 41, 95, 29);
    contentPane.add(lblDisplayName);

    this.getRootPane().setDefaultButton(btnConnect);
}   

ClientConnectSocket类:

public class ClientConnectSocket extends Thread{

String host;
String name;

public ClientConnectSocket(String host, String displayName){
    this.host = host;
    this.name = displayName;
}

boolean b = true;

public void run(){
    try{
        while (b){
            Socket server = new Socket(host, 6969);
            System.out.println("Sending info to try and connect.");

            BufferedWriter out = new BufferedWriter(new OutputStreamWriter(server.getOutputStream()));
            out.write("method=connect:displayName="+ name);
            out.flush();

            Thread.sleep(500);

            InputStream in = server.getInputStream();

            StringBuffer sb = new StringBuffer();
            byte[] buffer = new byte[1024];
            int buf;
            while ((buf = in.read(buffer)) != -1){
                String line = new String(buffer, 0, buf);

                sb.append(line);
            }
            in.close();
            System.out.println(sb.toString() + " || " + sb.toString().equalsIgnoreCase("connect"));

            if (sb.toString().equalsIgnoreCase("connect")){
                //Allow them to connect
                Main.connected = true;
            }else if(sb.toString().equalsIgnoreCase("invalid:Username")){
                //Tell them they have username already taken;
                 JOptionPane.showMessageDialog(null, "alert", "alert", JOptionPane.ERROR_MESSAGE);
                b = false;
            }

            server.close();
            out.close();
            in.close();

            b = false;
        }
    }catch (Exception e){
        System.exit(2);
        e.printStackTrace();
    }
}

共有1个答案

穆宾白
2023-03-14

您发布的代码片段表明您遇到了Swing线程问题。如果您的程序是Swing GUI,那么上面的大部分代码需要从Swing EDT或eventdispatchthread调用,而任何Swing调用,包括显示JOptionPane,都应该在EDT上调用。要获得更具体的帮助,请考虑讲述和显示更多关于您的代码和您对后台线程的使用。

编辑
确定,使代码位于后台线程中。所以现在您必须注意在EDT上显示您的JOptionPane。请考虑进行以下更改:

} else if(sb.toString().equalsIgnoreCase("invalid:Username")) {

    b = false;

    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            JOptionPane.showMessageDialog(null, "alert", "alert", 
               JOptionPane.ERROR_MESSAGE);          
        }
    });
}

注意:未经编译或运行测试的代码。请小心错别字。

 btnConnect.addActionListener(new ActionListener() {
     public void actionPerformed(ActionEvent arg0) {
        if (hostTxt.getText() == null || displayNameTxt.getText() == null) {

        } else {

           // .........

           // ********** you should not have this type of code on the EDT
           while (!connected) {
              // ........
           }

           // ...............
        }
     }
   });
 类似资料:
  • 我有一个自定义背景编辑文本。当他们的键盘打开-屏幕调整显示集中编辑文本,问题是,它削减了我的自定义背景。 什么是最好的方式显示我的编辑文本包括他的敲击白背景时,键盘打开? 我的清单现在是调整设置。

  • 在一个应用程序屏幕上,我有许多EditText视图。我的应用程序是使用材料设计(AppCompactActivity等)构建的。 当显示一个EditText字段时,长按我会尝试选择文本中的一些单词。这允许我复制或共享该文本。选择一个以上的单词似乎是不可能的。 自从迁移到材质设计之后,我看到了两件事: 是的,我使用'android:textisselectable=“true”‘。您可以在下面看到E

  • 我直接从书上抄了这些例子。代码应该在JFrame上绘制一些东西,但没有显示任何东西(除了JFrame),这里是带有main方法的类 下面是JPanel的一个子类

  • 我试图在应用程序启动时显示项目的listview。但在应用程序启动时,没有显示listview,只有一个空白屏幕。下面是代码: MainActivity.java 但是现在我在logcat中得到了以下内容: 并且应用程序停止..请帮助!

  • 我把拐角半径设为10。但图像视图不显示角半径。 我也尝试过使用,但也不起作用。 当我在图像视图上使用背景色时,如下所示,它完美地显示了带有圆角的视图。 我还尝试更改图像的图像、宽度和高度,以检查图像对于视图是否太大。但它也不起作用。 我就是这样调用ImageView的。

  • 我试图做一个简单的菜单游戏pyplay,但我正在努力显示菜单按钮的交互式文本。我有一个非常简单的菜单,有“开始”和“退出”选项,我试图用我制作的按钮类来显示它们。 由于某种原因,按钮背景会闪烁,但文本不会出现。我得到了一堆矩形,当我滚动它们时,它们会正确地改变颜色,但没有文本。 我看了类似的问题,但似乎不明白为什么我的问题不起作用。任何帮助或指导都将不胜感激。 下面是一个代码示例。颜色在单独的py