Java JOptionPane.showMessageDialog不显示文本
在使用JOptionPane.showMessageDialog()方法时,我似乎遇到了一些问题。 当我使用该方法时,唯一正确设置的是对话框标题。它不想显示我提供的文本 下面是我用来尝试创建警报的代码:Java JOptionPane.showMessageDialog不显示文本,java,swing,dialog,jpanel,Java,Swing,Dialog,Jpanel,在使用JOptionPane.showMessageDialog()方法时,我似乎遇到了一些问题。 当我使用该方法时,唯一正确设置的是对话框标题。它不想显示我提供的文本 下面是我用来尝试创建警报的代码: JOptionPane.showMessageDialog(null, "alert", "alert", JOptionPane.ERROR_MESSAGE); 上面的代码提供了下图: 如果有人能告诉我我做错了什么,或者我应该使用一种不同的方法,我会非常感激 编辑: 我的主要班级: 这将
JOptionPane.showMessageDialog(null, "alert", "alert", JOptionPane.ERROR_MESSAGE);
上面的代码提供了下图:
如果有人能告诉我我做错了什么,或者我应该使用一种不同的方法,我会非常感激
编辑:
我的主要班级:
这将创建一个GUI,用户在其中输入信息“主机”和“显示名称”。当他们单击“连接”时,将创建一个新线程(ClientConnectSocket)
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();
}
}
您发布的代码片段表明您遇到了Swing线程问题。如果您的程序是Swing GUI,则需要从Swing EDT或事件调度线程中调用上述大部分代码,而任何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);
}
});
}
注意:代码未通过编译或运行进行测试。请注意打字错误
编辑2
另外,您还有其他问题,包括连接的变量不应该是静态的。您还存在线程问题:
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) {
// ........
}
// ...............
}
}
});
你的电脑没有使用nVidea视频卡,是吗?如果没有,请考虑创建和发布。它确实使用NVIDIA图形卡。这个问题似乎只有当我使用对话框作为JFrice工作良好。看看。所以如果没有文字改变后的视频卡的设置,然后考虑创建和张贴。请参阅编辑回答。+ 1谢谢你这么多。我考虑了你所说的,并提出了以下解决方案(请告诉我是否可以使其更好/更有效):我在“Main”类中创建了一个静态方法,如果连接成功,我将调用该方法(这将为用户创建下一个窗口)。如果连接成功而不需要“while(!connected)”,则后台线程(“ClientConnectSocket”类)将调用该函数。如果连接不成功,则调用您提供的第一个编辑(在后台线程中)以显示错误消息。这一切都是有效的。@TGRHavoc:是的,在这种情况下,我将不得不提醒你使用静态任何东西。这是不需要的,而且这使得增强和测试代码变得非常困难。你能详细说明一下吗?我最近才开始编写Java程序,我的老师从来没有提到使用静态任何东西都可能导致您所谈论的问题。这很好。我一直在阅读其他一些开发人员的帖子,他们似乎都得出了与您相同的结论。所以我决定引用我的主类,并通过引用使用变量。这会是一个沟渠解决方案吗?
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) {
// ........
}
// ...............
}
}
});