调整组件大小时 JPanel 闪烁

2024-04-18

首先,我想澄清一下,我知道这个问题已经被问过很多次了。但是,我还没有找到对我有用的答案。

我正在尝试制作一款需要分辨率的游戏。因此,我开始工作,使一个组件适应另一个组件的大小,同时保持纵横比。

但我遇到了一个问题,那就是对象会发生某种轻弹或调整大小,特别是当 JFrame 变小时。

除了调查之外,我还检查了秤给出的数字是否有意义,并且没有发现任何异常情况。我还尝试激活双缓冲(尽管知道它在 JPanel 中默认启用)但什么也没有......

我在下面编写了类似的代码,以便您可以查看并测试发生了什么。有什么错误吗?

package novely;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagLayout;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;

import javax.swing.JFrame;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class TestApp extends JFrame{
    private JPanel panel; 
    private JPanel container;
    
    public TestApp() {
        setSize(800, 600);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        this.container = new JPanel(new GridBagLayout());
        
        this.panel = new JPanel();
        this.panel.setBackground(Color.black);
        
        this.container.addComponentListener(new ComponentListener() {

            @Override
            public void componentResized(ComponentEvent e) {
                int reswidth = 800;
                int resheight = 600;
                Dimension parent_size = container.getSize();
                
                double scale = Math.min((double) parent_size.height / resheight,
                                        (double) parent_size.width / reswidth);
                
                panel.setPreferredSize(new Dimension((int) (reswidth * scale), (int) (resheight * scale)));
                panel.revalidate();
            }

            @Override
            public void componentMoved(ComponentEvent e) {
                // TODO Auto-generated method stub
                
            }

            @Override
            public void componentShown(ComponentEvent e) {
                // TODO Auto-generated method stub
                
            }

            @Override
            public void componentHidden(ComponentEvent e) {
                // TODO Auto-generated method stub
                
            }
            
        });
        
        this.container.add(this.panel);
        
        add(this.container);
    }
    
    static public void main(String[] args) {
        TestApp app = new TestApp();
        app.setVisible(true);
    }
}

问题是您正在尝试在 ComponentListener 中添加布局管理逻辑。

是的,ComponentListener 设置首选大小,但是getPreferredSize()需要时可以通过Swing在面板上单独调用该方法。默认的 getPreferredSize() 逻辑将返回 (10, 10) 的大小,因此您会看到一个短暂绘制的小矩形。

解决方案是将首选尺寸逻辑移至组件:

import java.awt.*;
import java.awt.Dimension;
import java.awt.GridBagLayout;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;

import javax.swing.JFrame;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class TestApp extends JFrame{
    private JPanel panel;
    private JPanel container;

    public TestApp() {
        setSize(800, 600);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        this.container = new JPanel(new GridBagLayout());

        this.panel = new JPanel()
        {
            @Override
            public Dimension getPreferredSize()
            {
                int reswidth = 800;
                int resheight = 600;
                Dimension parent_size = container.getSize();

                double scale = Math.min((double) parent_size.height / resheight,
                                        (double) parent_size.width / reswidth);

                return new Dimension((int) (reswidth * scale), (int) (resheight * scale));

            }
        };
        this.panel.setBackground(Color.black);

        this.container.add(this.panel);

        add(this.container);
    }

    static public void main(String[] args) {
        TestApp app = new TestApp();
        app.setVisible(true);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

调整组件大小时 JPanel 闪烁 的相关文章

随机推荐

  • ggplot2 - 具有堆栈和闪避的条形图

    我正在尝试使用创建条形图ggplot2我通过一个变量进行堆叠并通过另一个变量进行躲避 这是一个示例数据集 df data frame year rep c 2010 2011 each 4 treatment rep c Impact Co
  • Linux (Fedora 13) 与 OS X 中的 sigwait

    因此 我尝试使用 pthreads 创建一个可在 OS X 和 Linux 上运行的信号处理程序 下面的代码适用于 OS X 但不适用于 Fedora 13 该应用程序相当简单 它生成一个 pthread 注册 SIGHUP 并等待信号 生
  • 好的斯坦福 Javascript 加密库 (SJCL) 示例? (JS密码学)[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一种在 Javascript 中进行客户端加密的方法 保持http www matasano
  • 3D 图形矩阵 4x4 中最后一行的 magic 4 的用途是什么?

    当我阅读有关WebGL的书时 我看到了下一个矩阵描述 有关于书中最后一行的信息 WebGL 初学者指南 初学者指南 Diego Cantor Brandon Jones 神秘的第四排 第四排没有任何特殊之处 意义 元素 m4 m8 m12
  • 丰富域模型与贫乏域模型[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在决定是否应该使用丰富域模型而不是贫乏域模型 并寻找两者的好例子 我一直在使用贫血领域模型构建 Web 应用程序 并由服务 gt 存储库 g
  • 我的服务应该返回什么接口? IQueryable、IList、IEnumerable?

    想象一下 我有一个 SearchService 层 它有一个方法来搜索以某个字符串开头的所有汽车 public static class Searcher public IAnInterface
  • 如何在 Safari 上提供 ES6 模块?

    我有一个关于 Safari 中 ES6 模块使用的问题 这让我抓狂 因为它阻止我与 Safari 用户共享我的网站 我的网络应用程序和即将推出的 MWE工作得很好在以下环境中 Windows Chrome Edge 和 Firefox 均通
  • 适用于 Objective C iPhone 的 XMLStreamReader?

    我在用XML编写器 http code google com p xswi 用于生成 xml 现在我想用一些阅读器库 框架来阅读这个 xml 是否有任何可用的补充框架 库 我目前正在寻找使用 TouchXML 库来读取此内容 但它无法按预期
  • “mov offset(%rip),%rax”有什么作用?

    Does rax获取偏移量加上这条指令的地址 还是下一条指令的地址 从微代码的角度来看 如果答案是下一条指令可能会更容易 下一个 这是 x86 上的一般规则 另请参阅分支 在 Intel 手册第 2 卷第 2 2 1 6 RIP 相对寻址部
  • Sprite Kit 物理碰撞问题

    我遇到了一些碰撞问题 我有两个大小和质量相同的物体 当一个物体与另一个静止物体碰撞时 我会得到正确的行为 图像中的灰色区域 当我有两个彼此相邻的对象时 行为不太正确 Spritekit 结果在左侧 右侧是预期 需要的结果 我想我知道发生了什
  • 两个字段的 sqlalchemy 验证器

    SQLAlchemy 文档解释了如何使用 validates 装饰器向模型添加验证 from sqlalchemy orm import validates class EmailAddress Base tablename address
  • Vagrant:* 未知的配置部分“disksize”

    在我的机器上配置 Vagrant 环境期间 我收到了以下消息 流浪汉 未知的配置部分 disksize 它是在插件安装后显示的 这里是vagrantfile mode ruby vi set ft ruby All Vagrant conf
  • 如何调试SocketTimeoutException?

    我们正在得到一个java net SocketTimeoutException当客户端 A 连接到服务器 B 时 在服务器 B 上 不知道为什么 客户端正在向服务器发送数据 然后服务器抛出此异常 如何解决这个问题 请注意 目前这种情况只发生
  • 在特定单元格之后停止执行 Databricks 笔记本

    我在 Databricks 笔记本上尝试了 sys exit 0 Python 代码 和 dbutils notebook exit 但这两个选项都不起作用 请建议任何其他方法来停止 Databricks 笔记本中特定单元格之后的代码执行
  • 有什么方法(或快捷方式)可以像在 Eclipse 中一样自动导入 IntelliJ IDEA 中的类吗?

    In Eclipse while coding in Java and press Ctrl Shift O auto import all the Classes automatically In NetBeans this is don
  • 在页面加载时从 JSP 文件调用 servlet

    我可以在不使用 HTML 表单的情况下从 JSP 文件调用 servlet 吗 例如 在页面加载期间在 HTML 表中显示数据库的结果 您可以使用doGet http docs oracle com javaee 7 api javax s
  • 如何让 Eclipse 显示 javax 注释的 Javadoc

    我真的很喜欢 Eclipse 为我使用的各种 Java 库类提供弹出式 Javadoc 文档的方式 不过 我也使用 JPA 和 JAXB 注释 例如 Entity 和 XMLType Eclipse 认为这些是有效的 因为我可以按 ctrl
  • HTTPResponse 对象 -- JSON 对象必须是 str,而不是“字节”

    我一直在尝试更新一个名为的小型 Python 库libpynexmo https github com marcuz libpynexmo使用 Python 3 我一直被这个功能困住了 def send request json self
  • 创建一个临时表并从中选择

    当我运行此命令时 出现错误 未声明的变量 temp
  • 调整组件大小时 JPanel 闪烁

    首先 我想澄清一下 我知道这个问题已经被问过很多次了 但是 我还没有找到对我有用的答案 我正在尝试制作一款需要分辨率的游戏 因此 我开始工作 使一个组件适应另一个组件的大小 同时保持纵横比 但我遇到了一个问题 那就是对象会发生某种轻弹或调整