Java свинг связь между компонентами - PullRequest
0 голосов
/ 28 июня 2018

У меня проблемы с подключением компонентов в 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 голосов
/ 28 июня 2018

Я бы предложил вам создать новый класс, который будет обрабатывать ваш запрос для определенного компонента и не использовать обработчик событий anonymouse:

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"));

И последнее, но не менее важное. Как уже упоминал Эндрю Томпсон:

Java GUI должны работать на разных ОС, размерах экрана, разрешении экрана и т. Д., Используя разные PLAF в разных локалях. Как таковые, они не способствуют идеальному макету пикселей. Вместо этого используйте менеджеры макетов или их комбинации вместе с отступами макетов и границами для пробелов.

0 голосов
/ 28 июня 2018

Если я правильно понимаю вашу проблему, вы хотите создать общий ActionListener, который будет вызываться вашими кнопками.

Вы можете создать внутренний закрытый класс в вашем классе, где есть эти кнопки. И добавьте экземпляр этого внутреннего класса в 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 более чем в одном классе, вы можете объявить его как открытый класс в другом файле класса.

...