我正在打开一个包含以下内容的窗口:
JFrame clientFrame = new JFrame("Frame");
clientFrame.setLayout(new BorderLayout());
final JPanel client_panel = new JPanel();
client_panel.setLayout(new BorderLayout());
client_panel.add(new Applet());
client_panel.setPreferredSize(new Dimension(765, 555));
clientFrame.getContentPane().add(client_panel, "Center");
clientFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
clientFrame.pack();
clientFrame.setVisible(true);
相框上有一张随机的图片。
默认情况下,当您向上拖动底部边框时,它会自然地从图像底部删除。
同样,如果您向下拖动顶部边框,它将再次从图片的底部逐渐删除。
我如何交换它,让它从图片的顶部而不是底部移除?
发布于 2018-09-18 23:53:30
clientFrame.getContentPane().add(client_panel, "Center");
不要使用魔术值。人们不知道“中心”从何而来。使用API提供的变量:
clientFrame.getContentPane().add(client_panel, BorderLayout.CENTER);
据我所知,使用任何布局管理器都不可能实现您的要求。问题是布局管理器只知道组件可用的大小。它不知道为什么改变大小(例如,向上或向下拖动)。因此,布局管理器只能基于可用空间定义规则。
作为一个简单的测试,使用带有BorderLayout
的JPanel
。然后创建一个包含ImageIcon
的JLabel
。将标签添加到此面板,然后将面板添加到框架的内容窗格。
如果将标签添加到BorderLayout.CENTER,则图像会在可用空间居中,因此会丢失部分顶部和底部。
如果您将标签添加到BorderLayout.PAGE_START,则始终从组件的底部获取(或给予)空间。
如果您将标签添加到BorderLayout.PAGE_END,则始终从组件的顶部获取(或给予)空间。
如果您想要考虑框架的向上或向下拖动,那么解决方案就会变得复杂得多,因为您将需要向框架添加一个ComponentListener
并处理componentResized
和componentMoved
方法。然后,您将需要跟踪帧的先前状态,然后确定哪些属性已更改,然后您将需要基于属性更改对图像进行自定义绘制,或者您将需要编写一个自定义布局管理器来感知属性更改。
https://stackoverflow.com/questions/52386818
复制相似问题