Java Swing - 制作透明的 JButtons,不透明的边框

Java Swing - Making Transparent JButtons, Opaque borders

我有一个 JFrame,在其中有一个由地图图像填充的 JLabel。我想在地图图像上方的网格中有可点击的方形“瓷砖”。为此,我制作了一个大的 JButton 网格,并将其添加到包含 Map 的 JLabel 中。但是,看不到地图,因此我将 JButton 设置为完全透明。但是,当它们是透明的时,我看不到一个 JButton 在哪里结束,另一个 JButton 在哪里开始。我想创建一个 JButton,它在内部是完全透明的,但周围仍然有一个可见的边框。我试过 setOpaque(false) 然后 setBorderPainted(true) 但这又使它们变得不透明。我已经尝试了我能找到的一切,但没有任何反应。有什么建议吗?

再说一次,我只想要一个透明的 JButton 和可见的边框

您应该可以用自己的...替换边框...

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

        }

    }
}

您可能需要在内部使用 CompoundBorderEmptyBorder 来提供一些填充(我尝试使用 setMargins 但它似乎没有用)