我不想在按下时更改JButton的颜色

时间:2013-12-06 14:00:21

标签: colors jbutton pressed

Color newColor = new Color(197,222,90);
JButton newButton;
newButton = new JButton(icon);
newButton.setBacgroundColor(newColor);

按下它会改变颜色。我怎样才能防止颜色变化。我有多个按钮,所以如果有一行或两行的解决方案请帮助我,并记住我是初学者,写一些巨大的课程不会帮助我,因为我有多个不同名称的按钮受此影响

编辑:一行中的解决方案是:

 UIManager.put("Button.select", newColor);

但它会改变所有按钮颜色,但我需要另一种颜色不同。

EDIT2:经过一番研究后,我发现没有简单的解决方案(但它应该是,ffs它只是一个按钮)。我如何看待它有2个解决方案,1。打破按钮分离类并为它们设置UIManager,其次是制作自定义按钮。按钮太多了(ffs只是一个按钮)。

3 个答案:

答案 0 :(得分:2)

我发现没有什么可以改变普通JButton上的特定行为。问题在于,无论你在actionlistener中为按钮写什么,都会在你放开鼠标按钮后发生,而不是“在点击时”。

但是有一些解决方法。

我的首选是,从按钮中删除所有图形,然后将自己的图像添加到按钮的常规和按下状态。您可以截取GUI的屏幕截图,剪切按钮,并将该图像设置为两种状态。

JButton myButton = new JButton();

// Sets button x, y, width, height. Make the size match the image.
myButton.setBounds(5, 30, 100, 30);

// Remove border-graphics.
myButton.setBorder(null);

// Remove default graphics from the button
myButton.setContentAreaFilled(false);

// Remove the focus-indicating dotted square when focused (optional)
myButton.setFocusPainted(false);

// Here, myImage is a simple BufferedImage object.
// You can set one like this, provided you have an "images" package,
// next to your main class (ex: com.somecompany.someprogram.images),
// that contains an image:

BufferedImage myImage = ImageIO.read(getClass().getResource("images/myImage.png"));

// Then we simply apply our image to both states for the button, and we're done.
myButton.setIcon(new ImageIcon(myImage));

myButton.setPressedIcon(new ImageIcon(myImage));

显然有很多方法可以保留和加载图像,但由于这不是问题所在,我会在其中留下其他方法。

尽管如此,没有必要无数次地完成它。编写自己的JButton类自定义实现应该很容易,其中自定义构造函数接受一个参数,即BufferedImage,然后构造函数相应地设置它(更改图标)。然后,当你创建一个新的JButton时,你要做的就是使用你自己的类,并传递一个图像:

JButton btn = new MyCustomJButton(myImage);

你也可以很容易地与很少的图像相处。您只需要一个HashMap,它包含所有图像,并以String作为关键字。想象一下,你需要4个OK按钮。您可以制作一个按钮的单个图像,上面写有“OK”文本。然后将该图像放入HashMap中,如下所示:

myMap.put("OK", myImage);

然后你可以在创建一个按钮时这样做,如果你想要更多的话,一遍又一遍:

JButton btn = new MyCustomJButton(myMap.get("OK"));

<强>可替换地: 实现这一目标的另一种方法,即相当精细,但可能被认为是“正确的方法”,是使用ButtonUI,如this answer to another post.中所示

答案 1 :(得分:1)

如果OP指的是在按下鼠标时带有图标的按钮上的背景颜色的临时更改,则以下语句可以解决问题:

button.setContentAreaFilled(假);

“例如,如果您希望使用透明按钮,例如仅图标按钮,则应将其设置为false。”

我花了很长时间才弄明白。它似乎是一种鲜为人知的技术,也许因为它的名称对其效果几乎没有任何线索。

答案 2 :(得分:0)

只有第一个车道,我们仍然可以看到它被点击了。您需要结合这两个:

button1.setContentAreaFilled(false);
button1.setEnabled(false);

如果您不想用灰色,可以在他下面放一个按钮。

panelname.add(button1,+5,+5); \\(first not clicable, not visible button, notice +5) 

panelname.add(button2,-5,-5); \(-5,-5表示面板下为5分)