(对我来说)这是一个奇怪的问题,我什至不知道该怎么问。我有一个自定义控件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中。
我想我可以只使用一个对话框输入一个新条目,但是...我想我会首先使用这条路线。
如果我没有提供足够的示例代码,我表示歉意,但是该项目的这一阶段是如此根深蒂固,很难给出一个可运行的示例。请让我知道我还需要提供什么,我将很高兴为您提供。并且请理解,我正坐在我的裤子旁边坐飞机,所以请在解释时友善;-)谢谢!
答案 0 :(得分:1)
将组件动态添加到可见的GUI时,基本代码为:
panel.add(....);
panel.revalidate();
panel.repaint();
默认情况下,Swing组件的大小为(0,0),所以没有paint()的内容。您需要revalidate()来调用布局管理器,以便根据布局管理器的规则为组件指定大小和位置。
我想我可以只用一个对话框输入一个新条目,
没有详细阅读您的整个问题,因为很难获得您正在做的事情的背景信息。
但是,如果您有多个输入项,那么也许您应该使用JTable来显示数据。然后,您可以使用JDialog提示输入数据,然后将数据添加到JTable。与尝试添加/删除面板相比,管理起来要容易得多。