JButton Icon немного выключен - PullRequest
0 голосов
/ 03 июля 2018

Я попытался запрограммировать небольшое TicTacToe и дал кнопкам, которые я использовал для игры, значок в зависимости от того, какой игрок пометил эту кнопку (вы знаете, традиционный крестик и кружок).

Теперь, когда я проверяю свои кнопки "в игре", значки немного не отображаются; между значком и границей кнопки есть небольшой (может быть, 10 px).

Я уже пробовал это, но это не сработало:

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);
    }
}

Снимок экрана кнопки

image

Видите это маленькое белое поле справа? Это то, чего я не хочу. Я хочу, чтобы значок полностью заполнил кнопку. Вот иконка: Icon

image

1 Ответ

0 голосов
/ 03 июля 2018

Чтобы удалить постороннее пространство, установите границу кнопки на null. Это может потребовать (в некоторых PLAF) изменения внешнего вида самого значка, чтобы указать фокус, зависание, нажатие и т. Д.

На этом скриншоте средняя кнопка в правой колонке сфокусирована, а мышь находится над средней кнопкой в ​​нижнем ряду.

enter image description here

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);
    }
}
...