[英]Centering JPanel with GridBoxLayout is repeatedly adding the JPanel
經過大量研究后,我似乎找不到任何問題。 我正在創建一個程序,用戶可以在其中選擇他們想使用的標簽(JTabbedPane)。 在該選項卡中,當用戶選擇選項卡時,我將其添加到該選項卡中。
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,但不幸的是,我無法將其包圍
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();
和tabDeleteEvent.repaint();
在必須重復添加/刪除JComponents
的情況下完成對已經可見的Swing GUI的所有更改之后
我認為重復的原因是您每次都添加新面板。 將面板添加到該類的構造函數中,然后在上面的代碼中的各個選項卡之間導航。
一位朋友幫忙,告訴我使用布爾if語句來確定我是否已經添加了面板
if (tabEvents.getSelectedComponent().equals(tabAddEvent)) {
JPanel jp = new AddEvent();
if (initializedAdd == false) {
tabAddEvent.setLayout(new GridBagLayout());
tabAddEvent.add(jp);
initializedAdd = true;
}
}
做得很好! 一旦完成該項目,我將更仔細地查看所有布局!
感謝大家的幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.