单击后防止 JButton repaint()

2024-02-25

我有一个按钮。我想在点击后更改背景。我的问题是按钮自动呼叫paintComponent()。如何防止这种情况发生?我预计点击按钮后按钮将是蓝色的,但它仍然是红色的。

package test;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class ButtonDemo extends JButton implements ActionListener{

    public ButtonDemo() {
        this.setText("BUTTON TEXT");
        this.addActionListener(this);
    }
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        setBackground(Color.RED);
    }
    public static void main(String[] args){
        JFrame frame = new JFrame();
        JPanel contentPane = new JPanel();
        frame.setContentPane(contentPane);
        contentPane.add(new ButtonDemo());
        frame.setSize(500, 500);

        frame.setVisible(true);

    }
    @Override
    public void actionPerformed(ActionEvent e) {
        this.setBackground(Color.BLUE);
    }  
}

我个人的直觉是JButton可能不适合您期望的目标。

本质上,您想要控制何时以及如何更改片段的“选定”状态。

就我个人而言,我会拥有某种以某种方式监视鼠标事件的控制器(可能让部件组件将事件委托回控制器)和某种控制部件何时被选择的模型,然后这将通知控制器状态发生变化,它会对 UI 进行适当的更新。

但这是一个漫长的设置过程。相反,我演示了一个简单的概念,可以使用鼠标选择组件,但只有控制器可以取消选择。在此示例中,这将只允许选择单个片段

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.LineBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class Main {

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

    public Main() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new GridLayout(5, 5));

            ChangeListener listener = new ChangeListener() {
                private PiecePane selectedPiece;

                @Override
                public void stateChanged(ChangeEvent e) {
                    if (!(e.getSource() instanceof PiecePane)) { return; }

                    PiecePane piece = (PiecePane) e.getSource();

                    // Want to ignore events from the selected piece, as this
                    // might interfer with the changing of the pieces
                    if (selectedPiece == piece) { return; }

                    if (selectedPiece != null) {
                        selectedPiece.setSelecetd(false);
                        selectedPiece = null;
                    }

                    selectedPiece = piece;
                }
            };

            for (int index = 0; index < 5 * 5; index++) {
                PiecePane pane = new PiecePane();
                pane.addChangeListener(listener);
                add(pane);
            }
        }

    }

    public class PiecePane extends JPanel {

        private boolean selecetd;
        private Color selectedBackground;
        private Color normalBackground;

        private MouseListener mouseListener;

        public PiecePane() {
            setBorder(new LineBorder(Color.DARK_GRAY));
            mouseListener = new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    setSelecetd(true);
                }
            };

            setNormalBackground(Color.BLUE);
            setSelectedBackground(Color.RED);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(50, 50);
        }

        @Override
        public void addNotify() {
            super.addNotify(); 
            addMouseListener(mouseListener);
        }

        @Override
        public void removeNotify() {
            super.removeNotify(); 
            removeMouseListener(mouseListener);
        }

        public void addChangeListener(ChangeListener listener) {
            listenerList.add(ChangeListener.class, listener);
        }

        public void removeChangeListener(ChangeListener listener) {
            listenerList.remove(ChangeListener.class, listener);
        }

        protected void fireSelectionChanged() {
            ChangeListener[] listeners = listenerList.getListeners(ChangeListener.class);
            if (listeners.length == 0) {
                return;
            }
            ChangeEvent evt = new ChangeEvent(this);
            for (int index = listeners.length - 1; index >= 0; index--) {
                listeners[index].stateChanged(evt);
            }
        }

        public boolean isSelected() {
            return selecetd;
        }

        public void setSelecetd(boolean selecetd) {
            if (selecetd == this.selecetd) { return; }
            this.selecetd = selecetd;
            updateSelectedState();
            fireSelectionChanged();
        }

        public Color getSelectedBackground() {
            return selectedBackground;
        }

        public void setSelectedBackground(Color selectedBackground) {
            this.selectedBackground = selectedBackground;
            updateSelectedState();
        }

        public Color getNormalBackground() {
            return normalBackground;
        }

        public void setNormalBackground(Color normalBackground) {
            this.normalBackground = normalBackground;
            updateSelectedState();
        }

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

单击后防止 JButton repaint() 的相关文章

  • Java new Date() 打印

    刚刚学习 Java 我知道这可能听起来很愚蠢 但我不得不问 System out print new Date 我知道参数中的任何内容都会转换为字符串 最终值是 new Date 返回对 Date 对象的引用 那么它是如何打印这个的呢 Mo
  • 如何默认将 Maven 插件附加到阶段?

    我有一个 Maven 插件应该在编译阶段运行 所以在项目中consumes我的插件 我必须做这样的事情
  • Java EE:如何获取我的应用程序的 URL?

    在 Java EE 中 如何动态检索应用程序的完整 URL 例如 如果 URL 是 localhost 8080 myapplication 我想要一个可以简单地将其作为字符串或其他形式返回给我的方法 我正在运行 GlassFish 作为应
  • JAXb、Hibernate 和 beans

    目前我正在开发一个使用 Spring Web 服务 hibernate 和 JAXb 的项目 1 我已经使用IDE hibernate代码生成 生成了hibernate bean 2 另外 我已经使用maven编译器生成了jaxb bean
  • INSERT..RETURNING 在 JOOQ 中不起作用

    我有一个 MariaDB 数据库 我正在尝试在表中插入一行users 它有一个生成的id我想在插入后得到它 我见过this http www jooq org doc 3 8 manual sql building sql statemen
  • 无法展开 RemoteViews - 错误通知

    最近 我收到越来越多的用户收到 RemoteServiceException 错误的报告 我每次给出的堆栈跟踪如下 android app RemoteServiceException Bad notification posted fro
  • 列出jshell中所有活动的方法

    是否有任何命令可以打印当前 jshell 会话中所有新创建的方法 类似的东西 list但仅适用于方法 您正在寻找命令 methods all 它会打印所有方法 包括启动 JShell 时添加的方法 以及失败 被覆盖或删除的方法 对于您声明的
  • Liferay ClassNotFoundException:DLFileEntryImpl

    在我的 6 1 0 Portal 实例上 带有使用 ServiceBuilder 和 DL Api 的 6 1 0 SDK Portlet 这一行 DynamicQuery query DynamicQueryFactoryUtil for
  • 操作错误不会显示在 JSP 上

    我尝试在 Action 类中添加操作错误并将其打印在 JSP 页面上 当发生异常时 它将进入 catch 块并在控制台中打印 插入异常时出错 请联系管理员 在 catch 块中 我添加了它addActionError 我尝试在jsp页面中打
  • 斯坦福 NLP - 处理文件列表时 OpenIE 内存不足

    我正在尝试使用斯坦福 CoreNLP 中的 OpenIE 工具从多个文件中提取信息 当多个文件 而不是一个 传递到输入时 它会给出内存不足错误 All files have been queued awaiting termination
  • 如何为俚语和表情符号构建正则表达式 (regex)

    我需要构建一个正则表达式来匹配俚语 即 lol lmao imo 等 和表情符号 即 P 等 我按照以下示例进行操作http www coderanch com t 497238 java java Regular Expression D
  • JRE 系统库 [WebSphere v6.1 JRE](未绑定)

    将项目导入 Eclipse 后 我的构建路径中出现以下错误 JRE System Library WebSphere v6 1 JRE unbound 谁知道怎么修它 右键单击项目 特性 gt Java 构建路径 gt 图书馆 gt JRE
  • 总是使用 Final?

    我读过 将某些东西做成最终的 然后在循环中使用它会带来更好的性能 但这对一切都有好处吗 我有很多地方没有循环 但我将 Final 添加到局部变量中 它会使速度变慢还是仍然很好 还有一些地方我有一个全局变量final 例如android Pa
  • 加密 JBoss 配置中的敏感信息

    JBoss 中的标准数据源配置要求数据库用户的用户名和密码位于 xxx ds xml 文件中 如果我将数据源定义为 c3p0 mbean 我会遇到同样的问题 是否有标准方法来加密用户和密码 保存密钥的好地方是什么 这当然也与 tomcat
  • Java Integer CompareTo() - 为什么使用比较与减法?

    我发现java lang Integer实施compareTo方法如下 public int compareTo Integer anotherInteger int thisVal this value int anotherVal an
  • Java执行器服务线程池[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果我使用 Executor 框架在
  • 如何从指定日期获取上周五的日期? [复制]

    这个问题在这里已经有答案了 如何找出上一个 上一个 星期五 或指定日期的任何其他日期的日期 public getDateOnDay Date date String dayName 我不会给出答案 先自己尝试一下 但是 也许这些提示可以帮助
  • 如何在桌面浏览器上使用 webdriver 移动网络

    我正在使用 selenium webdriver 进行 AUT 被测应用程序 的功能测试自动化 AUT 是响应式网络 我几乎完成了桌面浏览器的不同测试用例 现在 相同的测试用例也适用于移动浏览器 因为可以从移动浏览器访问 AUT 由于它是响
  • 玩!框架:运行“h2-browser”可以运行,但网页不可用

    当我运行命令时activator h2 browser它会使用以下 url 打开浏览器 192 168 1 17 8082 但我得到 使用 Chrome 此网页无法使用 奇怪的是它以前确实有效 从那时起我唯一改变的是JAVA OPTS以启用
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List

随机推荐

  • 使用 IServiceProvider 获取会话服务

    我需要使用 IServiceProvider 访问 ASP NET Core 1 0 中的 ConfigureService 方法中的会话变量 我有一个使用委托 lambda 表达式初始化的服务 可以从任何地方返回值 在此上下文中 此 la
  • Java中的动态方法调度[重复]

    这个问题在这里已经有答案了 以下是关于我的疑问的代码片段 class A void someMethod A param System out println A class C extends A void someMethod C pa
  • 仅使用 Java.IO 从文件读取/写入字节

    在 Java 中 我们如何将字节数组写入文件 并从该文件中读回 是的 我们都知道已经有很多这样的问题 但由于完成这项任务的方法有很多 所以它们变得非常混乱和主观 因此 让我们缩小问题的范围 Domain 安卓 Java 我们想要什么 快 尽
  • 如何删除默认标记?

    我正在使用 Google Map API V3 我注意到这里有很多标记 尽管我不需要它们 例如 一些学校或其他地方 点击时会出现InfoWindows 有什么办法可以删除它们还是不可能 地图上唯一应该显示的标记是您自己添加的标记 愿意分享您
  • SimpleAudioEngine Cocos2d 内存泄漏

    I am running Instruments and it indicates that the SimpleAudioEngine is leaking memory The screenshot is attached The me
  • 如何从 ASP.NET Web 服务生成 JSONP 以进行跨域调用?

    我编写了一个返回 JSON 的 Web 服务 并尝试使用 jQuery 调用它 如下所示 ajax contentType application json charset utf 8 url http examplewebsite com
  • 保护 Java 中的 REST API [已关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在 Java 中使用 Jersey 构建 REST API 我想使用 API 令牌安全方案来保护敏感
  • Mercurial中如何重复合并分支

    我们在工作中使用 Mercurial 我希望有一个类似于我使用 SVN 的设置 Trunk Tags 生产 Branches 由于 Mercurial 本身支持分支 因此我知道如何创建命名分支 但我找不到任何有关如何重复合并 Trunk 与
  • 如何在 recyclerView 向下滚动时折叠后隐藏工具栏

    如何在recyclerView向下滚动时折叠后隐藏工具栏 在recyclerView向上滚动时显示工具栏 并在列表末尾展开CollapsingToolbarLayout 现在 CollapsingToolbarLayout 只是折叠 工具栏
  • 如何从类路径加载属性文件? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions getResourceAsStrea
  • 在 django 中使用 Pre_delete 信号

    在我的应用程序中 我想跟踪所有正在删除的问题 所以我在我的模型文件中创建了一个类 表 class Deleted models Model question models IntegerField null True blank True
  • MySQL:从 sql 脚本文件在事务内执行 LOAD 语句

    我想从一些 csv 文件加载我的表格 我希望所有数据导入都是事务绑定的 即 如果任何数据导入中发生错误 其他表中加载的所有记录也会回滚 load 语句是从如下所示的 sql 文件执行的 SET AUTOCOMMIT 0 START TRAN
  • 带分类器的 Ivy 检索

    我有以下内容ivy xml
  • 如何给AutoHotkey脚本添加管理员权限?

    我将其编译为可执行文件 但要打开它 我必须右键单击并按 以管理员身份运行 我希望它每次运行时都请求管理员权限 但该怎么做呢 我不能这样做 因为当我将其复制到第二台计算机时它不起作用 尝试将其添加到自动执行部分 脚本顶部 If the scr
  • Ruby(猴子修补数组)

    我在猴子修补数组类时遇到问题 这项作业有8 specs被满足 我只会向您提供我遇到问题的部分的 RSpec 和书面要求 因为其他一切似乎都通过了 以下是 Array Class Monkey 补丁的书面要求 写一个新的new map的实例上
  • Flex 布局混合行和列

    我可以使用这个布局float容易地 但很难处理弹性盒 css a background red float left width 30 height 100px b c background green overflow hidden he
  • Asp.Net MVC + CSLA + DDD 可能吗

    前几天 我被要求审查一个基于 ASP NET MVC CSLA DDD 域驱动设计 的系统 该系统的第一个版本是基于ASP NET MVC CSLA 第二个版本是在此基础上添加了 DDD 原因是 嗯 我不知道是什么 当我查看两种不同架构的图
  • Anaconda Navigator 无法创建新环境

    我在工作中需要使用Python 今天刚刚安装了Anaconda Navigator 我可以毫无问题地打开 Navigator GUI 我可以打开 创建新环境 提示 我填写详细信息并点击 确定 导航器在基本 根 选项卡下为我请求的环境创建一个
  • 由于 gcc 编译器版本不受支持,Caffe 编译失败

    我挣扎着Caffe http caffe berkeleyvision org 汇编 不幸的是我没能编译它 Steps http caffe berkeleyvision org installation html cmake compil
  • 单击后防止 JButton repaint()

    我有一个按钮 我想在点击后更改背景 我的问题是按钮自动呼叫paintComponent 如何防止这种情况发生 我预计点击按钮后按钮将是蓝色的 但它仍然是红色的 package test import java awt Color impor