是否可以在JButton中添加1个以上的mouselistener?你知道当我点击按钮它应该改变颜色和文本,并做一些事情(例如system.out.println),当我再次点击它时它应该回到以前的状态,并打印其他东西。
我尝试了什么:
JButton b = new JButton("First");
b.setBackground(Color.GREEN);
b.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e)
{
b.setBackground(Color.RED);
b.setText("Second");
System.out.println("You've clicked the button");
}
if(b.getModel.isPressed){
b.setBackground(Color.GREEN);
b.setText("Second");
System.out.println("You're back");
}
问题是该按钮没有返回到前一个状态,颜色(绿色)和文本,我不知道如何处理。
答案 0 :(得分:4)
首先,你不应该使用MouseListener来做这些事情,因为更好的监听器ActionListener专门用于与JButton和类似的实体一起使用,以通知程序已按下按钮。
话虽如此,确定您可以将多个ActionListeners(或MouseListeners)添加到JButton,或者您可以让ActionListener根据程序的状态更改其行为(通常表示类的字段所包含的值)。
您的代码和问题存在的问题是,我不希望 时您希望按钮将其颜色更改为绿色。如果经过一段时间后,让ActionListener启动一个Swing Timer,在x毫秒后将按钮的颜色改回绿色。
编辑:我知道,你想要切换颜色 - 然后使用一个布尔字段来切换或检查按钮的当前颜色,并根据该颜色确定听众的响应。
例如
import java.awt.Color;
import java.awt.Component;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
@SuppressWarnings("serial")
public class ToggleColor extends JPanel {
public ToggleColor() {
JButton button = new JButton(new MyButtonAction());
button.setBackground(Color.GREEN);
add(button);
}
private static void createAndShowGui() {
ToggleColor mainPanel = new ToggleColor();
JFrame frame = new JFrame("ToggleColor");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
}
@SuppressWarnings("serial")
class MyButtonAction extends AbstractAction {
// !! parallel arrays being used below -- avoid if possible
private static final String[] TEXT = {"First", "Second", "Third"};
private static final Color[] COLORS = {Color.GREEN, Color.RED, new Color(108, 160, 220)};
private int index = 0;
public MyButtonAction() {
super(TEXT[0]);
}
@Override
public void actionPerformed(ActionEvent e) {
index++;
index %= TEXT.length;
putValue(NAME, TEXT[index]);
Component c = (Component) e.getSource();
c.setBackground(COLORS[index]);
}
}
这使用了一个类似于ActionListener的AbstractAction类,但是在"类固醇"
答案 1 :(得分:2)
您应该只注册一个列表,但该监听器将保留一些关于鼠标点击次数的状态。一个简单的if / else块将更改操作并更改按钮标签上的文本。