将自定义JButton添加到JFrame会更改背景颜色



我创建了一个简单的GUI,因为我想创建一个圆形JButton而不是普通按钮。因此,我创建了一个扩展JButton并重写一些方法以实现绘制的类。

但是,当我执行代码(使用Java13(时,框架就会被创建为一种难看的黄色,之后按钮就会被包含在内,整个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);
}

}

如果我把这个添加到框架中,颜色的背景就会改变。为什么?

给定给组件绘制方法的图形对象应该已经转换到组件的位置。所以你所有的画都应该在(0,0(和(宽,高(之间完成。

我本以为剪辑也会被设置到组件的边界,防止你在它之外绘画。但也许你的按钮覆盖了你框架的很大一部分,或者由于某种原因剪辑为空。

具体来说:g.drawRoundRect(0,0,…

编辑回答问题编辑:当您只在NORTH添加一些内容,而在CENTER中没有任何内容时,BorderLayout有点未定义。此外,面板和按钮的首选尺寸在放置到边框布局的中心时会被忽略。

最新更新