gpt4 book ai didi

Java自定义按钮paintComponent不会重新绘制默认按钮背景

转载 作者:行者123 更新时间:2023-12-02 06:23:10 24 4
gpt4 key购买 nike

我正在用 Java 中的 Swing 制作一个自定义按钮。这就是我的按钮的样子:

enter image description here

我想要一个带有圆角的浅灰色按钮,我想稍后添加一个小图像。

问题是当我重写paintComponent()时,将绘制灰色圆形,但您会在它后面看到旧的蓝色 Swing 背景。按钮的角必须是透明的。

这是我的代码 打包游戏;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JButton;

public class ItemButton extends JButton {

public ItemButton(String text) {

super(text);
this.setBorderPainted(false);
this.setBorder(null);

}

@Override
public void paintComponent(Graphics g) {

super.paintComponent(g);

Graphics2D g2 = (Graphics2D) g;

g2.setColor(new Color(220, 220, 220));
g2.fillRoundRect(0, 0, this.getWidth() - 10, this.getHeight() - 10, 10, 10);
}

}

最佳答案

我不确定你为什么要这样做,因为 JButton 允许你提供 Icon 图像,但无论如何......

有一种方法可以使用 JButton 来做到这一点,但这不是正确的做法,相反,您应该从使用 AbstractButton 开始,因为它没有 UI首先将绘画委托(delegate)给它,例如......

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.AbstractButton;
import javax.swing.DefaultButtonModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class CustomButton {

public static void main(String[] args) {
new CustomButton();
}

public CustomButton() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}

JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new GridBagLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}

public class TestPane extends AbstractButton {

public TestPane() {
setModel(new DefaultButtonModel());
MouseHandler mh = new MouseHandler();
addMouseListener(mh);
}

@Override
public Dimension getPreferredSize() {
return new Dimension(40, 20);
}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics g2d = (Graphics2D) g.create();
g2d.setColor(new Color(220, 220, 220));
g2d.fillRoundRect(0, 0, this.getWidth() - 1, this.getHeight() - 1, 10, 10);
if (getModel().isRollover()) {
g2d.setColor(new Color(128, 128, 128));
g2d.drawRoundRect(0, 0, this.getWidth() - 1, this.getHeight() - 1, 10, 10);
}
g2d.dispose();
}

public class MouseHandler extends MouseAdapter {

@Override
public void mouseEntered(MouseEvent e) {
getModel().setRollover(true);
}

@Override
public void mouseExited(MouseEvent e) {
getModel().setRollover(false);
}

@Override
public void mousePressed(MouseEvent e) {
getModel().setArmed(true);
getModel().setPressed(true);
}

@Override
public void mouseReleased(MouseEvent e) {
getModel().setPressed(false);
getModel().setArmed(false);
}

}

}

}

关于Java自定义按钮paintComponent不会重新绘制默认按钮背景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20818906/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com