组件之间的Java swing通信

时间:2018-06-28 10:20:57

标签: java swing jbutton actionlistener jtextpane

我在使用Swing中的组件进行交互或采取行动的方式上遇到了问题。我的计划是在按下按钮时禁用/启用JTextPane,然后输入数字,以便程序可以开始计算。到目前为止,这是我所坚持的地方:

    private JPanel contentPane;
    protected JTextPane txtpnA;
    protected JTextPane txtpnB;
    protected JTextPane txtpnC;

     /* Button 'a' **/

    JButton btnA = new JButton("a");
    btnA.setBackground(Color.YELLOW);
    btnA.setBounds(47, 54, 89, 23);
    btnA.setActionCommand("a");
    btnA.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent event) {
        } {
        }
    });
    contentPane.add(btnA);

   /* TextPane 'a' **/

   txtpnA = new JTextPane();
   txtpnA.setBounds(47, 88, 89, 20);
   contentPane.add(txtpnA);
   txtpnA.setBorder(BorderFactory.createLineBorder(Color.black));

这是方法:

   public void actionPerformed(ActionEvent event) {

    String command = event.getActionCommand();
    if(command.equals("a")) 
    {
        txtpnA.setEnabled(false);
    } else if(command.equals("b")) 
    {
        txtpnB.setEnabled(false);
    } else if(command.equals("c")) 
    {
        txtpnC.setEnabled(false);
    }
  }
}

我很难找到有关JComponents之间通信的文章。如果您还可以建议详细的来源,将不胜感激。

2 个答案:

答案 0 :(得分:2)

我建议您创建一个新类,该类可以处理对特定组件的请求,并且不要使用匿名事件处理程序:

public class ButtonHandler extends AbstractAction {
    private JComponent componentToDisable;
    public ButtonHandler(JComponent comp, String text) {
        super(text);
        componentToDisable = comp;
    }
    public void actionPerformed(ActionEvent event) {
       componentToDisable.setEnabled(false);
    }
}

如何使用它:

/* TextPane 'a' **/
txtpnA = new JTextPane();
txtpnA.setBounds(47, 88, 89, 20);
contentPane.add(txtpnA);
txtpnA.setBorder(BorderFactory.createLineBorder(Color.black));

JButton btnA = new JButton(new ButtonHandler(textpnA, "a"));
btnA.setBackground(Color.YELLOW);
btnA.setBounds(47, 54, 89, 23);
contentPane.add(btnA);

其他按钮的操作步骤相同。

JButton btnB = new JButton(new ButtonHandler(textpnB, "b"));
JButton btnC = new JButton(new ButtonHandler(textpnC, "c"));

最后但并非最不重要的一点。正如安德鲁·汤普森(Andrew Thompson)所述:

  

Java GUI必须在不同的区域中使用不同的PLAF在不同的OS,屏幕大小,屏幕分辨率等上工作。因此,它们不利于像素的完美布局。取而代之的是使用布局管理器,或将它们与布局填充和边框一起用于空白。

答案 1 :(得分:0)

如果我正确理解您的问题,则想创建一个通用的ActionListener,它将通过您的按钮调用。

您可以在具有这些按钮的班级中创建内部私有班级。并将该内部类的实例添加到button的ActionListener。

public class MyClass {

    //...//

    JButton a = new JButton("a");
    a.setActionCommand("a");
    a.setBounds(0, 0, 50, 50);
    a.addActionListener(new ActionButtons());

    //...//

    private class ActionButtons implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent arg0) {

            String action = arg0.getActionCommand();

            if(action.equals("a")) {

                System.out.println("a");

            }

            if(action.equals("b")) {

                System.out.println("b");

            }

            if(action.equals("c")) {

                System.out.println("c");

            }
        }
    }
}

P.S .:如果要在多个类中使用该ActionListener,则可以在其他类文件中将其声明为公共类。