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