有没有办法设置 JButton 按下时的背景颜色?

问题描述 投票:0回答:1

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 我认为应该将其设置为。

我确信答案就在我面前,而且应该相当明显,但我一生都无法意识到我做错了什么。我是不是把事情想得太复杂了?

java swing user-interface jbutton background-color
1个回答
0
投票

addMouseListener(new MouseAdapter(){ @Override public void mousePressed(MouseEvent e){ super.mousePressed(e); setEnabled(false); setBackground(onClickColor); } });

© www.soinside.com 2019 - 2024. All rights reserved.