- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
对于我用 Java 创建的 GUI 应用程序,我有以下内容:
在以下情况下,尺寸不会给我带来任何问题:
当我将 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/
我是一名优秀的程序员,十分优秀!