[英]Custom Layout Swing Application
我的Swing應用程序包含一個JFrame,其中包含多個JPanel。 我需要按以下布局安排這些JPanel:
==============================================
| MenuBar Panel
|=============================================
| |Header Panel
| JTree Panel |===============================
| having Jtree|Description Panel
| |===============================
| |TabbedPane Panel having two JPanels
| |named Edit and Results
| |
| |
| |
| |
| |
根據對JTree節點的選擇,將在TabbedPane中打印不同的“編輯面板”。 編輯面板必須是CardLayout,因為它一次只能顯示一張卡片。 但是我的問題是,如果我的應用程序是FullScreen
,我應該如何使用該LayoutManager
來實現這種布局? 如果我使用GridLayout
或BorderLayout
,如何在Jtree valueChanged()
之間切換?
對於布局,我可以推薦您MigLayout( http://miglayout.com )。
與其他布局管理器相比,它更易於閱讀和編寫。
為了實現您的特定布局,您可以這樣做:
JPanel panel = new JPanel(new MigLayout());
panel.add(menuBarPanel, "wrap");
panel.add(jTreePanel, "dock west");
panel.add(headerPanel, "wrap");
panel.add(descriptionPanel, "wrap");
panel.add(tabbedPane, "wrap");
這應該可以解決布局問題。 其余的由dic19回答!
我已經使用MigLayout
創建了一個示例。 CardLayout
管理器不是必需的。
package com.zetcode;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.JTree;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;
import net.miginfocom.swing.MigLayout;
public class DynamicEditPanel extends JFrame {
private JPanel editPanel;
public DynamicEditPanel() {
initUI();
setTitle("Dynamic Edit panel");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
}
private void initUI() {
createMenuBar();
JTree tree = new JTree();
TreeSelectionModel smod = tree.getSelectionModel();
smod.setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
smod.addTreeSelectionListener(new MySelectionListener());
JPanel pnl = new JPanel(new MigLayout("wrap"));
JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
tree, pnl);
JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP);
editPanel = getPanel("Edit");
tabbedPane.add("Edit", editPanel);
tabbedPane.add("Results", getPanel("Results"));
pnl.add(getPanel("Header"), "w 250, h 100, pushx, growx");
pnl.add(getPanel("Description"), "w 250, h 100, growx");
pnl.add(tabbedPane, "grow, pushy");
add(splitPane);
pack();
}
private void createMenuBar() {
JMenuBar menubar = new JMenuBar();
JMenu file = new JMenu("File");
JMenu edit = new JMenu("Edit");
menubar.add(file);
menubar.add(edit);
setJMenuBar(menubar);
}
private JPanel getPanel(String text) {
JPanel pnl = new JPanel(new BorderLayout());
JLabel label = new JLabel(text, JLabel.CENTER);
pnl.add(label);
pnl.setBorder(BorderFactory.createEtchedBorder());
return pnl;
}
private class MySelectionListener
implements TreeSelectionListener {
@Override
public void valueChanged(TreeSelectionEvent e) {
TreeSelectionModel model
= (TreeSelectionModel) e.getSource();
TreePath path = model.getSelectionPath();
if (path != null) {
Object item = path.getLastPathComponent();
editPanel.removeAll();
editPanel.add(new JLabel(item.toString(), JLabel.CENTER));
editPanel.doLayout();
editPanel.repaint();
}
}
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
DynamicEditPanel ex = new DynamicEditPanel();
ex.setVisible(true);
}
});
}
}
單擊樹節點將在“編輯”面板中創建一個新標簽。 舊組件將使用removeAll()
方法刪除。
我還實現了一個拆分窗格,因為我認為這是預期的設計。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.