【问题标题】:Java JPanel and JFrame border draggingJava JPanel 和 JFrame 边框拖动
【发布时间】:2019-02-22 12:06:20
【问题描述】:

我正在打开一个带有以下内容的窗口:

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);

框架上有一张随机图片。

默认情况下,当你向上拖动底部边框时,它会从图像底部自然地从图像中移除。

如果您向下拖动顶部边框,它会再次从图片底部逐渐移除。

如何交换它,以便它从图片顶部而不是底部移除?

【问题讨论】:

标签: java swing layout


【解决方案1】:
clientFrame.getContentPane().add(client_panel, "Center");

不要使用魔法值。人们不知道“中心”从何而来。使用 API 提供的变量:

clientFrame.getContentPane().add(client_panel, BorderLayout.CENTER);

我所知道的任何布局管理器都不可能实现您的要求。问题是布局管理器只知道组件可用的大小。它不知道为什么大小会改变(即向上或向下拖动)。所以布局管理器只能根据可用空间来定义规则。

作为一个简单的测试,使用JPanelBorderLayout。然后创建一个包含ImageIconJLabel。将标签添加到此面板,然后将面板添加到框架的内容窗格。

如果将标签添加到 BorderLayout.CENTER,则图像在可用空间中居中,因此您会丢失部分顶部和底部。

如果将标签添加到 BorderLayout.PAGE_START,则始终会从组件底部获取(或分配给)空间。

如果您将标签添加到 BorderLayout.PAGE_END,则始终会从组件顶部获取(或分配给)空间。

如果您想考虑框架的向上或向下拖动,那么解决方案会变得更加复杂,因为您需要将ComponentListener 添加到框架并处理componentResizedcomponentMoved 方法。然后,您将需要跟踪框架的先前状态,然后确定哪些属性已更改,然后您将需要根据属性更改对图像进行自定义绘制,或者您需要编写一个自定义布局管理器来了解属性发生变化。

【讨论】:

    猜你喜欢
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 2011-10-04
    • 2018-09-09
    • 2012-10-24
    • 1970-01-01
    相关资源
    最近更新 更多