【问题标题】:Java Prevent Button Resize on Icon ChangeJava 防止在图标更改时调整按钮大小
【发布时间】:2023-03-07 15:29:01
【问题描述】:

我最近正在为带有 3x3 按钮网格的井字游戏应用程序制作 GUI。为此,我使用 GridBagLayout 添加按钮,然后将它们的图标更改为白色。当我添加一个将单击按钮的图标设置为相同大小的“X”的 ActionListener 时,就会出现问题。具体来说,我可以让图标更改得很好,但是如果我单击三个按钮的行或列,那么该行或列就会消失。我通过打印出所有按钮的大小来测试这一点,发现它们的高度或宽度减少到 20 或更低,而其他按钮的尺寸扩大以填满空间。

点击整行之前的窗口

点击整行后的窗口

设置初始空白按钮图标的代码:

while(i < cells.length) {
        cells[i].cell = new JButton(new ImageIcon(br.getScaledInstance(100, 100, BufferedImage.SCALE_FAST)));
        cells[i].cell.setBorder(BorderFactory.createEmptyBorder());
        cells[i].cell.setFocusPainted(false);
        if(i < 3) {
        cells[i].cell.setBorder(lines);
        }
        if(i >= 3 && i < 6) {
            cells[i].cell.setBorder(line2);
        }
        if(i >= 6) {
            cells[i].cell.setBorder(nat);
        }

        i++;
    }

点击时设置X的代码:

ActionListener act = new ActionListener() {

        public void actionPerformed(ActionEvent e) {

            JButton testo = (JButton) e.getSource();
            loc = getIndice(testo);
            System.out.println("LOC IS: " + loc);


                cells[loc].cell.setIcon(new ImageIcon(bro.getScaledInstance(cells[loc].cell.getSize().width, cells[loc].cell.getSize().height , BufferedImage.SCALE_SMOOTH)));  
        }
    };

欢迎任何建议、解决方案或建议,谢谢!

【问题讨论】:

    标签: java swing button layout icons


    【解决方案1】:
    cells[i].cell = new JButton(new ImageIcon(br.getScaledInstance(100, 100, BufferedImage.SCALE_FAST)));
    

    您不需要为每个按钮创建单独的图标。您可以在循环外创建一次图标,然后为每个按钮使用图标

    当您更改按钮时,您使用按钮的大小。由于您的按钮使用边框,因此您不能使用按钮的大小作为空白图标大小和“X”图标大小会有所不同。只需像创建默认图标时一样使用 (100, 100) 即可。代码会简单得多:

     cells[loc].cell.setIcon(new ImageIcon(bro.getScaledInstance(100, 100, BufferedImage.SCALE_SMOOTH)));  
    

    同样,您不需要每次都重新创建图标。只需在类的构造函数中创建一次图标。

    所以一开始就创建所有的图标,它们的大小都是一样的,你不必担心切换图标时组件会改变大小。

    您也不需要更新包含按钮的数组。 ActionEvent 为您提供了点击的来源,因此您只需更改被点击按钮上的图标。

    【讨论】:

    • 非常感谢您的建议,我尝试了您所说的并制作了一次图标,并在触发 ActionEvents 时停止更新包含按钮的数组。但是,我仍然遇到同样的问题,我还尝试删除按钮周围的边框以查看是否解决了问题,但它仍然存在。我注释掉了我的 ComponentListener,它正在监听组件何时调整大小并且问题消失了。我猜这意味着更改图标会触发 ComponentEvent。感谢您的意见!
    猜你喜欢
    • 2011-02-10
    • 2014-04-02
    • 2019-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多