Java Swing - Создание прозрачных кнопок J, непрозрачных границ - PullRequest
0 голосов
/ 27 марта 2020

У меня есть JFrame, а внутри него JLabel, заполненный изображением карты. Я хочу, чтобы на сетке над изображением карты был кликабельный квадрат «Плитка». Для этого я создал большую сетку кнопок J, которые я добавил в JLabel, содержащую карту. Однако карту не видно, поэтому я сделал кнопки J полностью прозрачными. Однако, когда они прозрачны, я не вижу, где заканчивается один JButton, а где начинается другой. Я хочу создать JButton, который полностью прозрачен внутри, но все еще имеет видимую границу вокруг него. Я пробовал setOpaque(false), а затем setBorderPainted(true), но это снова делает их непрозрачными. Я перепробовал все, что мог найти, но ничего не происходит. Любые предложения?

Еще раз, все, что я хочу, это прозрачный JButton с видимыми границами

1 Ответ

1 голос
/ 27 марта 2020

Вы можете заменить границу своей собственной ...

Border Button

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.LineBorder;

public class Test {

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

    public Test() {
        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() {
            setBackground(Color.RED);
            setLayout(new GridBagLayout());
            JButton btn = new JButton("Hello");
            btn.setOpaque(false);
            btn.setContentAreaFilled(false);
            btn.setBorderPainted(true);

            btn.setBorder(new LineBorder(Color.BLUE));

            add(btn);

        }

    }
}

Возможно, вам придется использовать CompoundBorder с EmptyBorder на внутренней стороне для обеспечения некоторого заполнения (я пытался использовать setMargins, но это не сработало)

...