JLabel mouse根据状态使用相同的标签执行不同的操作

时间:2014-03-23 18:53:11

标签: java swing jlabel mouselistener

所以我有一个标签,我想要做下一个,默认情况下它从红色背景颜色开始,当我第一次点击(mousePressed)时,我将背景颜色更改为绿色。

现在,我希望它再次按下它再次按下它再次按下红色。

如果它是红色的话,变成绿色。 如果它是绿色,则变为红色。

但是我无法做到这一点......我尝试过这样的事情:

    Object o = evt.getSource();
    boolean checkGreen = false;

    if (o.equals(lblSI)) {
        lblSI.setBackground(Color.GREEN);
        checkGreen = true;
    }
    if (o.equals(lblSI) && checkGreen == true) {
        lblSI.setBackground(Color.RED);
    }

但它显然不起作用,因为我先把它变成绿色,然后是红色,它是瞬间变化,无法找到合适的代码......

2 个答案:

答案 0 :(得分:1)

您可以使用else执行其他操作。但是,绿色的状态需要是对象字段的一部分,而不是在操作方法中定义(因为对于每个操作,它将被重置为false)。

如果您分别检查来源和检查颜色选择,也可能会更清楚。

... object definition ...
boolean isGreen = false;

... action listener...
Object o = evt.getSource();

if (o.equals(lblSI)) {
    if (isGreen) {
      lblSI.setBackground(Color.RED);
    } else {
      lblSI.setBackground(Color.GREEN);
    }
    isGreen = !isGreen;
}

添加一个完整的示例,将前景色设置为背景色,不适用于所有平台。

public class RedGreen implements Runnable {

    private JButton press;

    @Override
    public void run() {
        JFrame frame = new JFrame("RedGreen");
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        press = new JButton("Press");
        press.addActionListener(new ActionListener() {
            boolean isGreen = false;
            @Override
            public void actionPerformed(ActionEvent e) {
                if (isGreen) {
                    press.setForeground(Color.RED);
                } else {
                    press.setForeground(Color.GREEN);
                }
                isGreen = !isGreen;
            }
        });
        frame.getContentPane().add(press);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String...args) throws Exception {
        SwingUtilities.invokeAndWait(new RedGreen());
    }
}

答案 1 :(得分:0)

在这里,我们采取一种非常干净的方式。我希望这能回答你的问题。

public class MyLabel extends JLabel implements MouseListener {

private boolean isRed;
private boolean isGreen;
private boolean first_time = true;

public MyLabel(String name) {
    super(name);
    this.isRed = true;
    this.isGreen = false;
    this.setOpaque(true);
    this.addMouseListener(this);
    this.setBackground(Color.red);
}

public void setRed(boolean val) {
    isRed = val;
}

public void setGreen(boolean val) {
    isGreen = val;
}

public boolean getRed() {
    return isRed;
}

public boolean getGreen() {
    return isGreen;
}


@Override
public void mouseClicked(MouseEvent e) {

}

@Override
public void mousePressed(MouseEvent e) {
    if (first_time) {
        first_time = false;
        this.setGreen(true);
        this.setRed(false);
    }
    if (getRed()) {
        this.setBackground(Color.red);
        this.setGreen(true);
        this.setRed(false);
    }
    else if (getGreen()) {
        this.setBackground(Color.green);
        this.setGreen(false);
        this.setRed(true);
    }
}

@Override
public void mouseReleased(MouseEvent e) {

}

@Override
public void mouseEntered(MouseEvent e) {

}

@Override
public void mouseExited(MouseEvent e) {

}

}

接下来:

public class TestFrame extends JFrame {
public TestFrame() {
    JLabel label = new MyLabel("Name of Label");
    this.add(label);
    this.setVisible(true);
    pack();
}

}

最后主要方法是:

public class Main {
public static void main(String[] args) {
    new TestFrame();
}

}

如果您对我做的事有任何疑问,请随时问我。这就是我通过提问来学习如何更好地编码的方法。所有最好的编码:)