Java开关按钮

Java开关按钮,java,swing,Java,Swing,我有一个Swing JFrame面板,有两个文本字段和一个按钮。我需要按钮能够触发不同文本字段中的文本更改(具体来说,从“开”到“关”)。复杂的因素是,我需要它只更改上次单击的文本区域的文本 下面是到目前为止我的代码。请注意,单击文本字段本身可以切换文本,这是我想要的。但我也希望该按钮能够切换文本,但只能切换用户在单击按钮之前单击的最后一个文本区域中的文本。按我现在的方式,按钮可以切换两个文本字段,这是我不想要的 我怀疑可能有一个简单的方法来实现这一点,我忽略了 public class Swi

我有一个Swing JFrame面板,有两个文本字段和一个按钮。我需要按钮能够触发不同文本字段中的文本更改(具体来说,从“开”到“关”)。复杂的因素是,我需要它只更改上次单击的文本区域的文本

下面是到目前为止我的代码。请注意,单击文本字段本身可以切换文本,这是我想要的。但我也希望该按钮能够切换文本,但只能切换用户在单击按钮之前单击的最后一个文本区域中的文本。按我现在的方式,按钮可以切换两个文本字段,这是我不想要的

我怀疑可能有一个简单的方法来实现这一点,我忽略了

public class SwitchesTest extends JFrame {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new SwitchesTest().displayJFrame();
            }
        });
    }

    private void displayJFrame() {
        JFrame frame = new JFrame("Switches");

        JButton button = new JButton("Switch");
        JTextArea switch1 = new JTextArea("On",1,3);
        JTextArea switch2 = new JTextArea("On",1,3);

        frame.getContentPane().setLayout(new GridBagLayout());

        frame.add(switch1);
        frame.add(switch2);
        frame.add(button);

        button.addActionListener(e -> {
            switch1.setText("On".equals(switch1.getText()) ? "Off" : "On");
            switch2.setText("On".equals(switch2.getText()) ? "Off" : "On");
        });

        switch1.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                switch1.setText("On".equals(switch1.getText()) ? "Off" : "On");
            }
        });

        switch2.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                switch2.setText("On".equals(switch2.getText()) ? "Off" : "On");
            }
        });

        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

未测试,但只需保存上次单击的文本区域,以便稍后切换

注意:在这里使用“static”是一种反模式,IMO。考虑将这个类转换为实例化的对象,并在其CtoR中完全初始化它。

public class SwitchesTest {

   static private JTextArea lastClicked;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                displayJFrame();
            }
        });
    }

    static void displayJFrame() {
        JFrame frame = new JFrame("Switches");

        JButton button = new JButton("Switch");
        JTextArea switch1 = new JTextArea("On",1,3);
        JTextArea switch2 = new JTextArea("On",1,3);

        frame.getContentPane().setLayout(new GridBagLayout());

        frame.add(switch1);
        frame.add(switch2);
        frame.add(button);

        button.addActionListener(e -> {
            if( lastClicked != null ) 
              lastClicked.setText("On".equals( lastClicked.getText()) ? "Off" : "On");
        });

        switch1.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                switch1.setText("On".equals(switch1.getText()) ? "Off" : "On");
            lastClicked = switch1;
            }
        });

        switch2.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                switch2.setText("On".equals(switch2.getText()) ? "Off" : "On");
            lastClicked = switch2;
            }
        });
但我也希望该按钮能够切换文本,但只能切换用户在单击按钮之前单击的最后一个文本区域中的文本

文本组件已经有了一个API来跟踪哪个文本组件上一次拥有焦点,所以不需要自己管理它

您需要做的就是为ActionListener使用
TextAction
。然后,您只需使用TextAction的
getFocusedComponent()
方法访问具有焦点的最后一个文本组件

比如:

button.addActionListener( new TextAction("Switch")
{
    @Override
    public void actionPerformed(ActionEvent e)
    {
        JTextComponent component = getFocusedComponent();

     if( component != null )
       component.setText("On".equals( component.getText()) ? "Off" : "On");
 }
});
当然,焦点将放在框架上的任何文本组件上,因此只有当您只有两个文本组件时,这种方法才会起作用


但是这种方法不需要任何额外的监听器。

Java是一种面向对象的语言,因此您应该避免使用静态方法,使用字段和实例方法。您应该使用FocusListener,而不是MouseStener。用户可以用tab键指向文本字段,也可以单击文本字段。谢谢,camickr。我也会看看这个——虽然我实际上需要操纵几个文本字段(为了保持简单,我在这里只提到了2个)。@JWoodchuck,这就是我的观点。如果希望“所有”文本字段具有相同的功能,则应使用TextAction。如果对不同的文本字段具有不同的功能,则需要使用焦点侦听器方法。