【问题标题】:How to choose what JPanel in a split pane is resized when the entire app. is resized?当整个应用程序调整大小时,如何选择拆分窗格中的 JPanel。调整大小?
【发布时间】:2015-05-26 02:19:26
【问题描述】:

所以我正在使用 Java Swing 编写一个应用程序,我想知道如何制作它,以便在调整整个应用程序的大小时只有某些面板以各种方式调整大小。看看下面两张图:

如您所见,我有三个垂直面板。现在,当应用程序的高度扩展时,所有三个面板的高度也应该增加,这很好。但是,当宽度增加时,我希望它只增加中间面板(将是“工作区”)的宽度。相反,如您所见,右侧最后添加的第三个面板是唯一宽度增加的面板。

当整个窗口在 x 轴上调整大小时,我如何才能使只有中间的 JPanel 拉伸和收缩?另外,稍后我想让这个工作区面板不总是在中间;因为用户可以移动其他两个面板以根据自己的喜好自定义应用程序,例如使其他两个面板在左侧堆叠在一起,而工作区在右侧。但是,无论它在哪里,我都希望工作区面板成为调整大小的面板,我该怎么做?

【问题讨论】:

  • 我打赌你可以使用WindowListener 并且我认为windowResized() 方法,选择你的middle panel 并相应地调整它的大小。我不确定你是否可以获得旧的宽度(存储它?)或者你可以做middlepanel.setWidth(window.getWidth() - leftpanel.getWidth() - rightpanel.getWidth());
  • 为了尽快获得更好的帮助,请发布MCVE(最小完整可验证示例)或SSCCE(简短、自包含、正确示例)。这表明您指的是(几个)JTabbedPane 组件中的面板!
  • 承认您使用 Netbeans GUI Builder 可能会让您了解这些部分,但如果您实际使用它,我制作了一个方便的 YouTube 视频来展示我所学到的:@987654324 @.
  • 补充一点:自从制作该视频以来,Netbeans 对 GUI Builder 进行了大量改进,让手动编码的布局管理器真正物有所值。所以现在比以前更好了。

标签: java swing jpanel layout-manager jsplitpane


【解决方案1】:

诀窍是使用适当的值在正确的拆分窗格上调用setResizeWeight(double)。例如

import java.awt.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;

public class DualingSplitPanes {

    private JComponent ui = null;

    DualingSplitPanes() {
        initUI();
    }

    protected final void addPanelsToUi(JPanel p1, JPanel p2, JPanel p3) {
        JSplitPane sp1 = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, p1, p2);
        JSplitPane sp2 = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, sp1, p3);
        sp2.setResizeWeight(1);

        ui.add(sp2);
    }

    public void initUI() {
        if (ui!=null) return;

        ui = new JPanel(new BorderLayout(4,4));
        ui.setBorder(new EmptyBorder(4,4,4,4));

        JPanel treeContainer = new JPanel(new GridLayout());
        JTree tree = new JTree();
        tree.setVisibleRowCount(5);
        for (int i=tree.getVisibleRowCount()-1; i>-1; i--) {
            tree.expandRow(i);
        }
        treeContainer.add(new JScrollPane(tree));

        JPanel workSpaceContainer = new JPanel(new GridLayout());
        workSpaceContainer.add(new JTextArea(5, 10));

        JPanel searchContainer = new JPanel(new BorderLayout(4, 4));
        searchContainer.add(new JScrollPane(new JTextArea(5, 10)));

        addPanelsToUi(treeContainer, workSpaceContainer, searchContainer);
    }

    public JComponent getUI() {
        return ui;
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception useDefault) {
                }
                DualingSplitPanes o = new DualingSplitPanes();

                JFrame f = new JFrame(o.getClass().getSimpleName());
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                f.setLocationByPlatform(true);

                f.setContentPane(o.getUI());
                f.pack();
                f.setMinimumSize(f.getSize());

                f.setVisible(true);
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

【讨论】:

    【解决方案2】:

    您可以对框进行约束,使它们依赖于窗口对应的一侧。

    所以左窗格是从左侧算起 X 像素,而右窗格是从右侧算起 Y 像素,然后中间窗格的约束条件是左侧距左侧 X+,右侧距右侧 Y+ .

    只要您不将窗口的大小调整得太小(因为这样元素会变得太大),这就会起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-04
      • 1970-01-01
      • 2020-11-30
      • 2019-05-15
      相关资源
      最近更新 更多