Действия кнопок Java в нескольких классах - PullRequest
3 голосов
/ 14 февраля 2012

Работа в Java: у меня есть класс JFrame и отдельные классы для моих двух JPanels, которые добавляются к JFrame.В одном из классов JPanel есть несколько кнопок, которые могут взаимодействовать друг с другом (когда я нажимаю одну кнопку, она может отключить другую кнопку).Однако я не могу понять, как получить кнопку для вызова метода в другом JPanel (написанном в отдельном классе).

Итак, моя программа выглядит следующим образом:

JFrame

  • Jpanel1
  • Jpanel2 - в этом классе есть мои кнопки, япытаясь заставить их взаимодействовать с объектом JPanel1.

Любые советы приветствуются, спасибо!

1 Ответ

5 голосов
/ 14 февраля 2012

Один из способов сделать это - передать экземпляр (для использования вашей терминологии) Jpanel1 в Jpanel2. Это не обязательно делать в конструкторе, вы можете использовать метод setConnectedPanel(JPanel), например.

Вот код, который демонстрирует, что вы хотите сделать:

MyFrame.java

import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class MyFrame extends JFrame {

  public MyFrame() {
    ReactionPanel rp = new ReactionPanel();
    ActionPanel ap = new ActionPanel(rp);
    setLayout(new GridLayout(2, 1));
    add(ap);
    add(rp);
    pack();
    setVisible(true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }

  public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
      @Override
      public void run() {
        new MyFrame();
      }
    });
  }
}

ActionPanel.java

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JPanel;

public class ActionPanel extends JPanel implements ActionListener {
  private ReactionPanel rp;
  private JButton button;

  public ActionPanel(ReactionPanel rp) {
    this.rp = rp;
    button = new JButton("Click");
    button.addActionListener(this);
    this.add(button);
  }

  @Override
  public void actionPerformed(ActionEvent e) {
    if(e.getSource().equals(button)) {
      rp.react();
    }
  }
}

ReactionPanel.java

import javax.swing.JLabel;
import javax.swing.JPanel;

public class ReactionPanel extends JPanel {
  private JLabel label;

  public ReactionPanel() {
    label = new JLabel("PING");
    this.add(label);
  }

  public void react() {
    if(label.getText().equals("PING")) {
      label.setText("PONG");
    } else {
      label.setText("PING");
    }
  }
}

Как вы видите, я склонен переопределять все мои JFrames / JPanels, когда я пишу Swing GUI, так как я нахожу это более простым и более гибким, но YMMV.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...