Java,设置按钮的颜色而不是 macOS 上的边框?
Java, set colour of a button and not the border on a macOS?
我正在尝试为单击鼠标时的按钮分配随机颜色。该操作本身似乎有效,但它没有为我的按钮着色 - 而是边框! :((仅供参考,我刚刚开始学习编码,所以我为我的“2+2=4”技能道歉)
它也不会让我在 If 语句或其他任何地方执行 setBorderPainted(false)。
这是我的代码:
import javax.swing.border.Border;
import javax.xml.transform.Source;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
public class buttonTest extends JFrame implements ActionListener {
JPanel p = new JPanel();
Random rand = new Random();
Button one, two, three, four, five, six, seven, eight, nine;
public static void main(String[] args) {
new buttonTest();
}
public buttonTest() {
super("ColourButton(2.0)");
setSize(500, 500);
setDefaultCloseOperation(EXIT_ON_CLOSE);
one = new Button("one");
two = new Button("two");
three = new Button("three");
four = new Button("four");
five = new Button("five");
six = new Button("six");
seven = new Button("seven");
eight = new Button("eight");
nine = new Button("nine");
float r = rand.nextFloat();
float g = rand.nextFloat();
float b = rand.nextFloat();
Color randColor = new Color(r, g, b);
p.setLayout(new GridLayout(3, 3));
p.add(one);
p.add(two);
p.add(three);
p.add(four);
p.add(five);
p.add(six);
p.add(seven);
p.add(eight);
p.add(nine);
one.addActionListener(this);
two.addActionListener(this);
three.addActionListener(this);
four.addActionListener(this);
five.addActionListener(this);
six.addActionListener(this);
seven.addActionListener(this);
eight.addActionListener(this);
nine.addActionListener(this);
add(p);
setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
String clickedbutton = e.getActionCommand();
System.out.println(clickedbutton + " button clicked.");
float r = rand.nextFloat();
float g = rand.nextFloat();
float b = rand.nextFloat();
Color randColor = new Color(r, g, b);
if (e.getSource() == one) {
one.setBackground(new Color(r,g,b));
} else if (e.getSource() == two) {
two.setBackground(new Color(r,g,b));
} else if (e.getSource() == three) {
three.setBackground(new Color(r,g,b));
} else if (e.getSource() == four) {
four.setBackground(new Color(r,g,b));
} else if (e.getSource() == five) {
five.setBackground(new Color(r,g,b));
} else if (e.getSource() == six) {
six.setBackground(new Color(r,g,b));
} else if (e.getSource() == seven) {
seven.setBackground(new Color(r,g,b));
} else if (e.getSource() == eight) {
eight.setBackground(new Color(r,g,b));
} else {
nine.setBackground(new Color(r,g,b));
}
}
}
对所有 JButton 使用 button.setBorderPainted(false);
,这应该会去掉边框。但是,如果那不是您所说的,那么我不明白您要做什么;您的 JButton 在单击时会被着色,而不是边框。
此外,为了减少您的代码,我强烈建议创建一个 JButton 数组来保存您的所有 JButton,这样您就不需要编写代码来初始化和设置每个单独 JButton 的颜色。
这是我写的修改后的代码:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.*;
public class ButtonTest extends JFrame implements ActionListener {
JPanel p = new JPanel();
Random rand = new Random();
JButton buttons[];
public static void main(String[] args) {
new ButtonTest();
}
public ButtonTest() {
super("ColourButton(2.0)");
setSize(500, 500);
setDefaultCloseOperation(EXIT_ON_CLOSE);
buttons = new JButton[9];
p.setLayout(new GridLayout(3, 3));
for (int i = 0; i < buttons.length; i++)
{
buttons[i] = new JButton(Integer.toString(i));
buttons[i].setBorderPainted(false);
buttons[i].addActionListener(this);
p.add(buttons[i]);
}
add(p);
setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
String clickedbutton = e.getActionCommand();
System.out.println(clickedbutton + " button clicked.");
float r = rand.nextFloat();
float g = rand.nextFloat();
float b = rand.nextFloat();
JButton button = (JButton)e.getSource();
button.setBackground(new Color(r,g,b));
button.setForeground(new Color(0, 0, 0, 250));
}
}
“长”答案将涉及创建您自己的 UI 委托 class,它允许您完全控制按钮的外观,但对于如此简单的事情来说,这似乎需要付出很多努力.
开始的地方是查看 setBorderPainted
和 setContentAreaFilled
。通常,这将允许您删除平台 UI 委托完成的所有自定义,但在我的测试中,我还需要使用 setOpaque(true)
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.add(new ButtonTest());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class ButtonTest extends JPanel implements ActionListener {
Random rand = new Random();
JButton buttons[];
public ButtonTest() {
buttons = new JButton[9];
setLayout(new GridLayout(3, 3));
for (int i = 0; i < buttons.length; i++) {
buttons[i] = new JButton(Integer.toString(i));
buttons[i].setBorderPainted(false);
// This may not be needed, but shouldn't hurt
buttons[i].setContentAreaFilled(false);
// This is what fixed the issue for me
// But you might need to consider providing a "default"
// background color OR change this in the `actionPerformed`
// method
buttons[i].setOpaque(true);
buttons[i].addActionListener(this);
add(buttons[i]);
}
}
@Override
public void actionPerformed(ActionEvent e) {
if (!(e.getSource() instanceof JButton)) {
return;
}
String clickedbutton = e.getActionCommand();
System.out.println("You clicked " + clickedbutton);
float r = rand.nextFloat();
float g = rand.nextFloat();
float b = rand.nextFloat();
JButton button = (JButton) e.getSource();
button.setBackground(new Color(r, g, b));
}
}
}
我正在尝试为单击鼠标时的按钮分配随机颜色。该操作本身似乎有效,但它没有为我的按钮着色 - 而是边框! :((仅供参考,我刚刚开始学习编码,所以我为我的“2+2=4”技能道歉)
它也不会让我在 If 语句或其他任何地方执行 setBorderPainted(false)。
这是我的代码:
import javax.swing.border.Border;
import javax.xml.transform.Source;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
public class buttonTest extends JFrame implements ActionListener {
JPanel p = new JPanel();
Random rand = new Random();
Button one, two, three, four, five, six, seven, eight, nine;
public static void main(String[] args) {
new buttonTest();
}
public buttonTest() {
super("ColourButton(2.0)");
setSize(500, 500);
setDefaultCloseOperation(EXIT_ON_CLOSE);
one = new Button("one");
two = new Button("two");
three = new Button("three");
four = new Button("four");
five = new Button("five");
six = new Button("six");
seven = new Button("seven");
eight = new Button("eight");
nine = new Button("nine");
float r = rand.nextFloat();
float g = rand.nextFloat();
float b = rand.nextFloat();
Color randColor = new Color(r, g, b);
p.setLayout(new GridLayout(3, 3));
p.add(one);
p.add(two);
p.add(three);
p.add(four);
p.add(five);
p.add(six);
p.add(seven);
p.add(eight);
p.add(nine);
one.addActionListener(this);
two.addActionListener(this);
three.addActionListener(this);
four.addActionListener(this);
five.addActionListener(this);
six.addActionListener(this);
seven.addActionListener(this);
eight.addActionListener(this);
nine.addActionListener(this);
add(p);
setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
String clickedbutton = e.getActionCommand();
System.out.println(clickedbutton + " button clicked.");
float r = rand.nextFloat();
float g = rand.nextFloat();
float b = rand.nextFloat();
Color randColor = new Color(r, g, b);
if (e.getSource() == one) {
one.setBackground(new Color(r,g,b));
} else if (e.getSource() == two) {
two.setBackground(new Color(r,g,b));
} else if (e.getSource() == three) {
three.setBackground(new Color(r,g,b));
} else if (e.getSource() == four) {
four.setBackground(new Color(r,g,b));
} else if (e.getSource() == five) {
five.setBackground(new Color(r,g,b));
} else if (e.getSource() == six) {
six.setBackground(new Color(r,g,b));
} else if (e.getSource() == seven) {
seven.setBackground(new Color(r,g,b));
} else if (e.getSource() == eight) {
eight.setBackground(new Color(r,g,b));
} else {
nine.setBackground(new Color(r,g,b));
}
}
}
对所有 JButton 使用 button.setBorderPainted(false);
,这应该会去掉边框。但是,如果那不是您所说的,那么我不明白您要做什么;您的 JButton 在单击时会被着色,而不是边框。
此外,为了减少您的代码,我强烈建议创建一个 JButton 数组来保存您的所有 JButton,这样您就不需要编写代码来初始化和设置每个单独 JButton 的颜色。
这是我写的修改后的代码:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.*;
public class ButtonTest extends JFrame implements ActionListener {
JPanel p = new JPanel();
Random rand = new Random();
JButton buttons[];
public static void main(String[] args) {
new ButtonTest();
}
public ButtonTest() {
super("ColourButton(2.0)");
setSize(500, 500);
setDefaultCloseOperation(EXIT_ON_CLOSE);
buttons = new JButton[9];
p.setLayout(new GridLayout(3, 3));
for (int i = 0; i < buttons.length; i++)
{
buttons[i] = new JButton(Integer.toString(i));
buttons[i].setBorderPainted(false);
buttons[i].addActionListener(this);
p.add(buttons[i]);
}
add(p);
setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
String clickedbutton = e.getActionCommand();
System.out.println(clickedbutton + " button clicked.");
float r = rand.nextFloat();
float g = rand.nextFloat();
float b = rand.nextFloat();
JButton button = (JButton)e.getSource();
button.setBackground(new Color(r,g,b));
button.setForeground(new Color(0, 0, 0, 250));
}
}
“长”答案将涉及创建您自己的 UI 委托 class,它允许您完全控制按钮的外观,但对于如此简单的事情来说,这似乎需要付出很多努力.
开始的地方是查看 setBorderPainted
和 setContentAreaFilled
。通常,这将允许您删除平台 UI 委托完成的所有自定义,但在我的测试中,我还需要使用 setOpaque(true)
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.add(new ButtonTest());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class ButtonTest extends JPanel implements ActionListener {
Random rand = new Random();
JButton buttons[];
public ButtonTest() {
buttons = new JButton[9];
setLayout(new GridLayout(3, 3));
for (int i = 0; i < buttons.length; i++) {
buttons[i] = new JButton(Integer.toString(i));
buttons[i].setBorderPainted(false);
// This may not be needed, but shouldn't hurt
buttons[i].setContentAreaFilled(false);
// This is what fixed the issue for me
// But you might need to consider providing a "default"
// background color OR change this in the `actionPerformed`
// method
buttons[i].setOpaque(true);
buttons[i].addActionListener(this);
add(buttons[i]);
}
}
@Override
public void actionPerformed(ActionEvent e) {
if (!(e.getSource() instanceof JButton)) {
return;
}
String clickedbutton = e.getActionCommand();
System.out.println("You clicked " + clickedbutton);
float r = rand.nextFloat();
float g = rand.nextFloat();
float b = rand.nextFloat();
JButton button = (JButton) e.getSource();
button.setBackground(new Color(r, g, b));
}
}
}