需要无效 Swing 组件的高度

2023-11-23

基本设置是这样的:我有一个垂直的 JSplitPane,我想要一个固定大小的底部组件和一个调整大小的顶部组件,我通过调用来完成setResizeWeight(1.0)。在此应用程序中,有一个按钮可恢复“默认”窗口配置。窗口的默认高度是桌面高度,默认分隔线位置是距离分割窗格底部 100 像素。

要将分隔线位置设置为 100px,我将 JSplitPane 高度设置为 - 100。问题是,在此之前我调整了 JFrame 的大小,并且由于代码位于按钮回调中,因此 JSplitPane 已失效但尚未调整大小。所以分隔线位置设置不正确。

这是一个 SSCCE。单击该按钮两次即可查看问题。第一次单击将调整窗口大小,但分隔线位置保持不变(相对于窗口底部)。第二次单击会正确移动分隔线,因为窗口大小没有改变。

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GraphicsConfiguration;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JSplitPane;

public class SSCCE {

    /**
     * @param args unused
     */
    public static void main(String[] args) {
        new SSCCE();
    }

    private final JFrame f = new JFrame("JSplitPane SSCE");
    private final JSplitPane sp = new JSplitPane(JSplitPane.VERTICAL_SPLIT,true);

    public SSCCE() {
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        sp.add(new JLabel("top"));
        sp.add(new JLabel("bottom"));
        sp.setResizeWeight(1.0);

        f.getContentPane().add(sp);
        f.getContentPane().add(new JButton(new AbstractAction("Resize to Default") {
            @Override
            public void actionPerformed(ActionEvent e) {
                restoreDefaults();
            }
        }),BorderLayout.PAGE_END);

        f.setSize(400,300);
        f.setVisible(true);
    }

    void restoreDefaults() {
        f.setSize(f.getWidth(), getDesktopRect(f.getGraphicsConfiguration()).height);
        sp.setDividerLocation(sp.getSize().height - 100);  // Does not work on first button press
    }

    Rectangle getDesktopRect(GraphicsConfiguration gc) {
        Toolkit toolkit = Toolkit.getDefaultToolkit();
        Dimension size = toolkit.getScreenSize();
        Insets insets = toolkit.getScreenInsets(gc);
        return new Rectangle(insets.left, insets.top, size.width - (insets.left + insets.right), size.height - (insets.top + insets.bottom));
    }

}

我想到了一些可以解决这个问题的方法,但它们看起来都有点黑客。到目前为止我最好的主意就是打电话f.validate()在设置框架大小和设置分隔线位置之间,但我担心尽早强制验证可能会产生副作用。

我想到的另一个选择是使用EventQueue.invokeLater()将用于设置分隔符位置的调用放在事件队列的末尾。但这对我来说似乎有风险 - 我假设 JSplitPane 将在那时得到验证,并且我担心这可能是一个错误的假设。

有没有更好的办法?


花了一段时间(可能是因为早上在这里:-)来理解这个问题,所以只是为了确保我明白了:

  • 底部组件的大小可以是用户随时决定的任何大小
  • 调整框架大小时,所有高度变化都应该发生在顶部组件上
  • 有一个选项可以恢复到默认大小,与之前的任何设置无关
  • “default”表示底部组件必须具有固定高度 xx

如果是这样,解决方案是将调整框架大小与调整底部组件大小分开。您的第二个选择是完全正确的:调整框架大小并将底部合成调整大小包装到invokeLater(EventQueue或SwingUtilities,无关紧要)中。

void restoreDefaults() {
    f.setSize(f.getWidth(), getDesktopRect(f.getGraphicsConfiguration()).height);
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            sp.setDividerLocation(sp.getSize().height - 100);  

        }
    });
}

这保证按预期工作,因为 invokeLater 将请求放在所有已排队事件之后的最后:

 /**
 * Causes <i>doRun.run()</i> to be executed asynchronously on the
 * AWT event dispatching thread.  This will happen after all
 * pending AWT events have been processed.  [...]
 * If invokeLater is called from the event dispatching thread --
 * for example, from a JButton's ActionListener -- the <i>doRun.run()</i> will
 * still be deferred until all pending events have been processed.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

需要无效 Swing 组件的高度 的相关文章

随机推荐

  • Keras 中基于输入数据的自定义损失函数

    我正在尝试使用 Keras 创建自定义损失函数 我想根据输入计算损失函数并预测神经网络的输出 我尝试使用 Keras 中的 customloss 函数 我认为 y true 是我们为训练给出的输出 y pred 是神经网络的预测输出 下面的
  • 在 Capistrano 3 中永久切换用户(单独授权和部署)

    我们在服务器管理中有以下模式 所有用户都有自己的用户 但部署完全由特殊的部署用户执行 无法直接登录 我们在 Capistrano 2 x 中使用了这个方法 default run options shell sudo u deploy ba
  • 使用Unity将对象注入到IValueConverter实例中

    我在 Silverlight 5 项目中有一个 IValueConverter 实例 它将自定义数据转换为不同的颜色 我需要从数据库中读取实际的颜色值 因为这些值可以由用户编辑 由于 Silverlight 使用异步调用通过实体框架从数据库
  • 如何使元素水平和垂直居中

    我试图将选项卡内容垂直居中 但是当我添加 CSS 样式时display inline flex 水平文本对齐消失 如何为每个选项卡同时进行 x 和 y 文本对齐 box sizing border box leftFrame backgro
  • Flutter 中已弃用“canLaunch”

    我用过网址启动器包裹 String query Uri encodeComponent Utils getSelectedStoreAddress var appleUrl maps q query var googleUrl https
  • Primefaces p:fileUpload 在 IE 10 中不起作用

    p fileUpload 中的更新属性和 onComplete 在 IE10 中不起作用 在 IE 9 中 sizeLimit 属性被忽略 有谁遇到过这种情况吗 我尝试通过在 p fileUoload 上使用 onComplete 属性来调
  • 如何在Python中查找两个日期之间的星期一或任何其他工作日的数量?

    我有两个日期 我需要找出有多少个周一至周五到来 除周六 周日 每天都应该计算在内 目前我在想 import calendar import datetime start date datetime datetime strptime 01
  • 如何在带有 Entity Framework Core 1.0 (EF7) 的脚手架 DbContext 中使用数据库视图

    很遗憾实体框架核心 1 0 以前称为实体框架 7 尚不支持视图 我正在尝试使用表来 伪造 它 然而脚手架dotnet dbcontext ef scaffold命令当前无法识别或生成视图 我想要一个允许查询视图和更新表的 DbContext
  • 在 getStaticProps 函数中序列化 Next.js 时出错?

    我在用着getStaticProps 函数 我无缘无故地收到此错误 错误 序列化错误 posts 0 从返回getStaticProps在 原因 object object Object 无法序列化为 JSON 请仅返回 JSON 可序列化
  • 使用 php 获取 mysql 表中记录总数的最佳方法是什么?

    从大表中选择记录总数的最有效方法是什么 目前 我只是在做 result mysql query SELECT id FROM table total mysql num rows result 有人告诉我 如果表中有很多记录 这不是很有效或
  • stringByAppendingPathComponent,它是如何工作的?

    编辑 v002 我看了所有的评论 我开始明白我应该做什么 为此 我修改了我的代码 见下文 我将 newPath 更改为 NSString 删除了 alloc init 和结束 release 因为它现在由系统处理 我正在使用 stringB
  • 向量上的修改时复制语义不会在循环中追加。为什么?

    这个问题听起来似乎得到了部分回答here但这对我来说还不够具体 我想更好地理解何时通过引用更新对象以及何时复制对象 更简单的例子是向量增长 下面的代码在 R 中效率极低 因为在循环之前没有分配内存 并且在每次迭代时都会创建一个副本 x ru
  • Java中有instanceOf(Class c)之类的东西吗?

    我想检查一个对象是否o是该类的一个实例C或的一个子类C 例如 如果x属于班级Point I want x instanceOf Point class to be true并且x instanceOf Object class to be
  • 在 Matlab 中通过函数句柄传递附加参数

    我有一个需要优化的函数 比如 Matlab 中的 Function 该函数取决于我想要优化的变量 例如 x 和一个不需要优化的参数 例如 Q 因此 函数 Function x Q 换句话说 我有一个 Q 值数组 并且想要为每个 Q 找到最佳
  • 获取现有的或创建新的 akka actor

    我正在尝试使用 ActorFor 获取现有的 ActorRef 或创建一个新的 ActorRef 如果它不存在 我有以下代码 但它似乎没有按预期工作 isTermminate 始终为 true ActorSystem system Acto
  • 原子操作会阻塞其他线程吗?

    我试图让 原子与非原子 的概念在我的脑海中扎根 我的第一个问题是我找不到 现实生活中的类比 就像原子操作上的客户 餐厅关系或类似的东西 我还想了解原子操作如何将自己置于线程安全编程中 在这篇博文中 http preshing com 201
  • 安装:Microsoft Visual C++ Redistributable 卡在“正在处理:Windows7_MSU_X64”

    我正在尝试安装 Microsoft Visual C Redistributable 软件包 因为无法安装我的 xampp apache 模块 安装需要很长时间才能完成 我应该怎么办 这种情况常见吗 我所要做的就是等待吗 他们完全被这个设置
  • 如何检查FormData?

    我试过了console log并使用循环遍历它for in 这里是MDN 参考在 FormData 上 两种尝试都在这fiddle var fd new FormData key poulate with dummy data fd app
  • 在 PyQt 中绘制多边形

    背景 我想在屏幕上绘制一个简单的形状 并且我选择 PyQt 作为要使用的包 因为它似乎是最成熟的 我并没有以任何方式锁定它 Problem 仅在屏幕上绘制一个简单的形状 例如多边形 似乎过于复杂 我发现的所有示例都尝试做很多额外的事情 但我
  • 需要无效 Swing 组件的高度

    基本设置是这样的 我有一个垂直的 JSplitPane 我想要一个固定大小的底部组件和一个调整大小的顶部组件 我通过调用来完成setResizeWeight 1 0 在此应用程序中 有一个按钮可恢复 默认 窗口配置 窗口的默认高度是桌面高度