Закругленный Swing JButton с использованием Java

Ну, у меня есть образ, который я бы хотел добавить в качестве фона к кнопке (или что-то зависящее). Проблема в том, что этот образ круглый, поэтому мне нужно показать это изображение без каких-либо границ и т.д.

JComponent, который содержит эту кнопку, имеет собственный фон, поэтому на самом деле кнопка должна показывать только изображение.

После поиска Google я не смог этого сделать. Я пробовал все следующее, но не повезло:

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

И после того, как я рисую значок на заднем плане, кнопка рисует его, но держит уродливый серый фон с границами и т.д. Я также попытался использовать JLabel и JButton. И рисовать ImageIcon на нем, но если пользователь изменяет размер или сводит к минимуму окно, значки исчезают!

Как я могу это исправить?

Мне просто нужно нарисовать и объединить изображение в JComponent и прослушать клики на нем...

Ответы

Ответ 1

Создайте новый 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);
    }
}

Ответ 2

Вы пробовали следующее?

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

setBorder(null) может работать, но есть ошибка, описанная в Sun, объясняя это тем, что пользовательский интерфейс устанавливает границу на если клиент не устанавливает границу, отличную от нуля, которая не реализует интерфейс UIResource.

Вместо того, чтобы сам JDK устанавливал границу на EmptyBorder, когда был принят null, клиенты должны установить EmptyBorder сами (очень простое обходное решение). Таким образом, нет путаницы в том, кто делает то, что в коде.

Ответ 3

Я бы рекомендовал переопределить метод 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) {
    }
}

Ответ 4

  • Перетащите обычную кнопку на панель

  • Щелкните правой кнопкой мыши и перейдите к свойствам:

    boarder           = no barder
    boarder painted   = false
    contentAreaFilled = false
    focusPainted      = false
    opaque            = false
    
  • Установите (значок) и (rolloverIcon), импортировав в проект.

Ответ 5

Вы можете попробовать следующее. Он отлично работает для меня, и я также столкнулся с той же проблемой с кнопкой.

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

Ответ 6

Непрозрачность должна быть установлена ​​равной false, поэтому

button.setOpaque(false);

уже может быть тем, что вы хотите.

Ответ 7

Вы можете создать пустую рамку для кнопки следующим образом:

button.setBorder(BorderFactory.createEmptyBorder(0,0,0,0));