Я написал короткую программу, потому что хотел создать сделанную на заказ кнопку с закругленными углами. Поэтому я расширил класс JButton и переписал метод paintComponent (см. Код ниже).
public class JRoundedButton extends JButton {
private int arcRadius;
public JRoundedButton(String label, int arcRadius) {
super(label);
this.setContentAreaFilled(false);
this.arcRadius = arcRadius;
}
@Override
protected void paintComponent(Graphics g) {
if(g instanceof Graphics2D) {
Graphics2D graphics = (Graphics2D) g;
graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
//Draw button background
graphics.setColor(getBackground());
graphics.fillRoundRect(getX(), getY(), getWidth() - 1, getHeight() - 1, arcRadius, arcRadius);
}
}
@Override
public boolean contains(int x, int y) {
return new RoundRectangle2D.Double(getX(), getY(), getWidth(), getHeight(), arcRadius, arcRadius).contains(x,y);
}
public int getArcRadius() {
return arcRadius;
}
public void setArcRadius(int arcRadius) {
this.arcRadius = arcRadius;
this.repaint();
}
}
Когда я создаю простую рамку и добавляю ОДНУ кнопку на панель, которую я затем добавить к кадру, он обнаруживается отлично. Но как только я хочу создать две кнопки и расположить их друг под другом (используя Borderlayout, я использовал NORTH и SOUTH), только верхняя кнопка отображается правильно. Кнопка ниже отображает текст правильно (я удалил эту часть из метода painComponent (...)), но фон не закрашен. Я никоим образом не использую метод setOpaque (...).
В чем может быть проблема?
Нужно ли устанавливать границы моей пользовательской кнопки?
Редактировать: вот код, который создает рамку и отображает кнопки:
public static void main(String[] args) {
JFrame frame = new JFrame("Buttontest");
frame.setSize(new Dimension(500, 500));
frame.setLayout(new BorderLayout());
JPanel contentPanel = new JPanel();
contentPanel.setSize(new Dimension(500, 500));
contentPanel.setLayout(new GridLayout(2, 1, 0, 20));
JRoundedButton button1 = new JRoundedButton("Rounded Button", 40);
button1.setForeground(Color.YELLOW);
button1.setBackground(Color.GREEN);
JRoundedButton button2 = new JRoundedButton("Rounded Button 2", 40);
button2.setBackground(Color.BLACK);
button2.setForeground(Color.WHITE);
contentPanel.add(button1);
contentPanel.add(button2);
frame.add(contentPanel, BorderLayout.CENTER);
frame.setVisible(true);
}
Вывод такой:
Почему фон нижней кнопки не виден? Это должно быть черным!