2017-08-26 70 views
2

我有一个Swing JFrame面板,带有2个文本字段和一个按钮。我需要该按钮能够触发不同文本字段中文本的更改(具体来说,从“开”到“关”)。复杂的因素是我需要它只改变被点击的最后文本区域的文本。Java开关按钮

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

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

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); 
    } 
} 
+1

Java是一种面向对象的语言,因此您应该避免使用静态方法并使用字段和实例方法。 –

回答

3

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

注意:这里使用“静态”开始是反模式,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; 
      } 
     }); 
+0

作品!谢谢,markspace! –

+0

您应该使用FocusListener,而不是MouseListener。用户可以选择文本字段或单击文本字段。 – camickr

1

但我也希望按钮来切换文本 - 但只有在文字的最后文本区域,用户点击该按钮之前点击。

文本组件已经有一个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"); 
} 
}); 

的重点将是在框架上的任何文字组成,因此,如果你只有两个文本组件这种方法才有效。

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

+0

谢谢,camickr。我也会看看这个 - 尽管我实际上需要操纵几个文本字段(我在这里只提到了2个,以保持简单)。 –

+0

@JWoodchuck,那是我的观点。如果你想为“所有”文本字段使用相同的功能,你应该使用TextAction。如果您对不同的文本字段有不同的功能,那么您需要使用焦点侦听器方法。 – camickr