表单更新前,必须先点击两次Jave Swing JButton

时间:2018-09-06 19:47:03

标签: java swing jbutton

(对我来说)这是一个奇怪的问题,我什至不知道该怎么问。我有一个自定义控件NewOtherPaidOutsEntry,其中包含两个文本字段,一个“保存”按钮和一个“取消”按钮。主窗口包含一个表单,该表单内是可选的OtherPaidOuts列表。 NewOtherPaidOutsEntry添加在此列表的底部,因此用户可以将条目添加到列表。 我用一个方法newOtherPaidOutsActionEmitted和一个在NewOtherPaidOutsEntry中名为setNewOtherPaidOutsListener的方法创建了一个接口NewOtherPaidOutsListener。父表单像这样设置此新条目(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()只是将两个文本字段设置为空文本。在JPanel OtherPaidOutsPane中,OtherPaidOuts的列表是该列表,它是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中。

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

如果我没有提供足够的示例代码,我表示歉意,但是该项目的这一阶段是如此根深蒂固,很难给出一个可运行的示例。请让我知道我还需要提供什么,我将很高兴为您提供。并且请理解,我正坐在我的裤子旁边坐飞机,所以请在解释时友善;-)谢谢!

1 个答案:

答案 0 :(得分:1)

将组件动态添加到可见的GUI时,基本代码为:

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

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

  

我想我可以只用一个对话框输入一个新条目,

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

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