Java 防止按钮在图标更改时调整大小
Java Prevent Button Resize on Icon Change
我最近正在为带有 3x3 按钮网格的井字游戏应用程序制作 GUI。为此,我使用 GridBagLayout 添加按钮,然后将它们的图标更改为白色。当我添加一个将单击按钮的图标设置为相同大小的 'X' 的 ActionListener 时,问题就出现了。具体来说,我可以让图标改变得很好,但如果我点击一行或三列按钮,那么该行或列就会消失。我通过打印出所有按钮的大小来测试这一点,发现它们的高度或宽度减少到 20 或更低,其他按钮尺寸扩大以填满 space.
Window 在点击整行之前
Window 单击整行后
设置初始空白按钮图标的代码:
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)));
}
};
欢迎提出任何建议、解决方案或建议,谢谢!
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)));
同样,您不需要每次都重新创建图标。只需在 class 的构造函数中创建一次图标即可。
所以一开始就创建所有的图标,它们的大小都是一样的,你不必担心当你切换图标时组件会改变大小。
此外,您不需要更新包含按钮的数组。 ActionEvent 为您提供了点击源,因此您只需更改被点击按钮上的图标即可。
我最近正在为带有 3x3 按钮网格的井字游戏应用程序制作 GUI。为此,我使用 GridBagLayout 添加按钮,然后将它们的图标更改为白色。当我添加一个将单击按钮的图标设置为相同大小的 'X' 的 ActionListener 时,问题就出现了。具体来说,我可以让图标改变得很好,但如果我点击一行或三列按钮,那么该行或列就会消失。我通过打印出所有按钮的大小来测试这一点,发现它们的高度或宽度减少到 20 或更低,其他按钮尺寸扩大以填满 space.
Window 在点击整行之前
Window 单击整行后
设置初始空白按钮图标的代码:
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)));
}
};
欢迎提出任何建议、解决方案或建议,谢谢!
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)));
同样,您不需要每次都重新创建图标。只需在 class 的构造函数中创建一次图标即可。
所以一开始就创建所有的图标,它们的大小都是一样的,你不必担心当你切换图标时组件会改变大小。
此外,您不需要更新包含按钮的数组。 ActionEvent 为您提供了点击源,因此您只需更改被点击按钮上的图标即可。