在1 JButton中添加更多mouselisteners?

时间:2016-06-16 22:12:02

标签: java swing jbutton mouselistener

是否可以在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");
}

问题是该按钮没有返回到前一个状态,颜色(绿色)和文本,我不知道如何处理。

2 个答案:

答案 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块将更改操作并更改按钮标签上的文本。