Rounded Swing JButton с использованием Java - PullRequest
16 голосов
/ 08 января 2009

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

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

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

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

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

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

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

Ответы [ 8 ]

15 голосов
/ 03 сентября 2010

Создать новую кнопку J:

    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);
    }
}
12 голосов
/ 08 января 2009

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

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 (очень простой обходной путь). Таким образом, не возникает путаницы в том, кто что делает в коде.

1 голос
/ 04 мая 2015

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

// 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);
1 голос
/ 09 апреля 2013
  1. Перетащите обычную кнопку на панель

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

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

1 голос
/ 08 января 2009

Я бы порекомендовал переопределить метод рисования (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) {
    }
}
0 голосов
/ 24 декабря 2018

Я написал класс OvalButton , который может обрабатывать J-кнопки овальной, круглой и капсульной формы.

В вашем случае расширьте класс 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;
    }
}
0 голосов
/ 10 августа 2016

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

button.setBorder(BorderFactory.createEmptyBorder(0,0,0,0));
0 голосов
/ 08 января 2009

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

button.setOpaque(false);

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

...