具有固定大小的 JScrollPane 中的 JTree

Posted

技术标签:

【中文标题】具有固定大小的 JScrollPane 中的 JTree【英文标题】:JTree in a JScrollPane with fixed size 【发布时间】:2019-12-09 17:47:34 【问题描述】:

我在 JScrollPane 内有一个 JTree,它位于 JPanel 内。

我遇到的问题是 width 在我用节点或长名称的节点填充 JTree 时未修复。

这里是一个例子:

如您所见,左边的比右边长。

我的目标是保持它们的大小完全相等,将主窗口分别拆分为 50%。

这里是用来生成窗口的代码。

有没有办法固定 JScrollPane 的宽度大小? 谢谢。

public void initialize() 

    this.frame = new JFrame();
    frame.setBounds(100, 100, 450, 300);
    JMenuBar menuBar = new JMenuBar();
    frame.setJMenuBar(menuBar);

    JMenu mnNewMenu = new JMenu("Services");
    mnNewMenu.setHorizontalAlignment(SwingConstants.CENTER);
    menuBar.add(mnNewMenu);

    frame.getContentPane().setLayout(new MigLayout("", "[grow][grow]", "[grow][grow]"));

    JPanel left_JPanel = new JPanel();
    frame.getContentPane().add(left_JPanel, "cell 0 0,grow");
    left_JPanel.setLayout(new MigLayout("", "[grow]", "[grow]"));

    left_ScrollPane = new JScrollPane();
    left_JPanel.add(left_ScrollPane, "cell 0 0,grow");

    JLabel left_Label = new JLabel("Left Scroll Pane");
    left_Label.setFont(new Font("Tahoma", Font.BOLD, 12));
    left_Label.setForeground(Color.BLUE);
    left_Label.setHorizontalAlignment(SwingConstants.CENTER);
    left_ScrollPane.setColumnHeaderView(left_Label);

    JTree left_tree = new JTree();
    left_ScrollPane.setViewportView(left_tree);

    JPanel right_JPanel = new JPanel();
    frame.getContentPane().add(right_JPanel, "cell 1 0,grow");
    right_JPanel.setLayout(new MigLayout("", "[grow]", "[grow]"));

    JScrollPane right_ScrollPane = new JScrollPane();
    right_JPanel.add(right_ScrollPane, "cell 0 0,grow");

    right_JTree = new JTree(phModel);
    right_JTree.setVisibleRowCount(8);
    right_ScrollPane.setViewportView(right_JTree);

    JLabel right_Label = new JLabel("Right Scroll Pane");
    right_Label.setFont(new Font("Tahoma", Font.BOLD, 12));
    right_Label.setForeground(Color.BLUE);
    right_Label.setHorizontalAlignment(SwingConstants.CENTER);
    right_ScrollPane.setColumnHeaderView(right_Label);

【问题讨论】:

【参考方案1】:

我的目标是保持它们的大小完全相等,将主窗口分别拆分为 50%。

使用来自 JDK 的标准布局管理器的嵌套面板。

GridLayout 使组件大小相同。

类似:

JPanel left = new JPanel( new BorderLayout() );
left.add(leftLabel, BorderLayout.PAGE_START);
left.add(listScrollPane, BorderLayout.CENTER);

JPanel right = ...

JPanel main = new JPanel( new GridLayout(0, 2) );
main.add( left );
main.add( right );

frame.add( main );

【讨论】:

抱歉,我还有一个问题:如果我需要在这个下面再添加一个 GridLayout,它总是包含 2 个 JScrollPane,但高度不同,该怎么办?哪个是我必须同时放置 GridLayout 的最佳容器?再次感谢。 框架内容窗格的默认布局管理器是BorderLayout。上述建议将面板添加到 BorderLayout.CENTER。如果您想要下面的更多组件,请在 BorderLayout.PAGE_END 中添加另一个面板。

以上是关于具有固定大小的 JScrollPane 中的 JTree的主要内容,如果未能解决你的问题,请参考以下文章

如何做到这一点,以便当我将可动态调整大小的 JPanel 放入 JScrollPane 时它​​可以工作?

chrome中的jScrollPane 2.0高度问题

打印具有多个页面的 jscrollpane

添加 JScrollpane 时框布局中的框未对齐

如何强制刷新/重绘 JScrollPane?

具有多个 JTextArea 的 JScrollPane