gpt4 book ai didi

java - Swing 对象: first setText() gets "stuck" when using Mac Java SE 6

转载 作者:行者123 更新时间:2023-11-30 01:39:01 24 4
gpt4 key购买 nike

我是一名 Java 新手,试图维护一个在 J2SE 5.0(32 位和 64 位)下运行良好的应用程序,但在 Java SE 6 64 位下运行时遇到一个非常具体的问题:

[Tims-MPB:~] tlynch% java -version
java version "1.6.0_15"
Java(TM) SE Runtime Environment (build 1.6.0_15-b03-226)
Java HotSpot(TM) 64-Bit Server VM (build 14.1-b02-92, mixed mode)

该应用程序是跨平台的,据报道可以在 Windows 下的 Java SE 6 上正常工作,但我自己还无法验证这一点。

该程序使用 JTextField 进行某些文本输入,并使用 JLabel 指示要输入的文本。第一次调用 showDialog() 方法来设置标签文本并显示对话框时,它可以正常工作,但后续调用都会导致显示初始调用中的标签,而不是最近通过 setText() 指定的标签.

public void showDialog(String msgText)
{
System.out.println("set ChatDialog: " + msgText);
jLabel1.setText(msgText);
jLabel1.repaint(); // I added this; it didn't help
System.out.println("get ChatDialog: " + jLabel1.getText());
super.setVisible(true);
}

[类(class)全文如下]

添加的 printlns 验证预期文本是否已传递到标签的 setText() 方法,并通过使用 getText() 检索它来确认,但屏幕/GUI 上显示的始终是第一次使用该方法时的文本被调用该对象。

用于标记另一个对话框的 JTextArea 也存在类似问题。

这些问题在 OS 10.5.x 和 10.6.x 下运行 Java SE 6 的多个 Mac 系统中是一致的,但当恢复到 J2SE 5.0 时,永远不会观察到这些问题。

如果我遗漏了一些与此问题相关的背景信息,请告诉我。任何见解或建议表示赞赏。

package gui;

import java.awt.*;
import java.awt.event.KeyEvent;
import javax.swing.*;

// Referenced classes of package gui:
// MyJPanel, ChatDialog_jTextField1_keyAdapter, WarWindow

public class ChatDialog extends JDialog
{

public ChatDialog(JFrame parent, WarWindow w)
{
super(parent, true);
text = "";
borderLayout1 = new BorderLayout();
jPanel1 = new MyJPanel();
borderLayout2 = new BorderLayout();
jPanel2 = new MyJPanel();
jPanel3 = new MyJPanel();
jLabel1 = new JLabel();
jTextField1 = new JTextField();
warWindow = w;
try
{
jbInit();
}
catch(Exception exception)
{
System.out.println("Problem with ChatDialog init");
exception.printStackTrace();
}
return;
}

public String getText()
{
return text;
}

void jTextField1_keyPressed(KeyEvent e)
{
int id = e.getKeyCode();
switch(id)
{
case 10: // '\n'
text = jTextField1.getText();
setVisible(false);
break;
}
}

private void jbInit()
throws Exception
{
setLocation(232, 450);
setSize(560, 60);
setModal(true);
setResizable(false);
setUndecorated(true);
getContentPane().setLayout(borderLayout1);
jPanel1.setLayout(borderLayout2);
jPanel2.setMinimumSize(new Dimension(10, 20));
jPanel2.setPreferredSize(new Dimension(10, 20));
jLabel1.setPreferredSize(new Dimension(380, 15));
jLabel1.setHorizontalAlignment(0);
jLabel1.setText("Chat Message");
jTextField1.setPreferredSize(new Dimension(520, 21));
jTextField1.setRequestFocusEnabled(false);
jTextField1.addKeyListener(new ChatDialog_jTextField1_keyAdapter(this));
getContentPane().add(jPanel1, "Center");
jPanel1.add(jPanel2, "North");
jPanel2.add(jLabel1, null);
jPanel1.add(jPanel3, "Center");
jPanel3.add(jTextField1, null);
}

public void setVisible(boolean b)
{
jTextField1.setText("");
super.setVisible(b);
}

public void showDialog(String msgText)
{
System.out.println("set ChatDialog: " + msgText);
jLabel1.setText(msgText);
jLabel1.repaint(); // I added this; it didn't help
System.out.println("get ChatDialog: " + jLabel1.getText());
super.setVisible(true);
}

void this_keyPressed(KeyEvent e)
{
int id = e.getKeyCode();
switch(id)
{
case 10: // '\n'
System.exit(88);
break;
}
}

BorderLayout borderLayout1;
BorderLayout borderLayout2;
JLabel jLabel1;
JPanel jPanel1;
JPanel jPanel2;
JPanel jPanel3;
JTextField jTextField1;
String text;
WarWindow warWindow;
}

最佳答案

可视化组件应该仅由事件处理线程操作。

也许你应该这样做:

SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
System.out.println("set ChatDialog: " + msgText);
jLabel1.setText(msgText);
System.out.println("get ChatDialog: " + jLabel1.getText());
super.setVisible(true);
}
});

关于java - Swing 对象: first setText() gets "stuck" when using Mac Java SE 6,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1699107/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com