从右到左方向按钮尺寸的不相关变化

2024-02-29

我将 9 个 jbutton 添加到 jpanel 中,并将面板添加到 jscrollpane 中,并将其添加到 jframe 中。

http://www.pic1.iran-forum.ir/images/up9/95426323683658592564.jpg http://www.pic1.iran-forum.ir/images/up9/95426323683658592564.jpg

当我通过以下方式更改框架方向时:applyComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);

面板向右移动,按钮的大小已固定,不会填充面板,但您在下图中看到滚动条填充了面板的所有宽度

http://www.pic1.iran-forum.ir/images/up9/60975202722295688553.jpg http://www.pic1.iran-forum.ir/images/up9/60975202722295688553.jpg

(我使用 gridbaglayout 来添加按钮,使用 borderlayout.center 来添加滚动窗格)。

这是java中的一个错误还是?

编辑: 这是最简单的视图。有帮助吗?

import java.awt.BorderLayout;
import java.awt.ComponentOrientation;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.*;

public class MyFrame extends JFrame{
private JButton[] arrayButton = new JButton[9];
private JButton btnLeft = new JButton("<");
private JButton btnRight = new JButton(">");
private JScrollPane scpButtons = new JScrollPane();

public MyFrame() {
    for (int i = 0; i < arrayButton.length; i++) 
        arrayButton[i] = new JButton("btn");

    JPanel pnlButton = initPnlButton();
    scpButtons.setViewportView(pnlButton);
    setLayout(new BorderLayout());
    add(scpButtons, BorderLayout.CENTER);

           // comment it and see the result 
    applyComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);      
    pack();
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setExtendedState(JFrame.MAXIMIZED_BOTH);
    setVisible(true);
}

private JPanel initPnlButton() {
    JPanel pnlButton = new JPanel(new GridBagLayout());
    GridBagConstraints gbc = new GridBagConstraints(0, 0, 1, 1, 1, 1, 10,
            1, new Insets(0, 0, 0, 0), 0, 0);

    int ind = 0;
    int row = 3;
    int column = 4;
    for (int i = 0; i < row; i++) {
        for (int j = 1; j < column; j++) {
            gbc.gridx = j;
            gbc.gridy = i;
            pnlButton.add(arrayButton[ind++], gbc);
        }
    }
    gbc.weightx = 0;
    gbc.gridheight = 3;
    gbc.gridx = 0;
    gbc.gridy = 0;
    pnlButton.add(btnLeft, gbc);
    gbc.gridx = 4;
    gbc.gridy = 0;
    pnlButton.add(btnRight, gbc);
    pnlButton.setPreferredSize(new Dimension(1000, 700));
    return pnlButton;
}
public static void main(String[] args) {
    new MyFrame();
}
}

Edit 4

(希望是最后一个:-)

最终的罪魁祸首似乎是scrollPane的主视口:一旦它小于其首选视图,在RToL中调整其视图大小时,它就会感到困惑。没有跟踪到底出了什么问题,但看起来是一个可行的(缺少找到核心中的错误并推动 snoracle 修复它;)解决方案是使视图实现 Scrollablable,具体实现

  • getPreferredScrollableViewportSize 返回 getPreferredSize
  • 实现 getScrollableTracksViewportHeight/Width 以在高度/宽度小于父级高度/宽度时返回 true,否则返回 false

JXPanel(包含在SwingX http://swingx.java.net) 是一个 Scrollable,默认执行第一个操作,并且可以通过适当设置 ScrollableSizeHints 来配置后者:

private JPanel initPnlButton() {
    JXPanel pnlButton = new JXPanel(new GridBagLayout());
    pnlButton.setScrollableWidthHint(ScrollableSizeHint.PREFERRED_STRETCH);
    pnlButton.setScrollableHeightHint(ScrollableSizeHint.PREFERRED_STRETCH);
    ...
}

完成后,不需要更多的 hacky 行,只需在添加所有组件后应用 CO:

applyComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
pack();
setExtendedState(JFrame.MAXIMIZED_BOTH);
setVisible(true);

Edit 2

我们(@Reza Gh 和我)使用选项越多,我就越倾向于将这种行为视为错误。总结我们的最新发现

  • 滚动窗格似乎是罪魁祸首(Reza)
  • 一旦面板的大小调整到/低于其首选大小,错误行为就会开始(注意人工 - 至少我希望它不是 Reza 的生产代码的一部分 - 创建面板时设置首选)

Edit

多玩一点,在我看来,实例化时的行为非常奇怪。一个可以使用的片段(在实例化结束时)

pack();
// [1]
setSize(getWidth() + 1, getHeight() + 1);
// [2]
setExtendedState(JFrame.MAXIMIZED_BOTH);
setVisible(true);
SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        applyComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
    }
});

并评论 1、2 或两者

  • 评论两者:框架以压缩尺寸出现,最大化它不会填充框架,但子元素停靠在右边缘
  • 评论 1:框架以最大化尺寸出现,子项填充完成的内容,然后调整大小以打包并再次最大化:子项未填充
  • 评论 2:框架提供了几乎(大一像素)的压缩尺寸,最大化(以及所有其他调整大小)正确填充屏幕

确切的行为可能也取决于本机组件的方向(我的是 LToR)。总的来说,我认为这是组件方向核心处理中的一个错误(毫不奇怪,多年来它并不像我们预期的那么稳定)。

看起来一个 hack 方法是在打包后调整大小(稍微调整 1 个像素左右,单独使用 max 不起作用),然后调用 applyCO。

Original

这并没有解决最初的问题(即在框架实例化时应用 componentOrientation),仅演示如何在运行时安全地切换 CO

Action createCOToggle(final JFrame frame) {
    Action toggleComponentOrientation = new AbstractAction("toggle orientation") {

        @Override
        public void actionPerformed(ActionEvent e) {
            ComponentOrientation current = frame.getComponentOrientation();
            if (current.isLeftToRight()) {
                frame.applyComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
            } else {
                frame.applyComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
            }
            frame.getRootPane().revalidate();
            frame.invalidate();
            frame.validate();
            frame.repaint();
        }

    };
    return toggleComponentOrientation;
}

用它配置一个动作感知组件,将使框架的行为符合预期,即填充整个区域。许多重新/输入/验证看起来很奇怪 - 但结果证明是必要的(在 jdk6 中),正如我们在SwingX 测试覆盖率 http://swingx.java.net

现在我的期望是,在框架实例化结束时调用相同的操作也会使其表现良好,即

.... // configure/fill frame
setVisible(true);
SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        createCOToggle(MyFrame.this).actionPerformed(null);
    }
});

不幸的是,事实并非如此。目前不知道为什么不,抱歉。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从右到左方向按钮尺寸的不相关变化 的相关文章

  • JavaFX 图像未在舞台中显示

    我尝试了很多次 尝试了很多方法 但都无法让自己的形象在舞台上如我所愿 我认为这可能与java寻找资源的路径有关 但我不确定 因为我刚刚开始使用视觉库 在本例中为JavaFX 这是我的目录结构 MyProject assets img myI
  • 将 Hibernate 对象序列化为 JSON 时抛出异常

    好吧 我正在使用 Hibernate 将一个小型数据库加载到一些表示表的类并与数据库交互 一切都很好 我真的可以看到所有结果 而且我没有任何空字段 所有这些都已被使用 这里我展示了 主 类 表 import javax persistenc
  • MongoTemplate upsert - 从 pojo 进行更新的简单方法(哪个用户已编辑)?

    这是一个简单的 pojo public class Description private String code private String name private String norwegian private String en
  • jvm 次要版本与编译器次要版本

    当运行使用具有相同主要版本但次要版本高于 JVM 的 JDK 编译的类时 JVM 会抛出异常吗 JDK 版本并不重要 类文件格式版本 http blogs oracle com darcy entry source target class
  • URL.setURLStreamHandlerFactory

    我正在使用带有嵌入式 Jetty 的可执行 jar 开发一个 Web 应用程序 我的jar包含一个依赖jar jar in jar 我参考了JarRsrcLoader and RsrcURLStreamHandlerFactory由 Ecl
  • 如何开始使用 Chainsaw for Log4j?

    我想开始使用 Chainsaw v2 几乎没有关于它的信息 我只找到了this http www velocityreviews com forums t140105 help using chainsaw for log4j html 但
  • 定期更新 SWT 会导致 GUI 冻结

    Problem 当 GUI 字段定期更新时 SWT 会冻结 我想要一个基于 SWT 的 GUI 其中文本字段的值会定期递增 最初我从单独的线程访问 textField 导致抛出异常 线程 Thread 0 org eclipse swt S
  • 有多少种方法可以将位图转换为字符串,反之亦然?

    在我的应用程序中 我想以字符串的形式将位图图像发送到服务器 我想知道有多少种方法可以将位图转换为字符串 现在我使用 Base64 格式进行编码和解码 它需要更多的内存 是否有其他可能性以不同的方式做同样的事情 从而消耗更少的内存 现在我正在
  • 如何导入 org.apache.commons.lang3.ArrayUtils;进入 Eclipse [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我如何导入 org apache commons lang3 ArrayUtils 将库添加到 Ecl
  • 容器中的 JVM 计算处理器错误?

    最近我又做了一些研究 偶然发现了这一点 在向 OpenJDK 团队抱怨之前 我想看看是否有其他人观察到这一点 或者不同意我的结论 因此 众所周知 JVM 长期以来忽略了应用于 cgroup 的内存限制 众所周知 现在从 Java 8 更新某
  • 所有平台上的java

    如果您想用 java 为 Windows Mac 和 Linux 编写桌面应用程序 那么所有这些代码都相同吗 您只需更改 GUI 即可使 Windows 应用程序更像 Windows 等等 如果不深入细节 它是如何工作的 Java 的卖点之
  • Jenkins 的代码覆盖率 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 当您在数组列表上调用remove(object o)时,它如何比较对象?

    当您在 java 中的数组列表上调用remove object o 时 它如何比较对象以找到要删除的正确对象 它使用指针吗 或者它使用 Comparable 接口来比较对象吗 ArrayList remove 依赖于对象的实现Equal方法
  • 创建正则表达式匹配数组

    在Java中 我试图将所有正则表达式匹配返回到一个数组 但似乎您只能检查模式是否匹配某些内容 布尔值 如何使用正则表达式匹配来形成与给定字符串中的正则表达式匹配的所有字符串的数组 4城堡的回答 https stackoverflow com
  • Hibernate HQL:将对值作为 IN 子句中的参数传递

    我面临一个问题 如何使用 IN 子句将查询中的成对值的参数传递给 HQL 例如 select id name from ABC where id reg date in x y 并且参数是不同的数据类型string id 和reg date
  • JavaFX - 为什么多次将节点添加到窗格或不同的窗格会导致错误?

    我现在正在学习基本的 JavaFX 我不明白我正在阅读的书中的这一说法 不 诸如文本字段之类的节点只能添加到一个窗格中一次 将节点添加到多次窗格或不同的窗格将导致运行时错误 我可以从书中提供的UML图看出它是一个组合 但我不明白为什么 库类
  • Java中的回调接口是什么?

    SetObserver 接口的代码片段取自有效的Java 避免过度同步第67条 public interface SetObserver
  • 对于当前月份和日期但年份不同的日期,经过的月份计算未给出正确的结果

    我正在尝试计算自特定日期以来经过的月份 该函数工作正常 尽管如果我将今天的日期与过去的不同年份放在一起 它会给我一个月的差异 不到一个月 假设对于所有日期 该函数都运行良好 除了 如果今天是 2014 03 06 YYYY MM DD 并且
  • 为什么范围为“provided”的依赖项会隐藏 Maven 中的传递依赖项?

    我的 Maven 项目中有三个模块 这稍微简化了 model包含JPA注释的实体类 坚持实例化一个实体管理器并调用它的方法 应用创建类的实例model 设置一些值并将它们传递给坚持 model and 坚持显然取决于javax persis
  • 如何在不同版本的Google App Engine中使用自定义域名?

    我使用谷歌应用程序引擎作为我的 Android 和 Web 应用程序的服务器 我使用 Android Studio 开发了 Android 应用程序 并使用 Eclipse 开发了 Web 应用程序 我在应用程序引擎中部署了两个版本 第一个

随机推荐

  • Windows编程对话框背景图片

    有没有什么好的教程或方法可以将背景图像添加到 Windows 对话框中 Something similar to this 我的资源文件 稍微修剪一下 include
  • VB 字符串中的转义双引号

    我使用了下面的代码来执行schtasks来自 VB6 的命令 执行时 如果文件夹包含空格 则忽略文件夹 例如 C program files test test exe 将被转换为 c program 我该如何解决这个问题 MyAppnam
  • 在圆圈上添加点击侦听器不起作用

    我正在尝试在地图上添加点击侦听器 这是我的代码 update
  • 为什么 SET DEFINE OFF 对冒号 (:) 字符不起作用?

    我有一个脚本试图通过 sqlplus 运行 在脚本的顶部 我设置了 SET DEFINE OFF 但是 当我运行它时 我收到此错误 SP2 0552 未声明绑定变量 CHANDAWALA 我相信这种情况正在发生 因为我有几个更新语句 其中在
  • Git 服务:我想要这么简单

    我想知道如何简单地通过 http 发布水星 http en wikipedia org wiki Mercurial的hg发球 在 Windows work 框中执行以下操作 git serve 然后在 Linux 机器上简单地执行 git
  • 如何复制/替换 DLL?

    我有一个实用程序 可以通过简单地复制 替换可执行文件来更新应用程序 现在 我有一些 DLL 文件也需要更新 然而 有时 Windows 不会让我替换它 因为有东西正在使用它 有时有太多东西使用该 DLL 我无法保证它会被解锁以供我替换它 目
  • CPU、内存使用、线程池使用 - ASP NET core 身份未确认的邮件用户删除处理 - 在应用程序中还是单独的应用程序?

    我想知道什么是更合适的解决方案 我需要实现机器人来检查和删除未经确认的注册用户 例如确认邮件发送后 7 天 如果用户未确认他 她的帐户 我想从数据库中删除该用户 我想了3种方法 直接在 ASP NET Core 应用程序中实现委托并将其运行
  • 我应该将密钥放在 Flask 中的哪里?

    在读的时候exploreflask com https exploreflask com configuration html 我了解到最好的做法是使用两个不同的配置文件 一个用于开发 一个用于生产 我不明白是否将密钥放在开发或生产配置中
  • Select2 jquery - 如何获取选择框中的文本

    我输入的文本如下
  • Google+ JavaScript API:如何检测用户登录状态?

    我已经部署了 Google 登录按钮 现在我必须提供退出按钮 在此之前 我需要知道用户是否仍然登录 然后我可以显示或隐藏此按钮 我找到了这个文档 gapi auth checkSessionState sessionParams 回调 ht
  • Azure 分支 PR 策略 - 要求源分支是最新的

    我正在尝试在我的设备上获取优质分支机构政策develop分支 到目前为止我已经有了一些很好的基础知识 要求评审员批准 要求所有检查都通过 限制合并类型 我想确保 PR 中的源分支必须与其目标分支保持同步 我似乎找不到这个设置 想知道是否有人
  • 将 LEFT OUTER JOIN 转换为实体框架

    这是我想要转换为 EF4 3 的 SQL 查询 command database GetSqlStringCommand select H AUTHENTICATION ID USERNAME PERMISSIONS ORGANIZATIO
  • Spark SQL 中联接大表的优化方式是什么

    我需要使用 Spark SQL 或 Dataframe API 连接表 需要知道实现它的优化方法是什么 场景是 所有数据均以 ORC 格式 基本数据帧和参考文件 存在于 Hive 中 我需要将从 Hive 读取的一个基本文件 Datafra
  • 长按手势识别器仅在手指抬起时触发

    我在长按手势识别器方面遇到了一个有趣的问题 我将其中一个放在 UITableView 上 只有当我长按后抬起手指时它才起作用 所以基本上 我会将手指放在一个单元格上 然后当我抬起手指时 它会触发长按 我通过把printn长按开始和结束的时间
  • 使用 :data 属性作为选择器来过滤元素

    我正在尝试使用自定义数据属性通过下拉选择来过滤内容 我似乎无法让选择器正常工作 只是想知道这是否真的可能 目前正在看https api jqueryui com data selector https api jqueryui com da
  • 模型与服务解耦:如果我的模型需要服务怎么办?

    服务层应该位于模型层之上 因此 模型不应该调用服务 然而 我面临着我需要的情况 例如 interface Component getResult class Number implements Component private value
  • 自定义注解可以抛出自定义异常,而不是MethodArgumentNotValidException?

    我有一个 ExceptionHandler MethodArgumentNotValidException class 在验证失败时返回 HTTP 代码 400 我创建了一个自定义注释 需要将 HTTP 代码更改为 422 但是 由于异常处
  • Android Xperia X10 SoundPool

    我收到一些 Android 应用程序用户的报告称 X10 上没有播放声音 我有点困惑 因为它适用于我尝试过的所有其他手机 Neus One Hero Droid 我正在使用 SoundPool 类来播放声音 其他人在使用 X10 时是否遇到
  • 如何编译由多个文件组成的Go程序?

    我有一个小程序 由三个文件组成 所有文件都属于同一个包 main 但当我这样做时go build main go构建不成功 当它只是一个文件时 main go 一切正常 现在我花了一些功夫来分离代码 看起来编译器无法找到从中取出的内容mai
  • 从右到左方向按钮尺寸的不相关变化

    我将 9 个 jbutton 添加到 jpanel 中 并将面板添加到 jscrollpane 中 并将其添加到 jframe 中 http www pic1 iran forum ir images up9 954263236836585