在选项卡式窗格中访问JButtons

时间:2012-03-22 17:18:15

标签: java swing

我正在为我拥有的房间数量创建一个标签式窗格,我正在为每个房间的每个灯光创建一个灯光按钮,并将其添加到选项卡式窗格。

如何在每个选项卡式窗格中区分这些JButton(灯光)?说我想做一些事情来照亮房间2(标签式窗格2)2我怎么称呼它?

目前我只是创建一个名为light的JButton,附加事件类,并将其添加到选项卡式窗格?事件类知道它是什么房间和灯光,但我需要知道如何从事件类之外访问它。

就像我想要激活该按钮的动作事件而不点击它一样。原因是我有一个程序的客户端版本和一个主人,当客户端发生某些事情时,它需要在主服务器上发生。非常感谢任何帮助。

public class MasterGUI extends GUI{
      public static ArrayList<Rooms> rooms;

public MasterGUI(){
    rooms = Building.getRoomList();
}

public static void UpDateGuiLabels(final int roomNo){   
    SwingUtilities.invokeLater(new Runnable(){
        public void run() {
            try{ 
                rooms.get(roomNo - 1).roomHeatLoss();
                solarLabels.get(roomNo - 1).setText("Room BTU is: " + round(rooms.get(roomNo - 1).getHeatLoss()));
            }catch (RuntimeException e){        
            }
        }
    });
}

public void initComponents(){
    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();

    for(Rooms room : rooms){
        JPanel tmpPanel = new JPanel();
        String roomName = room.getName();
        int roomId = room.getId();
        tabbedPane.addTab(roomName + " Room " + roomId, tmpPanel);
        JPanel lightsPane = new JPanel(new BorderLayout());
        lightsPane.setLayout(new GridLayout(0, 2, 0, 5));

        for(Lights light : room.roomLights){
            int lightId = light.getId();
            JButton lights = new JButton("Off");
            lights.setBackground(Color.red);
            lights.addActionListener(new LightButtonEvent(roomId, lightId));
            lights.setPreferredSize(new Dimension(60, 30));
            lights.setBorder(BorderFactory.createRaisedBevelBorder());
            JLabel lightLabel = new JLabel("Light" + lightId);
            Font curFont = lightLabel.getFont();
            lightLabel.setFont(new Font(curFont.getFontName(), curFont.getStyle(), 13));
            lightsPane.add(lightLabel);
            lightsPane.add(lights);
            ((JPanel) tabbedPane.getComponentAt(roomId - 1)).add(lightsPane);
        }

        solarLabels.add(new JLabel("", JLabel.CENTER));
        UpDateGuiLabels(roomId);
        JSlider heaterSlider = new JSlider(68, 73);
        heaterSlider.setPaintTicks(true);
        heaterSlider.setPaintLabels(true);
        heaterSlider.setMajorTickSpacing(1);
        heaterSlider.addChangeListener(new HeaterSliderEvent(roomId));
        heaterSlider.setEnabled(false);
        JButton heater = new JButton("Heater");
        heater.setBackground(Color.red);
        heater.addActionListener(new HeaterButtonEvent(roomId, heaterSlider));
        ((JPanel) tabbedPane.getComponentAt(roomId - 1)).add(heater);
        ((JPanel) tabbedPane.getComponentAt(roomId - 1)).add(heaterSlider);
        ((JPanel) tabbedPane.getComponentAt(roomId - 1)).add(solarLabels.get(roomId - 1));
    }
        master.add(tabbedPane, BorderLayout.CENTER);
        master.setSize(800, 600);
        content.add(tabbedPane);
        master.setVisible(true);
}

活动类别

public class LightButtonEvent implements ActionListener{
  ArrayList<Rooms> rooms;
  int lightNumber;
  int roomNumber;

public LightButtonEvent(int room, int light){
    lightNumber = light;
    roomNumber = room;
    rooms = Building.getRoomList();
}

public void actionPerformed(ActionEvent e){
    if(rooms.get(roomNumber - 1).roomLights.get(lightNumber - 1).getLightStatus() == true){
        rooms.get(roomNumber - 1).roomLights.get(lightNumber - 1).setLightOff();
            ((JButton)e.getSource()).setText("Off");
                ((JButton)e.getSource()).setBackground(Color.red);
                    MasterGUI.UpDateGuiLabels(roomNumber);
    }else{
        rooms.get(roomNumber - 1).roomLights.get(lightNumber - 1).setLightOn();
            ((JButton)e.getSource()).setText("On");
                ((JButton)e.getSource()).setBackground(Color.green);
                    MasterGUI.UpDateGuiLabels(roomNumber);
    }
}

}

1 个答案:

答案 0 :(得分:2)

为什么在地球上你会尝试访问按钮并激活事件。 UI仅是数据的视图。为什么不直接操纵数据?如果你找到一种方法来找到该按钮并触发一次点击(这并不是那么难),那么当你决定改变你的布局后,你就会被搞砸了。

因此,只需在主服务器和客户端之间共享UI后面的数据,并确保在数据发生变化时更新UI(反之亦然,UI应在用户在UI中进行更改时更新数据) 。这样你就可以分享这个州。

如果您想了解更多信息,请尝试在Google上快速搜索MVC(模型 - 视图 - 控制器)。

但是如果仍然想要点击,每个按钮都有一个doClick方法,就像用户按下并释放按钮一样(来自javadoc的引用)。