带有填充的Jbutton隐形边框

时间:2017-09-26 06:09:39

标签: java swing

我有JButton,它有一个ImageIcon和一些文本。 我希望透明背景没有边框,但也希望有一些填充。

以下是我的尝试:

Jbutton button = new JButton();

//Add image to the button
ImageIcon img= new ImageIcon(imgUrl);
button.setIcon(img);

//make button transparent
button.setBackground(new Color(255,255,255,0));

//Remove border
button.setBorderPainted(false);
button.setContentAreaFilled(false);
button.setFocusPainted(false);

//add padding
button.setBorder(BorderFactory.createEmptyBorder(5,10,5,50));

我仍然看到边界周围的灰色边框。 当我执行button.setBorder(null)时,灰色边框线消失,但之后我无法添加填充。

如果有人能指导我做错了什么。我很擅长摇摆,尝试过不同的答案,但没有一个有效。

谢谢。

2 个答案:

答案 0 :(得分:1)

  • 不要使用setBackground(new Color(255,255,255,0)),Swing仅支持完全不透明或完全透明的组件,通过opaque属性控制,使用基于alpha的颜色会产生不良副作用
  • 考虑使用setMargins生成填充

示例...

Screen Shot

原始图片......

Original Image

import java.awt.GridBagLayout;
import java.awt.Insets;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class Launcher {

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

    public Launcher() {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    JButton button = new JButton();

                    ImageIcon img = new ImageIcon(ImageIO.read(getClass().getResource("Cup.png")));
                    button.setIcon(img);
                    button.setBorderPainted(false);
                    button.setContentAreaFilled(false);
                    button.setFocusPainted(false);
                    button.setOpaque(true);
                    button.setMargin(new Insets(10, 10, 10, 10));
                    JFrame frame = new JFrame();
                    // Just testing to see there are glitches
                    frame.setLayout(new GridBagLayout()); 
                    frame.add(button);
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                } catch (IOException ex) {
                    Logger.getLogger(Launcher.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        });
    }
}

我确实发现,如果您使用setBorder,则会覆盖margin

答案 1 :(得分:0)

如何设置边距,以及布局管理器上的任何摆动组件deoends。

如果您正在使用GridBagLayout,则应将GridBagConstraint对象上的insets设置为所需的值。