gpt4 book ai didi

java - Jsplitpane 自动调整大小

转载 作者:行者123 更新时间:2023-11-30 02:24:47 24 4
gpt4 key购买 nike

我有一个 JSPlitPane,它们之间有 50% 的分隔线。这样就可以正常工作了。

但是,当我在右侧添加一些 JLabels 时,jsplitpane 会忽略我的 50% 分隔符,左侧 Pane 会增加其大小并挤压右侧 Pane 。

为什么会发生这种情况以及如何解决?

我的代码是:

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

public class Example {

private static void setup() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setPreferredSize(new Dimension(500, 500));
frame.setFocusable(true);

JSplitPane pane= new JSplitPane();
pane.setResizeWeight(0.5);
pane.setRightComponent(new JPanel());

JPanel myPanel = new JPanel();
myPanel.setLayout(new FlowLayout());

for(int i=0; i<20; i++) myPanel.add(new JLabel("hello"));

pane.setLeftComponent(myPanel);

frame.add(pane);

frame.pack();
frame.setVisible(true);
}

public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
setup();
}
});
}
}

最佳答案

However, when I add some JLabels to the right side, then the jsplitpane ignores my 50% divider thing and the left hand pane increases its size and just squashes the right hand side.

分割 Pane 最初将计算每个组件的首选大小。

调整大小权重用于在调整分割 Pane 大小时分配空间。在这种情况下,当框架可见时就会发生这种情况。因此,如果添加到拆分 Pane 的组件的首选大小小于框架可见时拆分 Pane 的大小,则每个组件将获得 50% 的额外空间。

在第一种情况下,没有组件,因此每个面板的首选大小是相同的,因此当调整分割 Pane 的大小时,它们各自获得相同的空间。

在第二种情况下,第一个面板的首选尺寸将是添加到该面板的所有标签的宽度,而第二个面板为 0。由于第一个面板的首选宽度大于框架的尺寸,因此没有额外的空间分配给第二个面板。

尝试添加 1 或 2 个标签而不是 20 个,看看会发生什么。

编辑:

一些问题:

1) 调整权重大小并不像您预期​​的那样工作。当分隔线以低速移动时,每个像素都会生成一个事件。那么一个像素不能被两个组件共享,因此该像素被赋予正确的组件。

我建议您的解决方案是使用调整大小权重“1.0”,以便标签组件获得所有空间。

2) JSplitPane 遵循组件的最小尺寸,这意味着您不能将栏拖动到超出组件的最小尺寸。对于您的面板,最小尺寸与首选尺寸相同,因此您无法将分隔线拖动得更小。

解决方案是重写面板的getMinimumSize()方法以返回一些较小的尺寸

  • 在分割 Pane 最初显示时,手动将分隔线位置设置为分割 Pane 大小的 50%。
  • 这可以通过将 setDividerLocation(...) 方法包装在 SwingUtilities.invokeLater() 中来完成。

    以上 3 条建议已添加到您的 MCVE 中:

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

    public class Example {

    private static void setup() {
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    frame.setPreferredSize(new Dimension(500, 500));
    frame.setFocusable(true);

    JSplitPane pane= new JSplitPane();
    pane.setResizeWeight(1.0);
    pane.setRightComponent(new JPanel());

    JPanel myPanel = new JPanel()
    {
    @Override
    public Dimension getMinimumSize()
    {
    return new Dimension(50, 50);
    }
    };
    myPanel.setLayout(new FlowLayout());

    for(int i=0; i<20; i++) myPanel.add(new JLabel("hello"));

    pane.setLeftComponent(myPanel);

    frame.add(pane);

    frame.pack();
    frame.setVisible(true);

    javax.swing.SwingUtilities.invokeLater(new Runnable() {
    public void run() {
    pane.setDividerLocation(0.5f);
    }
    });
    }

    public static void main(String[] args) {
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
    public void run() {
    setup();
    }
    });
    }
    }

    关于java - Jsplitpane 自动调整大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45928824/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com