2012-03-14 2 views
0

Я довольно новичок в java, так что медведь со мной пожалуйста, в основном, внизу. У меня есть панель с вкладками для каждой из четырех комнат в комнатах Arraylist, и я создаю кнопки в каждая вкладка зависит от количества огней каждой комнаты. Как я могу связать кнопки на каждой вкладке с указанными комнатами ?. Так, например, когда я нажимаю кнопку «Свет» на вкладке «Комната 1», слушатель событий знает, что кнопка принадлежит комнате1?GUI action listeners для каждой вкладки в панели с вкладками

Любая помощь приветствуется, спасибо.

import java.util.ArrayList; 
import java.awt.*; 
import javax.swing.*; 
import java.awt.event.*; 

public class MasterGUI extends JFrame implements ActionListener{ 

public MasterGUI(){ 

} 

public void DisplayFrame(){ 
    ArrayList<Rooms> rooms; 
    rooms = Building.getRoomList(); 

    JFrame master = new JFrame("Solar Master Control Panel"); 
    master.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    Container content = master.getContentPane(); 
    content.setBackground(Color.lightGray); 

    JTabbedPane tabbedPane = new JTabbedPane(); 
    JPanel tmpPanel; 

    for(int x = 0; x < rooms.size(); x++){ 
     tmpPanel = new JPanel(); 
     String roomName = rooms.get(x).getName(); 
     int id = rooms.get(x).getId(); 
     tabbedPane.addTab(roomName + " Room " + id, tmpPanel); 
    } 

    for(int x = 0; x < rooms.size(); x++){ 
     for(int i = 0; i < rooms.get(x).roomLights.size(); i++){ 
      int num = i + 1; 
      ((JPanel) tabbedPane.getComponentAt(x)).add(new JButton("Light" + num)); 
     } 
    } 

    master.add(tabbedPane, BorderLayout.CENTER); 
    master.setSize(800, 600); 
    content.add(tabbedPane); 
    master.setVisible(true); 
} 

public void actionPerformed(ActionEvent e){ 

} 
+0

Класс оболочки может работать, или 'HashMap '. –

+0

Java имеет [для каждого цикла] (http://www.leepoint.net/notes-java/flow/loops/foreach.html), что означало бы, что вам не нужно делать все 'get (x) 'звонки. Вы также можете добавить кнопки на панель при первом ее создании вместо одного цикла, чтобы панели и другой цикл добавляли кнопки. – unholysampler

ответ

3

Прежде, вам нужно добавить ActionListener к кнопке, так что будет вызываться при нажатии на кнопку.

... 
JButton button = new JButton("Light" + num); 
button.addActionListener(this); 
((JPanel) tabbedPane.getComponentAt(x)).add(button); 
... 

Что касается различия между кнопкой, нажатой, существует два основных способа решения этой проблемы. Первый заключается в использовании getSource() на ActionEvent, чтобы получить ссылку на объект, который вызвал событие. Вы можете использовать это, чтобы решить, как вы хотите двигаться дальше. Другим вариантом является наличие MasterGUIне реализация ActionListener. Вместо этого создайте уникальную ActionListener для каждой кнопки, которая сразу же узнает, какие действия должны произойти при ее вызове. Первый вариант упрощает регистрацию слушателей, но требует больше работы в обработчике для определения источника. Я предпочитаю второй метод.

2

ActionEvent in actionPerformed() покажет вам источник нажатой кнопки. Таким образом, вы можете сделать одну из двух вещей, вы можете назвать кнопку (которая не совпадает с текстом кнопки), что указывает на комнату, или вы можете предоставить командную строку, которую вызывает кнопка, которая также доступна из ActionEvent ,

Проверьте JButton JavaDoc, у него есть ссылки на действия с действиями и, в частности, кнопки Действия поддерживаются.

Он также сфокусирует ваш вопрос на лучшем, так как у вас будет лучшее представление о том, как вы хотите достичь своей цели.