经过大量的研究,我似乎找不到任何问题。我正在创建一个程序,用户可以选择他们想要使用的选项卡(JTabbedPane)。在该选项卡中,我有一个JPanel,当用户选择选项卡时,我将其添加到选项卡。
private void tabEventsStateChanged(javax.swing.event.ChangeEvent evt) {
if (tabEvents.getSelectedComponent().equals(tabAddEvent)) {
JPanel jp = new AddEvent();
tabAddEvent.setLayout(new GridBagLayout());
tabAddEvent.add(jp);
tabAddEvent.updateUI();
}
else if (tabEvents.getSelectedComponent().equals(tabEditEvent)) {
JPanel jp = new EditEvent();
tabEditEvent.setLayout(new GridBagLayout());
tabEditEvent.add(jp);
tabEditEvent.updateUI();
}
else if (tabEvents.getSelectedComponent().equals(tabDeleteEvent)) {
JPanel jp = new DeleteEvent();
tabDeleteEvent.setLayout(new GridBagLayout());
tabDeleteEvent.add(jp);
tabDeleteEvent.updateUI();
}
else {
System.out.println("Error! Tab Not Selected!");
}
}
JPanels中心完美。但是,当我在tabAddEvent之后单击tabEditEvent(或tabDeleteEvent)然后返回tabAddEvent时,我很沮丧地发现,JPanel再次添加。这创建了一个奇怪的UI,我有2个相同的形式并排放置,不再位于中心...与tabEditEvent和tabDeleteEvent相同。如果我点击任何标签3次,我将有3个JPanels添加到容器中,依此类推......
更新
这是我朋友计划原始代码的一部分:
else if (tabEvents.getSelectedComponent().equals(tabEditEvent)) {
JPanel jp = new EditEvent();
tabEditEvent.setLayout(new BorderLayout());
tabEditEvent.add(jp, BorderLayout.CENTER);
tabEditEvent.updateUI();
}
更新2
为了解决这个问题的绝望尝试,我已经截取了结果的截图,以便您可以看到我想要描述的内容。
https://www.dropbox.com/s/isj5iezwcak1bfn/Untitled-1.png
https://www.dropbox.com/s/rywe1e5hgx7c88x/Untitled-2.png
我试着看看CardLayout,不幸的是,我无法绕过它
答案 0 :(得分:2)
tabDeleteEvent.updateUI();
public void updateUI()
Resets the UI property with a value from the current look and feel.
Overrides:
updateUI in class JComponent
See Also:
JComponent.updateUI()
使用CardLayout代替添加/删除JComponents
在您必须重复添加/删除tabDeleteEvent.revalidate();
的情况下完成对已经可见的Swing GUI的所有更改后,调用代码行tabDeleteEvent.repaint();
和JComponents
答案 1 :(得分:0)
我认为重复的原因是你每次都要添加新的面板。将面板添加到类的构造函数中,然后在上面代码中的选项卡之间导航。
答案 2 :(得分:0)
一位朋友帮帮我并告诉我使用布尔if语句来查明我是否已经添加了面板
if (tabEvents.getSelectedComponent().equals(tabAddEvent)) {
JPanel jp = new AddEvent();
if (initializedAdd == false) {
tabAddEvent.setLayout(new GridBagLayout());
tabAddEvent.add(jp);
initializedAdd = true;
}
}
工作得很好!一旦这个项目完成,我将会仔细研究所有的布局!
感谢大家的帮助。