Swing 和 StackOverflow 新手,但我会尽力尽可能连贯地提出我的问题:
我创建了一个扩展 JButton 的类,当单击它时我注意到一些奇怪的行为,但我似乎无法弄清楚其来源。单击按钮时(指针位于按钮顶部时按住鼠标),按钮的整个背景将变为浅蓝色。我在这里看到过有关此问题的其他帖子,但似乎大多数帖子都被问到有关具有透明度的按钮的问题,并且已通过使用 setContentAreaFilled(false) 解决了。当我使用 setContentAreaFilled(false) 时,整个按钮背景都会消失,而不仅仅是颜色被阻止变成该颜色。
为了避免 XY 问题:本质上,我想要的是向 JPanel 添加一个 JButton,其宽度由其包含面板的宽度决定。我希望 JButton 本身在不被单击时具有某种颜色,并且我只希望按钮在鼠标按住其上方时改变颜色。到目前为止我尝试过的方法如下:
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class MyButton extends JButton{
private final Color defaultColor = Color.RED;
private final Color onClickColor = Color.BLUE;
private String text;
private String tier;
public MyButton(String text, String tier, JFrame f){
this.text = text;
this.tier = tier;
//setContentAreaFilled(false); <-- When this line is enabled, the button does not show at all and the background is fully transparent.
setBackground(defaultColor);
setForeground(Color.WHITE);
setBorderPainted(false);
setFocusPainted(false);
setText(text);
//mouse listener to change color of button while clicked
addMouseListener(new MouseAdapter(){
@Override
public void mousePressed(MouseEvent e){
super.mousePressed(e);
setBackground(onClickColor);
}
});
//change button size based on tier parameter
if (tier.equals("Primary")){
setSize(f.getWidth()-14, 40);
}
else if (tier.equals("Secondary")){
setSize((text.length() * 10) + 10, 44);
}
}
public static void main(String[] args)
{
//create frame
JFrame f = new JFrame("frame");
f.setSize(400, 200);
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
//create panel
JPanel p = new JPanel();
p.setLayout(null);
//create button
MyButton b = new MyButton("TESTTEST", "Primary", f);
//build frame, panel, button, set visible
p.add(b, BorderLayout.CENTER);
f.add(p, BorderLayout.CENTER);
f.setVisible(true);
}
}
当我运行此代码时,我期望按钮默认为红色,然后当鼠标按住按钮时,它会变成蓝色,但一旦松开,它会再次变成红色。然而,当鼠标按住按钮时,它会变成默认突出显示的“浅蓝色”颜色,并且只有在释放按钮后才会变成 Color.BLUE。当我启用将内容区域填充设置为 false 的行并运行时,按钮是完全透明的。
添加
@Override
public void mouseReleased(MouseEvent e){
super.mouseReleased(e);
setBackground(defaultColor);
setFocusPainted(false);
}
在 MouseListener 中,确实使按钮颜色在释放鼠标时变回红色,但单击按钮时的颜色仍然是默认的浅蓝色,而不是实际的 Color.BLUE 我认为应该将其设置为。
我确信答案就在我面前,而且应该相当明显,但我一生都无法意识到我做错了什么。我是不是把事情想得太复杂了?
addMouseListener(new MouseAdapter(){
@Override
public void mousePressed(MouseEvent e){
super.mousePressed(e);
setEnabled(false);
setBackground(onClickColor);
}
});