21

好吧,我有一张图片,我想将其作为按钮(或可点击的东西)的背景。问题是这张图片是圆形的,所以我需要展示这张图片,没有任何边框等。

保存此按钮的 JComponent 具有自定义背景,因此该按钮实际上只需要显示图像。

搜索谷歌后,我无法做到这一点。我已经尝试了以下所有方法,但没有运气:

button.setBorderPainted(false);
button.setContentAreaFilled(false);
button.setOpaque(true);

在我在背景上绘制图标后,按钮会绘制它,但会保留带有边框等丑陋的灰色背景。我还尝试使用 JLabel 和 JButton。并在其上绘制 ImageIcon,但如果用户调整窗口大小或最小化窗口,图标就会消失!

我怎样才能解决这个问题?

我只需要将图像绘制并舍入到 JComponent 并听取点击...

4

8 回答 8

24

创建一个新的 Jbutton:

    JButton addBtn = new JButton("+");
    addBtn.setBounds(x_pos, y_pos, 30, 25);
    addBtn.setBorder(new RoundedBorder(10)); //10 is the radius
    addBtn.setForeground(Color.BLUE);

在为 JButton 设置边框时,调用被覆盖的javax.swing.border.Border类。

addBtn.setBorder(new RoundedBorder(10));

这是课程

private static class RoundedBorder implements Border {

    private int radius;


    RoundedBorder(int radius) {
        this.radius = radius;
    }


    public Insets getBorderInsets(Component c) {
        return new Insets(this.radius+1, this.radius+1, this.radius+2, this.radius);
    }


    public boolean isBorderOpaque() {
        return true;
    }


    public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
        g.drawRoundRect(x, y, width-1, height-1, radius, radius);
    }
}
于 2010-09-03T09:27:13.153 回答
14

您是否尝试过以下操作?

button.setOpaque(false);
button.setFocusPainted(false);
button.setBorderPainted(false);
button.setContentAreaFilled(false);
setBorder(BorderFactory.createEmptyBorder(0,0,0,0)); // Especially important

setBorder(null)可能有效,但Sun 描述了一个错误,解释它是设计使 UI 在组件上设置边框,除非客户端设置不实现UIResource接口的非空边框。

EmptyBorder与其在传入 null 时由 JDK 本身设置边界,不如由客户端EmptyBorder自己设置(一个非常简单的解决方法)。这样就不会混淆代码中谁在做什么。

于 2009-01-08T12:32:06.147 回答
2

我编写了一个OvalButton类,它可以处理椭圆形、圆形和胶囊状的 JButton。

在您的情况下,扩展OvalButton类并覆盖getBackgroundImage()方法以返回要设置为背景的图像。然后像往常一样添加侦听器和文本。只有单击椭圆形/圆形区域才会触发操作。

您的按钮类示例:

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class ImageButton extends OvalButton {

    private BufferedImage image;

    public ImageButton() {
        super(); // Default is oval/circle shape.

        setBorderThickness(0); // Oval buttons have some border by default.

        try {
            image = ImageIO.read(new File("your_image.jpg")); // Replace with the path to your image.
        } 
        catch (IOException e) {
            e.printStackTrace();
            image = null;
        }
    }

    @Override
    protected BufferedImage getBackgroundImage() {
        return image;
    }
}
于 2018-12-24T16:25:08.083 回答
1
  1. 将普通按钮拖到面板上

  2. 右键单击您的按钮并转到属性:

border              = no border
border painted      = false
contentAreaFilled   = false
focusPainted        = false
opaque              = false
  1. 通过导入到项目中设置 (icon) 和 (rolloverIcon)。
于 2013-04-09T10:43:55.630 回答
1

我建议像这样覆盖 paint(Graphics g) 方法:

class JImageButton extends JComponent implements MouseListener {
    private BufferedImage img = null;

    public JImageButton(BufferedImage img) {
        this.img = img;
        setMinimumSize(new Dimension(img.getWidth(), img.getHeight()));
        setOpaque(false);
        addMouseListener(this);
    }

    public void paintComponent(Graphics g) {
        g.drawImage(img, 0, 0, img.getWidth(), img.getHeight(), null);
    }

    @Override
    public void mouseClicked(MouseEvent e) {
    }

    @Override
    public void mouseEntered(MouseEvent e) {
    }

    @Override
    public void mouseExited(MouseEvent e) {
    }

    @Override
    public void mousePressed(MouseEvent e) {
    }

    @Override
    public void mouseReleased(MouseEvent e) {
    }
}
于 2009-01-08T19:10:43.830 回答
1

您可以尝试以下方法。它对我来说很好,我也遇到了同样的按钮问题。

// Jbutton
JButton imageButton = new JButton();

// Buffered Icon
BufferedImage buttonIcon = null;

try {
    // Get the image and set it to the imageicon
    buttonIcon = ImageIO.read(getClass().getClassLoader().getResource("images/login.png"));
}
catch(Exception ex) {

}

// Set the image icon here
imageButton = new JButton(new ImageIcon(buttonIcon));
imageButton.setBorderPainted(false);
imageButton.setContentAreaFilled(false);
imageButton.setFocusPainted(false);
imageButton.setOpaque(false);
于 2015-05-04T11:16:32.267 回答
0

不透明度应该设置为假,所以

button.setOpaque(false);

可能已经是你想要的了。

于 2009-01-08T11:29:24.713 回答
-1

您可以像这样为按钮创建一个空边框:

button.setBorder(BorderFactory.createEmptyBorder(0,0,0,0));
于 2016-08-10T04:42:44.513 回答