【问题标题】:Custom Layout Swing Application自定义布局 Swing 应用程序
【发布时间】:2014-10-08 00:23:58
【问题描述】:

我的 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() 上的JPanels 之间切换?

【问题讨论】:

  • 请访问How to Use Various Layout Managers试试GridBagLayout
  • 这是一个非常相似的example
  • 使用一系列复合布局,每一个都满足其负责的各个区域的要求,并将其构建到最终的 UI 中
  • 你应该结合各种布局管理器来做到这一点
  • “我如何在 Jtree valueChanged() 上的 JPanel 之间切换?” 你的 JTree 是某种树形菜单,应该在你的 CardLayout 面板中切换“卡片” ?

标签: java swing layout awt layout-manager


【解决方案1】:

对于布局,我可以向您推荐 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 回答!

【讨论】:

  • 很高兴能帮到你!
【解决方案2】:

我用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() 方法删除组件。

我还实现了一个拆分窗格,因为我认为这是预期的设计。

【讨论】:

    猜你喜欢
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    • 2016-02-26
    • 1970-01-01
    相关资源
    最近更新 更多