簡體   English   中英

自定義布局擺動應用程序

[英]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來實現這種布局? 如果我使用GridLayoutBorderLayout ,如何在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM