gpt4 book ai didi

触发 addMouseListener 事件后 Java GUI 未完全加载

转载 作者:行者123 更新时间:2023-12-01 14:08:19 25 4
gpt4 key购买 nike

我有以下代码来跟踪用户在表中选择的内容,在用户选择聊天对话后,我想隐藏包含该表的 JPanel 并显示 JPanel 包含聊天对话。请参阅我当前执行此操作的代码:

       table.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
JTable target = (JTable) e.getSource();
int row = target.getSelectedRow();
int column = target.getSelectedColumn();


// loop through all elements in the table
for (int i = 0; i < listmodel.size(); i++) {

// get the table item associated with the current element
final Object object = listmodel.get(i);
if (object instanceof ListItem) {
ListItem listitem = (ListItem) object;

if (table.getValueAt(table.getSelectedRow(), 0).toString() == listitem.getText()) {

// Show the chat conversation (this is where the GUI for some reason does not fully load)
SwingUtilities.invokeLater(new Runnable() {
public void run() {
pnlMainTableWrapper.setVisible(false); // Contains the table
pnlChatMsgs.setVisible(true);
pnlSendMsg.setVisible(true);
pnlRight.setVisible(true);

pnlChatMsgs.validate();
pnlChatMsgs.repaint();
}
});
}
}
}
}
}
});

出于某种奇怪的原因,并非 JPanel pnlChatMsgs 中的所有 GUI 组件都被加载,这些组件只是白色的。

有什么想法导致这种行为吗?

最佳答案

每当我看到代码尝试在同一位置使用两个组件时,最好使用 Card Layout并让它随时管理哪个组件可见。

如果您尝试自己管理它,那么设计时的代码应该是这样的:

JPanel parent = new JPanel();
JPanel child1 = new JPanel();
JPanel child2 = new JPanel();
child2.setVisible(false);
parent.add( child1 );
parent.add( child2 );

然后在运行时交换面板时,您将执行以下操作:

child1.setVisible(false);
child2.setVisible(true);
parent.revalidate();
parent.repaint();

我仍然推荐 CardLayout,这样你就不用重新发明轮子了。

此外,invokeLater() 可能不是必需的,因为所有 Swing 事件代码都已在 EDT 上执行。

关于触发 addMouseListener 事件后 Java GUI 未完全加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18735065/

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