Закругленный 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));