gpt4 book ai didi

java - 如何在 Java 中正确设置最小尺寸?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:55:04 27 4
gpt4 key购买 nike

对于我用 Java 创建的 GUI 应用程序,我有以下内容:

  • 一个 JFrame,最小大小设置为 (300,200)
  • 一个 JSplitPane,其中:
    • 左边是一个最小尺寸为(100,0)的JScrollPane(包含一个JTree)(我只想限制宽度为200)
    • 在右侧,一个最小尺寸为 (200,0) 的 JPanel

在以下情况下,尺寸不会给我带来任何问题:

  • 一直向左调整 JSplitPane 的大小(到 JScrollPane 的最小大小),然后再调整窗口大小
  • 只是在一定程度上调整窗口大小

当我将 JSplitPane 向右移动太近时会出现问题,因此调整窗口大小时 JSplitPane 右侧的 JPanel 无法遵守我设置的最小宽度。

我尝试在 JScrollPane 上设置最大宽度,这似乎根本没有帮助。

我必须做一些涉及最大尺寸的事情吗?或者也许有一种方法可以将 Listener 附加到其中一个面板以强制执行我想要的行为?最终,我只希望 JSplitPane 中的右侧面板的宽度永远不会小于 200 像素。

这是我遇到的行为示例:

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTree;

public class ResizeTest
{
private JFrame frame;
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
try
{
ResizeTest window = new ResizeTest();
window.frame.setVisible(true);
}
catch(Exception e)
{
e.printStackTrace();
}
}
});
}
public ResizeTest()
{
initialize();
}
private void initialize()
{
frame = new JFrame();
frame.setMinimumSize(new Dimension(300, 200));
frame.setBounds(100,100,450,300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(new GridLayout(0, 1, 0, 0));

JSplitPane splitPane = new JSplitPane();
frame.getContentPane().add(splitPane);

JScrollPane scrollPane = new JScrollPane();
scrollPane.setMinimumSize(new Dimension(100, 0));
splitPane.setLeftComponent(scrollPane);

JTree tree = new JTree();
tree.setMinimumSize(new Dimension(100, 0));
scrollPane.setViewportView(tree);

JPanel panel = new JPanel();
panel.setMinimumSize(new Dimension(200, 0));
splitPane.setRightComponent(panel);
}
}

更新:

除了最好避免使用 setPreferred() 和 setMinimum/Maximum() 之外,恐怕我不完全理解所提出的解决方案中试图提出的要点。

我的问题是,除了使用这些方法之外,我还有哪些限制 JSplitPane 分隔线的选项MadProgrammer 提到了对 componentResized 事件的监听,但我需要进一步说明原因。我是否调用 setDividerLocation() 来响应此事件?

如果附加的问题完全是一个单独的 StackOverflow 问题,我提前表示歉意,如果需要,我可以发布另一个问题并在此处链接。

更新 2:

是否根本没有规定用户如何选择调整窗口大小以及在 JScrollPane 中设置正确的面板是一个可行的选择?在我看来,这有点像标准做法。

最佳答案

首先,方法setMinimumSize 是对LayoutManager API 的建议。一个可能被忽略的建议。

为了能够接近支持这一点,您需要使用类似 ComponentListener 的东西。并监控 componentResized事件。

我能想到的最佳解决方案是使用 LayoutManager,它实际上使用了最小和最大尺寸限制,例如 GridBagLayout

在“内容” Pane 上使用它,并将你的 JSplitPane 放在它上面(相应地设置它的最小和最大大小),然后将“内容” Pane 添加到框架。

更新

抱歉,我可能遗漏了一些非常明显的东西,但我把这个小测试放在一起,我希望它有一些想法可以帮助 :P

public class TestFrameSize extends JFrame {

public TestFrameSize() throws HeadlessException {

setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(600, 600);
setLocationRelativeTo(null);

setMinimumSize(new Dimension(250, 250));

JLabel left = new JLabel("Left");
JLabel right = new JLabel("Right");

Dimension pSize = new Dimension(100, 100);
Dimension mSize = new Dimension(25, 100);

left.setPreferredSize(pSize);
left.setMinimumSize(mSize);
right.setPreferredSize(pSize);
right.setMinimumSize(mSize);

JSplitPane pane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, left, right);

JPanel content = new JPanel(new GridBagLayout());
content.add(pane);

setLayout(new BorderLayout());
add(content);

}

/**
* @param args the command line arguments
*/
public static void main(String[] args) {

new TestFrameSize().setVisible(true);

}
}

关于java - 如何在 Java 中正确设置最小尺寸?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12485555/

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