gpt4 book ai didi

java - Java Swing JButton 在表单更新之前必须单击两次

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

(对我来说)这是一个很奇怪的问题,我什至不知道如何问它。我有一个自定义控件 NewOtherPaidOutsEntry,其中包含两个文本字段、一个“保存”按钮和一个“取消”按钮。主窗口包含一个表单,该表单内有一个可选的 OtherPaidOuts 列表。 NewOtherPaidOutsEntry 添加到此列表的底部,以便用户可以将条目添加到列表中。我创建了一个接口(interface) NewOtherPaidOutsListener,其中包含一个方法 newOtherPaidOutsActionEmission,并在 NewOtherPaidOutsEntry 中创建了一个名为 setNewOtherPaidOutsListener 的方法。父表单像这样设置这个新条目(EditAction 只是一个枚举,请注意,为了清楚起见,我省略了真正的异常处理):

private void setupNewEntry() {
this.newEntry = new NewOtherPaidOutsEntry(this.shiftId);
this.newEntry.setNewOtherPaidOutsListener((EditAction action) -> {
try {
handleNewOtherPaidOuts(action);
} catch (Exception e) {
handleException(e);
}
});
}

handleNewOtherPaidOuts 是这样的:

private void handleNewOtherPaidOuts(EditAction action) {
switch (action) {
case SAVE:
System.out.println("Save NewOtherPaidOuts");
OtherPaidOutsController.addShiftOtherPaidOut(newEntry);
newEntry.reset();
layoutPanel();
shiftLeftPane.update();
break;
case CANCEL:
System.out.println("Cancel NewOtherPaidOuts");
break;
}
}

我输入了 println 语句,发现单击按钮后它就被执行了。如果我单步执行调试,一切都会正常。但是,如果我只是运行该应用程序,则 OtherPaidOuts 列表不会更新,直到我再次单击新条目的“保存”按钮。第一次单击时,按钮保持按下状态。

addShiftOtherPaidOut(newEntry) 执行数据库插入。 newEntry.reset() 只是将两个文本字段设置为空文本。 OtherPaidOuts 列表位于 JPanel OtherPaidOutsPane 中,其作为layoutPanel() 方法:

protected void layoutPanel() {
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
add(createTitlePanel());
add(Box.createVerticalStrut(10));
getOtherPaidOutsEntries();
add(newEntry);
add(Box.createVerticalGlue());
}

方法 getOtherPaidOutsEntries 只是获取此记录的现有条目列表,并将它们添加到 OtherPaidOutsPane。然后将 OtherPaidOutsPane 嵌入到另一个 JPanel ShiftLeftPane 中。

我想我可以使用一个对话框来输入新条目,但是......我想我会先尽力使用这条路线。

如果我没有提供足够的示例代码,我深表歉意,但是该项目的这个阶段是如此根深蒂固,很难提供可运行的示例。请让我知道我还需要提供什么,我很乐意提供。请理解,我只是凭感觉行事,所以请善待任何解释;-) 谢谢!

最佳答案

当您动态地将组件添加到可见 GUI 时,基本代码是:

panel.add(....);
panel.revalidate();
panel.repaint();

默认情况下,Swing 组件的大小为 (0, 0),因此无需 Paint() 任何内容。您需要 revalidate() 来调用布局管理器,以便根据布局管理器的规则为组件指定大小和位置。

I guess I could just use a dialog box for a new entry,

没有详细阅读您的整个问题,因为很难了解您正在做的事情的背景。

但是,如果您有多个条目,那么也许您应该使用 JTable 来显示数据。然后您可以使用 JDialog 提示输入数据,然后将数据添加到 JTable。这比尝试添加/删除面板更容易管理。

关于java - Java Swing JButton 在表单更新之前必须单击两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52211201/

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