2012-02-14 7 views
3

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

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

JFrame

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

Любые советы оценили, спасибо!

+2

Показать ваш код было бы полезно. Опубликовать [SSCCE] (http://sscce.org) было бы лучше. – Jeffrey

+1

У вас, вероятно, не должно быть 1 'JFrame' и 2' JPanel' * классов * столько, сколько * экземпляров * (стандартного компонента). Кроме того, он будет платить за то, чтобы ваши имена классов/экземпляров были менее абстрактными, в этой панели 1 может быть 'userDetails', а панель 2 может быть' userControls', что дает нам лучшее представление о конечной цели и тем лучше шанс предоставить оптимальные рекомендации. –

ответ

5

Один из способов сделать это - передать экземпляр (использовать вашу терминологию) 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.

+0

Спасибо! Это прекрасно отвечало на мой вопрос! – Zargontapel

+2

Не беспокойтесь. Если он полностью отвечает на ваш вопрос, вы должны нажать зеленый галочку рядом с этим ответом. :) – Catchwa

Смежные вопросы