.getSize() 未更新

2024-02-24

我需要能够在事件函数中更改 JPanel 的大小,然后再次获取大小。看来 JPanel 直到函数调用完成才更新。我怎样才能得到真实的尺寸?这是一个 SSCCE:

import java.awt.*;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import javax.swing.*;


public class Test extends JFrame implements MouseWheelListener{
JPanel p;
Test(){
    setLayout(new FlowLayout());
    setPreferredSize(new Dimension(1000,1000));
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setVisible(true);

    p = new JPanel();
    p.setPreferredSize(new Dimension(200,200));
    p.setBackground(Color.red);
    add(p);

    addMouseWheelListener(this);
    pack();
}
public static void main(String args[]){
    new Test();
}
public void mouseWheelMoved(MouseWheelEvent e) {

    System.out.println(p.getSize());

    p.setPreferredSize(new Dimension(100,100));
    p.revalidate();

    System.out.println(p.getSize());
}
}

该代码工作正常,但如果我滚动鼠标一步,它会在控制台中打印以下内容:

java.awt.Dimension[宽度=200,高度=200]

java.awt.Dimension[宽度=200,高度=200]

我想要打印:

java.awt.Dimension[宽度=200,高度=200]

java.awt.Dimension[宽度=100,高度=100]


您的代码适用于我,但仅适用于鼠标滚轮事件,您必须用鼠标滚轮滚动

修改示例

import java.awt.*;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import javax.swing.*;

public class Test extends JFrame implements MouseWheelListener {

    private static final long serialVersionUID = 1L;
    private JPanel p;

    public Test() {
        setLayout(new FlowLayout());
        setPreferredSize(new Dimension(1000, 1000));
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        p = new JPanel();
        p.setPreferredSize(new Dimension(200, 200));
        p.setBackground(Color.red);
        add(p);
        addMouseWheelListener(this);
        pack();
        setVisible(true);
    }

    public void mouseWheelMoved(MouseWheelEvent e) {
        Dimension dim100 = new Dimension(100, 100);
        Dimension dim200 = new Dimension(200, 200);
        System.out.println(p.getSize());
        if (p.getPreferredSize().equals(dim100)) {
            p.setPreferredSize(dim200);
            p.revalidate();
            System.out.println(p.getSize());
        } else if (p.getPreferredSize().equals(dim200)) {
            p.setPreferredSize(dim100);
            p.revalidate();
            System.out.println(p.getSize());
        }
    }

    public static void main(String args[]) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new Test();
            }
        });
    }
}

EDIT:

必须推迟System.out.println(p.getSize());,在这种情况下,invokeLater() 是最好的,因为在 EDT 中完成所有事件后容器返回更改的维度

example

import java.awt.*;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import javax.swing.*;

public class Test extends JFrame implements MouseWheelListener {

    private static final long serialVersionUID = 1L;
    private JPanel p;

    public Test() {
        setLayout(new FlowLayout());
        setPreferredSize(new Dimension(1000, 1000));
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        p = new JPanel();
        p.setPreferredSize(new Dimension(900, 900));
        p.setBackground(Color.red);
        add(p);
        addMouseWheelListener(this);
        pack();
        setVisible(true);
    }

    public void mouseWheelMoved(MouseWheelEvent e) {
        Dimension dim100 = p.getSize();
        System.out.println("before "+ p.getSize());
        p.setPreferredSize(new Dimension(dim100.height - 5, dim100.width - 5));
        p.revalidate();
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                System.out.println("after "+ p.getSize());
            }
        });
    }

    public static void main(String args[]) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new Test();
            }
        });
    }
}

生成的

before java.awt.Dimension[width=900,height=900]
after java.awt.Dimension[width=895,height=895]
before java.awt.Dimension[width=895,height=895]
after java.awt.Dimension[width=890,height=890]
before java.awt.Dimension[width=890,height=890]
after java.awt.Dimension[width=885,height=885]
before java.awt.Dimension[width=885,height=885]
after java.awt.Dimension[width=880,height=880]
before java.awt.Dimension[width=880,height=880]
after java.awt.Dimension[width=875,height=875]
before java.awt.Dimension[width=875,height=875]
after java.awt.Dimension[width=870,height=870]
before java.awt.Dimension[width=870,height=870]
after java.awt.Dimension[width=865,height=865]
before java.awt.Dimension[width=865,height=865]
after java.awt.Dimension[width=860,height=860]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.getSize() 未更新 的相关文章

随机推荐

  • 从嵌入资源加载模板

    如何将嵌入资源作为 ITemplate 加载 LoadTemplate 方法仅采用字符串虚拟路径 显然这不适用于嵌入式资源 假设您的模板是嵌入的并且需要保持这种方式 我认为您可能需要重新考虑 这是我不久前编写的一个函数 在处理嵌入文件 主要
  • EF6 防止不在外键上创建索引

    我在用着EF6创建数据库的代码优先方法 当我添加迁移和更新数据库时 它总是创建Non cluster Index默认情况下 对于表中的每个外键 我的问题 是否有 EF6 不创建的全局设置Non Cluster index在外键上 我搜索并找
  • 按组对变量进行排名 (dplyr)

    我有一个包含列的数据框x1 x2 group我想生成一个带有额外列的新数据框rank这表明了顺序x1在其组中 有一个相关问题here https stackoverflow com questions 28018933 r data fra
  • Office集成(Word)-拦截保存

    我计划实施一个小型内部文档管理系统 它必须有一个 Web GUI 用于管理存储在数据库中的远程文件夹结构 这些文件夹中存储了 Word 文档 物理上作为数据库中的 blob 每当用户单击文档链接时 就会通过浏览器下载单词二进制文件 并 希望
  • 使用 JSF Datatable 有条件地显示行

    我有一些当前有效的 JSF 代码 如下所示 我需要修改它以有条件地抑制表中某些行的显示 我知道如何有条件地抑制特定单元格的显示 但这似乎会创建一个空单元格 而我想做的是根本不显示该行 有什么建议么
  • 理论:压缩算法可以使某些文件变小但不会变大?

    我遇到了这个问题 无损压缩算法声称可以保证使某些文件变小并且不会使文件变大 这是 a 不可能 b 可能 但可能运行不确定的时间 c 压缩系数为 2 或更低时可能 d 对于任何压缩因子都可能吗 我倾向于 a 但无法给出具体原因 我将列出我和朋
  • 如何使用相对路径而不包含上下文根名称?

    要工作我的静态文件 CSS JS 我必须编写绝对路径 例如 AppName templates style main css 有没有什么解决方案 我可以写相对路径style main css If your actual关注的是 webap
  • Twitter URL 中的 (#!) 有何作用? [复制]

    这个问题在这里已经有答案了 可能的重复 Facebook 和新 Twitter 网址中的 shebang 有何用途 https stackoverflow com questions 3009380 whats the shebang in
  • XPT 到 CSV 的转换? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 也许这是错误的地方 但我不太确定该把它放在哪里 我有一个非常大的 XPT 格式的压缩 SAS 文件 我
  • Reflection.Emit.ILGenerator 异常处理“离开”指令

    首先 一些背景信息 我正在为学校项目制作编译器 它已经在工作了 我正在花费大量的精力来修复错误和 或优化它 我最近遇到的一个问题是我发现 ILGenerator 对象生成了一个额外的leave当您调用以下任何成员方法时的说明 BeginCa
  • 使用 CSS 垂直对齐锚点内的图像

    我想垂直对齐锚元素内的图像 如下所示 ul class thumbnails li class span2 a href class thumbnail img src http www forodefotos com attachment
  • Ballerina,使用 REST-API 的 Json 响应

    我的教授希望我写一个关于如何部署 Ballerina 服务的小教程 所以我正在努力学习它 我正在使用 1 2 版 并且我对污点检查和变量类型的概念有点不知所措 我正在尝试编写一个最小的 REST Service 其端点从另一个 api 请求
  • Swift NSURLConnection sendSynchronousRequest

    在 Objective C 中 可以使用以下语法 NSHTTPURLResponse response nil NSData returnData NSURLConnection sendSynchronousRequest request
  • 找不到 com.android.support:multidex-instrumentation:27.1.1

    我按照说明进行操作https developer android com studio build multidex https developer android com studio build multidex 这是我的错误代码 任务
  • 使用复杂数据类型的集合调用 UpdateModel 会重置所有非绑定值吗?

    我不确定这是否是 DefaultModelBinder 类中的错误或什么 但 UpdateModel 通常不会更改模型的任何值 除了找到匹配的值之外 看看以下内容 AcceptVerbs HttpVerbs Post public View
  • 在 Windows 上使用 sys/socket.h 函数

    我正在尝试在Windows 中使用socket h 函数 本质上 我目前正在查看示例代码https beej us guide bgnet html multi clientserver html datagram https beej u
  • macOS 上的 OpenGL 是否已弃用?

    我已经开始接触 OpenGL 但我总是收到警告 为什么 例如 glutInit argc arg 在 macOS 10 9 中已弃用 glutInit 已弃用 首先在 macOS 10 9 中弃用 OpenGL API 已弃用 有什么办法可
  • 如何使用 x.509 签名/证书对 PDF 进行签名

    tl dr 我正在寻找一个 CLI 工具 可以输入 x 509 文件和输入 PDF 并输出签名的 PDF NodeJS 的最佳场景 你好呀 我有点沮丧 我正在寻找一个可以使用命令行签署 PDF 文件的工具 我确实使用名为handy sign
  • clang:加载共享库时出错:libtinfo.so.5:无法打开共享对象文件:没有这样的文件或目录

    我正在构建一个底层主题https github com substratum template https github com substratum template 我在运行时遇到以下错误 Build command failed Er
  • .getSize() 未更新

    我需要能够在事件函数中更改 JPanel 的大小 然后再次获取大小 看来 JPanel 直到函数调用完成才更新 我怎样才能得到真实的尺寸 这是一个 SSCCE import java awt import java awt event Mo