Swing Ui 倍增面板重影

2023-12-06

最近我的 swing ui 遇到了问题。一切正常,直到我从 JButton 触发工具提示。之后将鼠标移到用户界面的其余部分上会导致奇怪的伪像和故障。

Bugged:

enter image description here

我无法显示整个代码,因为它太多了,但我在这里初始化按钮:

    GridBagConstraints bottompane_gbc = new GridBagConstraints();
    toggleTorConnectionButton = new JButton();      
    toggleTorConnectionButton.setToolTipText("Toggles Tor Connection.");
    toggleTorConnectionButton.setIcon(new ImageIcon(ResourceHandler.Menueicon3_1));
    toggleTorConnectionButton.setMinimumSize(new Dimension(removeFinishedDownloads.getMinimumSize().width, toggleTorConnectionButton.getIcon().getIconHeight()+5));

    toggleTorConnectionButton.addActionListener(); // unimportant
    bottompane_gbc.gridy = 1;
    bottompane_gbc.fill = GridBagConstraints.BOTH;
    bottompane_gbc.insets = new Insets(0,15,10,5);
    bottompane.add(ToggleTorConnectionButton,bottompane_gbc);


    this.add(bottompane,BorderLayout.PAGE_END);

如果有人需要更多信息来帮助我,请随时询问。我有点绝望。 XD

编辑: 经过一番修补后,我猜测问题与 swing 和我对它的使用有关。目前我使用了大量的事件监听器(这很糟糕吗?),这可能会减慢 awt 线程的速度? 以下是 HPROF 的简短摘录:http://www.pastebucket.com/96444

编辑2: 我能够在一个方便且简单的示例中重新创建错误。当您移到按钮上时,等待工具提示,然后移到用户界面上。您将看到重影:(。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;

public class Main_frame {

    public static void main(String[] args) {
        new Main_frame();
    }

    public Main_frame() {
        JFrame frame = new JFrame("LOL");
        frame.setFocusable(true);
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.setSize(new Dimension(400, 500));
        frame.setLocationRelativeTo(null);

        Download_window download_window = new Download_window();
        JTabbedPane tabbedPane = new JTabbedPane();
        tabbedPane.addTab("Download", null, download_window, "Main Download Window.");

        for (int i = 0; i < 5; i++) {
            JPanel pane = new JPanel();
            Dimension dim = new Dimension(370, 60);
            pane.setPreferredSize(dim);
            pane.setMaximumSize(dim);
            pane.setBackground(Color.blue);
            pane.setMinimumSize(dim);
            download_window.jobpanel.add(pane);
        }
        download_window.jobpanel.repaint();
        download_window.jobpanel.revalidate();

        frame.add(tabbedPane);
        frame.setVisible(true);
    }

    public class Download_window extends JPanel {

        JPanel jobpanel;

        public Download_window() {
            this.setLayout(new BorderLayout());

            jobpanel = new JPanel();
            jobpanel.setLayout(new BoxLayout(jobpanel, BoxLayout.Y_AXIS));

            JPanel bottompane = new JPanel();
            bottompane.setPreferredSize(new Dimension(385, 40));

            JButton toggleTorConnectionButton = new JButton();
            toggleTorConnectionButton.setPreferredSize(new Dimension(100, 50));
            toggleTorConnectionButton.setToolTipText("Toggles Tor Connection.");

            bottompane.add(toggleTorConnectionButton);

            this.add(bottompane, BorderLayout.PAGE_END);
            JScrollPane jobScrollPane = new JScrollPane(jobpanel);
            jobScrollPane.getVerticalScrollBar().setUnitIncrement(16);
            this.add(jobScrollPane, BorderLayout.CENTER);

        }
    }
}

编辑3:关于trashgods的想法,我使用了EventDispatchThread,我修改了setter以覆盖getter的大小,并且我通过使用trashgods代码划掉了不兼容性,并且工作正常......那么实际的区别在哪里?

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;

public class Main_frame {

public static void main(String[] args) {
     EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Main_frame();
            }
     });
}

public Main_frame() {
    JFrame frame = new JFrame("LOL");
    frame.setResizable(false);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(new Dimension(400, 500));

    Download_window download_window = new Download_window();
    JTabbedPane tabbedPane = new JTabbedPane();
    tabbedPane.addTab("Download", null, download_window, "Main Download Window.");
    frame.add(tabbedPane);

    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
}

public class Download_window extends JPanel {

    JPanel jobpanel;

    public Download_window() {
        this.setLayout(new BorderLayout());

        jobpanel = new JPanel();
        jobpanel.setLayout(new BoxLayout(jobpanel, BoxLayout.Y_AXIS));
        for (int i = 0; i < 5; i++) {
            JPanel pane = new JPanel(){
                @Override
                public Dimension getPreferredSize() {
                    return new Dimension(370, 60);
                }
                @Override
                public Dimension getMaximumSize() {
                    return new Dimension(370, 60);
                }
                @Override
                public Dimension getMinimumSize() {
                    return new Dimension(370, 60);
                }
            };
            pane.setBackground(Color.blue);
            jobpanel.add(pane);
        }

        JPanel bottompane = new JPanel(){
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(385, 40);
            }
        };

        JButton toggleTorConnectionButton = new JButton("Button"){
             @Override
             public Dimension getPreferredSize() {
                 return new Dimension(100, 30);
             }
        };
        toggleTorConnectionButton.setToolTipText("Toggles Tor Connection.");
        bottompane.add(toggleTorConnectionButton);
        this.add(bottompane, BorderLayout.PAGE_END);


        JScrollPane jobScrollPane = new JScrollPane(jobpanel);
        jobScrollPane.getVerticalScrollBar().setUnitIncrement(16);
        this.add(jobScrollPane, BorderLayout.CENTER);

    }
}
}

有人可以亲自验证一下这种奇怪的行为吗?您只需将上面的代码复制粘贴到 Edit3 中即可。


在我的平台上运行时,您的代码没有出现上面显示的任何故障。

  • 确认您没有绘画问题,例如忽视super.paintComponent()正如所讨论的here.

  • 验证您是否没有驱动程序不兼容问题,如所讨论的here.

  • 构造和修改所有GUI对象事件派发线程.

  • 不要使用set[Preferred|Maximum|Minimum]Size()当你真正想要覆盖时get[Preferred|Maximum|Minimum]Size(),正如所讨论的here。下面的示例覆盖getPreferredSize()在滚动窗格上,但您可以实施Scrollable,正如所讨论的here.

image

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;

/** @see https://stackoverflow.com/a/34319260/230513 */
public class MainFrame {

    private static final int H = 64;

    public static void main(String[] args) {
        EventQueue.invokeLater(() -> new MainFrame());
    }

    public MainFrame() {
        JFrame frame = new JFrame("LOL");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JTabbedPane tabbedPane = new JTabbedPane();
        JPanel panel = new JPanel(new GridLayout(0, 1, 5, 5));
        for (int i = 0; i < 8; i++) {
            panel.add(new DownloadPanel());
        }
        JScrollPane jsp = new JScrollPane(panel) {
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(6 * H, 4 * H);
            }
        };
        tabbedPane.addTab("Download", null, jsp, "Main Download Window.");
        tabbedPane.addTab("Options", null, null, "Options");
        frame.add(tabbedPane);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    private static class DownloadPanel extends JPanel {

        JPanel jobPanel = new JPanel();

        public DownloadPanel() {
            this.setLayout(new BorderLayout());
            this.setBackground(Color.lightGray);
            JProgressBar jpb = new JProgressBar();
            jpb.setIndeterminate(true);
            this.add(jpb);
            JPanel buttonPane = new JPanel();
            JButton toggleTorConnectionButton = new JButton("Button");
            toggleTorConnectionButton.setToolTipText("Toggles Tor Connection.");
            buttonPane.add(toggleTorConnectionButton);
            this.add(buttonPane, BorderLayout.WEST);
        }

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

Swing Ui 倍增面板重影 的相关文章

  • 如何创建像Foursquare兴趣选择屏幕一样的gridview?

    我正在创建一个应用程序 要求用户选择多个兴趣 我正在尝试创建一个类似于 Foursquare 兴趣选择的屏幕类似于标签云其中可以选择多个按钮来代表用户的兴趣 我尝试创建一个 gridview 但无法实现按钮换行到下一行的效果 有没有办法通过
  • 在记录活动中使用 readConfiguration 方法

    为了在小型 Java 桌面应用程序中使用日志记录 我试图深入了解一些方法的操作 我使用一个非常愚蠢的小Java程序来测试它们 特别是 在测试 LogManager readConfiguration 方法的行为时 我发现了一些奇怪的事情 在
  • Hibernate统计打印HQL:null

    我是使用休眠的新手 我打开了统计信息 与普通的 HQL 查询一起 我得到了许多这样的统计信息 INFO Statistics HQL null time 1724ms rows blah 有人可以以任何方式帮助我为什么null查询大约需要
  • 单击按钮时更改照片

    import javax swing Icon import javax swing ImageIcon public class Stage1 extends javax swing JFrame int score 0 int iter
  • 在java中将HTML转换为RTF?

    我需要将 HTML 转换为 RTF 我正在使用以下代码 private static String convertToRTF String htmlStr OutputStream os new ByteArrayOutputStream
  • 问题:将大数据传递给第二个 Activity

    我有一个奇怪的问题 我在网上浏览但没有找到答案 我仍然是android编程的初学者 那么让我们开始吧 我想做的就是用一些数据调用第二个活动 它适用于小数据 但如果数据变大 第二个 Activity 将不会显示 第一个 Activity 将完
  • Apache HttpClient 4.x 在上传较大文件时表现奇怪?

    我正在使用 java 和 scala 开发和测试一个简单的客户端 服务器应用程序 The server是基于com sun net httpserver HttpServer并允许使用 POST 和 PUT 操作通过基本的 RESTful
  • 无法在 PHP 中接收 JSON POST 请求

    我正在将 JSON 对象从 Java 传递到 PHP 我正在使用 jdk 1 8 和 WAMPserver 下面是Java代码 import java io IOException import org apache http client
  • Log4j 2.x 如何实现惰性参数求值?

    鉴于Java 参数评估机制 http docs oracle com javase specs jls se8 html jls 15 html jls 15 12 4 2 如何Log4j 2 x实施惰性评估 https logging a
  • double 或 BigDecimal 会溢出吗?

    Java 8 给了我们Math addExact https docs oracle com javase 8 docs api java lang Math html addExact int int 适用于整数 但不适用于小数 是否有可
  • 面临 process.start(); 的问题在 Android 棒棒糖中

    面临一个问题process start 在 Android 棒棒糖中 我在服务中遇到了 android lollipop 后台进程的问题 我的代码在 KitKat 之前工作正常 我有一个ProcessBuilder pBuilder并向其中
  • Java Reflection:为什么这么慢?

    我一直避免使用 Java 反射 因为它速度缓慢 我在当前项目的设计中达到了一个点 能够使用它将使我的代码更具可读性和优雅性 所以我决定尝试一下 我只是对这种差异感到惊讶 我注意到有时运行时间几乎延长了 100 倍 即使在这个简单的例子中 它
  • NoSuchMethodError:org.springframework.data.repository.config.RepositoryConfigurationSource.getAttribute

    我正在尝试在 spring boot 应用程序中使用 spring data redis 来使用 redis 我正在创造JedisConnectionFactory如下 RedisStandaloneConfiguration config
  • 菜单项标题未显示

    菜单项的标题未显示在片段内 我在菜单文件中有两个项目 第一个是带有图标和标签的showAsAction always在工具栏中显示图标 第二个只有标题 我不知道这里出了什么问题 菜单项的所有操作均有效 例如下面 菜单 销售 xml menu
  • Java - 动态创建子类

    我想以编程方式创建一个子类 我想我的选择很少 Javassist CGLib BCEL 或 ASM 用例是一个应用程序的内部是面向类的 而扩展是基于类的 因此 我不能将单个类作为由外部化脚本驱动的多个扩展的基础 现在 我该怎么做呢 我找到了
  • SwingWorker 和 Executor 的区别

    我正在使用 SwingWorker 在我正在制作的应用程序上执行一些重负载任务 虽然今天我遇到了 Executor 类和这个例子 Executors newCachedThreadPool execute new Runnable publ
  • 解决SecurityException:权限拒绝:启动意图。我需要什么许可?

    我想从应用程序打开游戏商店 在三星手机上还好 但在一加手机上却失败了 我不知道在哪里alibaba来自 真奇怪 异常 java lang SecurityException 权限拒绝 启动意图 act android intent acti
  • 如何处理JFreeChart中的SpiderWebPlot?

    发现 JFreeChart 我在使用时遇到了问题蜘蛛网情节 http www jfree org jfreechart api javadoc org jfree chart plot SpiderWebPlot html 这就是我今天所拥
  • Tomcat 中 JNDI 的 Java Mail API 配置文档

    我花了几天时间弄清楚如何通过 JNDI 在 Tomcat 中配置 javax mail Session有认证 现在我明白了 但只是在深入研究代码之后 这次我看到了有史以来最糟糕的代码 javax mail Service connect S
  • java中的“main”可以返回字符串吗?

    java中的public static void main String args 是否有可能返回String代替void 如果是 怎么办 public static String main String args 代替 public st

随机推荐

  • 当用户移动地图时捕获bounds_changed事件,但不捕获setCenter方法

    我想在用户移动地图 更改缩放时监听 bounds changed 事件 但我不希望当我的程序调用 setCenter 或 setZoom 方法时触发它 所以我尝试在设置中心之前删除事件 然后再次添加它 但是 这没有用 我的活动仍在被解雇 v
  • VS 2010:状态栏上的++文件符号是什么?

    我正在尝试在我的 Win 7 Pro 开发盒上的 XP 虚拟机中运行 VS 2010 它基本上可以工作 但是当在这种环境中实际编辑代码时 我的编辑能力会不断停止并在很长一段时间内断断续续 例如 每 50 秒的运行环境就会暂停 20 秒 这台
  • 如何使用 JQuery 重定向,加载另一个页面但在请求中发送一些 POST 参数?

    如何使用 JQuery DOJO 或纯 JavaScript 进行重定向 加载另一个页面但在请求中发送一些 POST 参数 这应该有效 但我还没有测试过 function postData url data var form
  • 什么是C本地函数声明机制?

    gcc 中似乎允许本地函数声明 我发现了对此的讨论 局部函数声明有什么用处吗 但是 我的问题是 ISO C 标准允许吗 如果是的话 如何解释以下令人费解的现象 int main void int f void f void g void g
  • Hashtable 中最大值的键

    嗨我有以下对象 Hashtable
  • Java应用程序使用系统中的最大可用内存

    有 Xmx 和 max heap size jnlp 选项来设置 java 应用程序可以使用的最大内存 如果未指定这些选项 则仅允许应用程序使用系统中少量的可用物理内存 这就是人们使用 Xmx 来允许应用程序使用更多内存的原因 但这对我来说
  • 如何在 Windows 批处理文件中回显 >>someText

    我想将确切的文本 gt gt someText 打印到控制台 I try echo abb gt gt cdd eee 但这不会打印任何内容并创建文件cdd里面有 abb 文本 我应该使用什么语法echo为了那个原因 你必须 转义 特殊字符
  • ELB 使用带有自签名证书的 HTTPS 到后端服务器

    我希望设置一个使用 HTTPS 与后端服务器通信的 ELB 我正在尝试使用单个后端服务器设置概念验证 但似乎无法让 ELB 与服务器通信 我几乎可以肯定这是一个证书问题 因为任何没有 SSL 的设置都可以完美运行 我该如何设置 我尝试了多个
  • 如何计算大型数据帧的欧几里德距离(并仅保存摘要)

    我编写了一个简短的 for 循环来查找数据帧中每一行与所有其他行之间的最小欧几里德距离 并记录哪一行最接近 理论上 这可以避免与尝试计算非常大的矩阵的距离度量相关的错误 然而 虽然内存中保存的内容不多 但对于大型矩阵来说速度非常慢 我的约
  • 如何命名 r 中的“行名称”列

    我正在使用 r 中的数据框 其中我的行名称是有意义的 因此 我想给行名称列一个名称 我该怎么做呢 听起来您想将行名转换为 data frame 的正确列 例如 add the rownames as a proper column myDF
  • 如何将 Ajax 与 Django 应用程序集成?

    我对 Django 很陌生 对 Ajax 也很陌生 我正在开展一个项目 需要将两者整合起来 我相信我了解它们背 后的原理 但还没有找到将两者结合在一起的很好的解释 有人能给我快速解释一下代码库必须如何随着两者集成在一起而改变吗 例如 我还可
  • 带有三元运算符的 NullPointerException [重复]

    这个问题在这里已经有答案了 为什么这有效 String a null String b a null a equals Nan Nan a System out println b 但这会产生 NPE Double value null D
  • 从Python中的列表列表的内部列表中获取第n个元素[重复]

    这个问题在这里已经有答案了 可能的重复 内部列表中的第一项尽可能高效 可以说我有 a 1 2 2 9 3 7 我想检索每个内部列表的第一个元素 b 1 2 3 无需这样做 我当前的黑客 for inner in a b append inn
  • 交叉编译内核模块:模块格式无效

    我正在尝试交叉编译 helloworld 内核模块 其规范如下 主机 intel x86 32位 linux 3 0 0 目标 ARM机器 Parrot AR Drone linux 2 6 27 47 我正在使用 makefile PWD
  • 如何在D3中添加强制拖动事件并使节点保持在我离开的位置?

    我有一个 D3 api 它显示节点之间的某种关系 我想在这里应用 force drag 事件 我将把节点拖动到某个位置并离开节点 它将留在那里 我这里有一个工作小提琴 它显示了节点之间的关系 任何人都可以帮助我从这里在这个 api 中执行此
  • Sizeof 与 Strlen

    include
  • 如何用VBA读取IE表格文本?

    我正在尝试编写 vba 代码来遵循此过程 自动填写并提交网络表单 打开一个新网页 其中包含答案http ec europa eu taxation customs vies locale en 找到新网页的地址 因为我需要阅读此内容 读取h
  • WTForms 日期验证

    我目前正在尝试使用 Flask 构建一个简单的 Web 应用程序 我也使用 WTForms 但是我在从表单获取日期信息并对其进行验证时遇到问题 这是形式 from flask wtf import FlaskForm from wtform
  • 递归文件搜索

    我试图弄清楚如何解决这个问题 出于某种原因 它在某个点结束 我不太擅长递归 我确信问题出在某个地方 另外 即使我检查了 cFileName 它仍然显示在最后 不知道为什么 但 不再出现了 void find files wstring wr
  • Swing Ui 倍增面板重影

    最近我的 swing ui 遇到了问题 一切正常 直到我从 JButton 触发工具提示 之后将鼠标移到用户界面的其余部分上会导致奇怪的伪像和故障 Bugged 我无法显示整个代码 因为它太多了 但我在这里初始化按钮 GridBagCons