2017-08-26 172 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