我尝试编写一个小的TicTacToe程序,并根据用于标记该按钮的玩家(我知道,传统的十字和圆圈)为该游戏中的按钮提供图标。
现在,当我在“游戏中”检查我的按钮时,这些图标有点关闭;图标和按钮边框之间有一个很小的间隙(可能是10像素大)。
我已经尝试过了,但是没有用:
button.setHorizontalAlignement(SwingConstants.RIGHT)
示例代码:
JButton button = new JButton();
button.setPreferredSize(new Dimension(175,175)); //Note: Image is also 175x175
button.addActionListener(new MyOnClickListener());
...
class MyOnClickListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e){
JButton button = (JButton) e.getSource();
ImageIcon myIcon = new ImageIcon("source");
button.setEnabled(false);
button.setIcon(myIcon);
button.setDisabledIcon(myIcon);
}
}
看到右边的小白边?这就是我所不想要的。我希望图标完全填充按钮。 这是图标: Icon
答案 0 :(得分:1)
要删除多余的空间,请将按钮的边框设置为null
。这可能需要(在某些PLAF中)更改图标本身的外观以指示焦点,悬停,按下等。
在此屏幕截图中,右侧栏中的中间按钮处于焦点状态,而鼠标悬停在底部行的中间按钮上。
import java.awt.*;
import java.awt.image.BufferedImage;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import javax.imageio.ImageIO;
import java.net.URL;
public class TicTacToeButtons {
private JComponent ui = null;
private String path = "https://i.stack.imgur.com/sAU9n.png";
private BufferedImage image;
Image transparentImage;
private JButton getButton(int i) {
Image img = (i%2==0 ? image : transparentImage);
JButton b = new JButton(new ImageIcon(img));
b.setBorder(null);
return b;
}
TicTacToeButtons() {
try {
initUI();
} catch (Exception ex) {
ex.printStackTrace();
}
}
public void initUI() throws Exception {
if (ui!=null) return;
image = ImageIO.read(new URL(path));
transparentImage = new BufferedImage(
image.getWidth(),image.getHeight(),BufferedImage.TYPE_INT_ARGB);
ui = new JPanel(new GridLayout(3,3));
ui.setBorder(new EmptyBorder(4,4,4,4));
for (int ii=0; ii<9; ii++) {
ui.add(getButton(ii));
}
}
public JComponent getUI() {
return ui;
}
public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception useDefault) {
}
TicTacToeButtons o = new TicTacToeButtons();
JFrame f = new JFrame(o.getClass().getSimpleName());
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.setLocationByPlatform(true);
f.setContentPane(o.getUI());
f.pack();
f.setMinimumSize(f.getSize());
f.setVisible(true);
}
};
SwingUtilities.invokeLater(r);
}
}