Я создал простой GUI, потому что я хотел создать закругленную кнопку JButton вместо обычной кнопки. Поэтому я создал класс, который расширяет JButton и переопределяет некоторые методы для рисования.
Но как только я выполняю код (используя Java 13), рамка создается с уродливым желтым цветом, после этого кнопка включена и весь цвет фона JFrame изменяется. Почему это и как я могу предотвратить это? Я только хочу, чтобы кнопка была создана, но ничего другого, чтобы изменить цвет или подобный.
public class RoundedButton extends JButton {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setLayout(new BorderLayout());
frame.setSize(800, 800);
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.setSize(new Dimension(200, 200));
JButton button = new RoundedButton("Text", 40, 2F, Color.BLACK);
button.setBackground(new Color(116, 10, 10));
button.setForeground(Color.WHITE);
button.setSize(new Dimension(200, 120));
button.setPreferredSize(new Dimension(200, 120));
button.addMouseListener(new MouseListener() {
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
button.setBackground(button.getBackground().brighter().brighter());
}
@Override
public void mouseExited(MouseEvent e) {
button.setBackground(button.getBackground().darker().darker());
}
});
panel.add(button, BorderLayout.CENTER);
frame.add(panel, BorderLayout.NORTH);
frame.setBackground(Color.YELLOW);
//frame.pack();
frame.setVisible(true);
}
private int arcRadius;
private float borderSize;
private Color borderColor;
public RoundedButton(String label, int arcRadius, float borderSize, Color borderColor) {
super(label);
this.setContentAreaFilled(false);
this.arcRadius = arcRadius;
this.borderSize = borderSize;
this.borderColor = borderColor;
}
@Override
public void paint(Graphics g) {
if(g instanceof Graphics2D) {
((Graphics2D) g).setStroke(new BasicStroke(borderSize));
((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
}
//Draw background / fill button
g.setColor(this.getBackground());
g.fillRoundRect(getX(), getY(), this.getWidth(), (int)(this.getHeight()-borderSize), arcRadius, arcRadius);
//Draw border
g.setColor(borderColor);
g.drawRoundRect(getX(), getY(), this.getWidth(), (int)(this.getHeight()-borderSize), arcRadius, arcRadius);
//Draw font
if (this.getFont() != null && this.getText() != null) {
FontMetrics fm = getFontMetrics(getFont());
g.setColor(this.getForeground());
g.drawString(this.getText(), ((this.getWidth() / 2) - (fm.stringWidth(this.getText()) / 2)),
((this.getHeight() / 2) + fm.getMaxDescent()));
}
}
@Override
public boolean contains(int x, int y) {
return new RoundRectangle2D.Double(getX(), getY(), this.getWidth(), (int)(this.getHeight()-borderSize), arcRadius, arcRadius).contains(x, y);
}
@Override
public void updateUI() {
super.updateUI();
this.setContentAreaFilled(false);
this.setFocusPainted(false);
}
}
Если я добавлю это к рамке, цвет фона изменится , Почему это так?