将 JSplitPane 与 AWT 组件结合使用

2023-12-21

我有一个 AWT 画布,无法将其转换为 Swing 组件(它来自VTK http://www.vtk.org/)。我希望在 JSplitPane 中显示其中一些画布。我读过有关在 Java 中混合重型和轻型组件的内容,并且知道这是一件令人痛苦的事情,但我别无选择。如果我将 AWT 画布包装在 JPanel 内,然后将其放在分割窗格上,则分割窗格根本不起作用。但是,如果我将 AWT 画布放入 JPanel 中,然后将其放入 JScrollPane 中,然后将这些滚动窗格放入 JSplitPane 中,则分割窗格确实可以正常工作,但 AWT 画布组件无法正确调整大小。我不知道如何在移动 JSplitPane 的分隔线时使 AWT 画布组件正确调整大小。我当时可以捕捉到分隔符移动操作并在AWT画布上进行操作,但我不知道该怎么办。我尝试先调用 invalidate() 然后调用 validate() 然后调用 repaint(),但这不起作用。

有任何想法吗?

这是问题的一个例子

import javax.swing.*;
import java.awt.*;

public class SwingAWTError {
    public static void main(String[] args) {
        Canvas leftCanvas = new Canvas();
        Canvas rightCanvas = new Canvas();
        leftCanvas.setBackground(Color.RED);
        rightCanvas.setBackground(Color.BLUE);

        JPanel leftPanel = new JPanel();
        JPanel rightPanel = new JPanel();
        leftPanel.setLayout(new BorderLayout());
        rightPanel.setLayout(new BorderLayout());
        leftPanel.add(leftCanvas, BorderLayout.CENTER);
        rightPanel.add(rightCanvas, BorderLayout.CENTER);

        JScrollPane leftScroll = new JScrollPane();
        JScrollPane rightScroll = new JScrollPane();
        leftScroll.getViewport().add(leftPanel);
        rightScroll.getViewport().add(rightPanel);

        JSplitPane split = new JSplitPane();
        split.setLeftComponent(leftScroll);
        split.setRightComponent(rightScroll);
        split.setDividerLocation(400);

        JFrame frame = new JFrame();
        frame.getContentPane().setLayout(new BorderLayout());
        frame.getContentPane().add(split, BorderLayout.CENTER);
        frame.setSize(800, 800);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

这是一种肮脏的方式,但这可以解决它:

你打电话时pack()如果不调整窗口大小,不会发生太多事情。因此,当您第一次调整窗口大小然后调用pack(),您的组件已正确绘制。这意味着您可以将此脏方法放入分隔符移动侦听器方法中:

frame.setPreferredSize(frame.getSize()); // store the current size to restore it after packing.
frame.setSize(frame.getWidth() + 1, frame.getHeight()); // resize it!!
frame.pack();

我不知道它到底是什么,但这是 Java 中的一个奇怪的行为......
希望这对您有所帮助,直到您找到更好的解决方案......

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

将 JSplitPane 与 AWT 组件结合使用 的相关文章

随机推荐

  • 保护cordova Android应用程序的内容

    我正在为 Android 开发 Cordova 应用程序 所以它都是 HTML CSS Javascript 代码 这个应用程序将包含我不希望它们在互联网上自由分发的内容 主要是音频 视频和一些 XML 文件 尽管这些内容将从服务器和其他内
  • localStorage 与 SQLite?

    我正在为 Chrome 构建一个打包应用程序 查看我的数据库选项 我很好奇我是否理解使用这些选项的正确方法 使用 SQLite 我会创建表books与以下行 id title category date price qty sold 使用
  • UICollectionViewCell 不强制单元格大小

    我在用 func collectionView collectionView UICollectionView layout collectionViewLayout UICollectionViewLayout sizeForItemAt
  • 在 CQRS 中实现基于集合的约束

    我仍在努力解决与 CQRS 风格架构相关的基本 和已解决 问题 我们如何实现依赖于的业务规则a set的聚合根 以预订应用程序为例 它可以帮助您预订音乐会门票 电影座位或餐厅餐桌 在所有情况下 只会有数量有限待售 物品 让我们想象一下该事件
  • 引导程序尝试加载地图文件。如何禁用它?我需要这样做吗?

    最近在玩bootsrap3 我从源代码编译它并将 distr js 和 css 包含到我的项目中 问题是 我在 GH 开发工具中看到 它正在尝试获取 map css 文件 它为什么要这样做 如何禁用它 我需要禁用它吗 为了不在开发工具中出现
  • 如何修复来自glad.c的对符号“dlclose@@GLIBC_2.2.5”的未定义引用[重复]

    这个问题在这里已经有答案了 我正在按照以下教程学习 Openglhttps learnopengl com https learnopengl com 我在使用 cmake 设置依赖关系时遇到问题 请参阅创建窗口 https learnop
  • 如何转换 wx.GetMousePosition 坐标以适合 DC

    我正在创建一个照片查看器 用户可以使用它来标记图像 就像在 Facebook 中一样 单击要标记的图像后 我使用 wx GetMousePosition 查找鼠标在图像上单击的位置 然后 我创建用户已标记的图像的 wx MemoryDC 以
  • Rails媒体文件流通过send_data或send_file方法接受字节范围请求

    我有以下问题 声音在公共文件夹中隐藏 因为只有某些用户有权访问声音文件 所以我做了一个特定的方法 它的作用就像一个声音url 但首先计算当前用户是否允许访问这个文件 文件通过 send data 方法发送 问题是 如果它甚至可以工作的话 它
  • 无法导入名称 izip [重复]

    这个问题在这里已经有答案了 我正在尝试使用以下代码从 csv 文件转置矩阵 import csv from itertools import izip a izip csv reader open TDM csv rb csv writer
  • InAppBrowser 仅在我的域已打开时允许导航

    我知道有一千个线程在谈论这个话题 但事实是 真正阅读它们并执行它们所说的内容 我找不到关键 而且 我已经阅读并尝试了很多 我的问题如下 我正在使用 InAppBrowser 模块 InAppBrowser from ionic native
  • 无法使用 Visual Studio 2010 Express 配置 CMake

    有人可以帮助我吗 我正在尝试使用 Visual Studio 2010 Express 配置 CMake 但失败了 整个错误消息如下 C 编译器标识为 MSVC 16 0 30319 1 CXX 编译器 标识是 MSVC 16 0 3031
  • ExpressJS 中的路由处理程序和中间件函数有什么区别?

    我的理解是 中间件函数是一个路由处理程序 但它可以调用下一个函数参数以将控制权传递给堆栈上的中间件函数 这是标准路由处理程序和中间件函数之间的唯一区别吗 你所说的大部分内容都是语义 在 ExpressJS 中 中间件可以是路由处理程序 或者
  • 防止脚本在页面刷新时重新执行操作

    我正在构建自己的php cart在过去的一周里 我陷入了一些问题 我成功在购物车中添加了新商品 URL 如下所示 http blah blah com order index php action add id 84 问题很简单 如何防止在
  • 雅虎财经有数据请求上限吗?有替代方案或解决方法吗?

    你好呀 我已扫描此网站和 Google 以获取有关从雅虎财经下载股票信息的最新更新 我没有取得太大的成功 当我测试我的应用程序时 我使用以下 C 代码片段遇到了 404 服务器未找到异常 string urlTemplate http ic
  • 如何打开文件浏览器? (安卓SDK)

    如何使用 Android SDK 打开文件浏览器 如文件管理器 是否有某种意图或其他目的 不幸的是 没有内置的方法可以做到这一点 您可以尝试使用OI 文件管理器 http openintents org en filemanager 它非常
  • xmllint:非根 xml 元素上的 xmlns?

    xmllint xpath project test xml fails on
  • JDK 对实体扩展的限制

    我在转换大型 XML 文档期间收到此错误消息 JAXP00010001 解析器在本文档中遇到了超过 64000 个实体扩展 这是 JDK 施加的限制 Googled and learned about limits http docs or
  • 如何在 Maven 中启动单个目标/执行

    目前我正在调试 Android 应用程序的签名 如果我可以执行这个唯一的插件 这会容易得多
  • Java openCV - 将位图转换为 Mat 时出错

    我正在使用 Java openCV 我尝试加载一张照片并对其运行模板匹配 模板匹配方法处理Mat对象 所以我需要加载图像并将它们转换为Mat 我这样做的方法是 Bitmap i BitmapFactory decodeFile sdcard
  • 将 JSplitPane 与 AWT 组件结合使用

    我有一个 AWT 画布 无法将其转换为 Swing 组件 它来自VTK http www vtk org 我希望在 JSplitPane 中显示其中一些画布 我读过有关在 Java 中混合重型和轻型组件的内容 并且知道这是一件令人痛苦的事情