【问题标题】:GUI action listeners for each tab in a tabbed pane选项卡式窗格中每个选项卡的 GUI 操作侦听器
【发布时间】:2012-03-14 22:33:26
【问题描述】:

我对 java 还很陌生,所以请多多包涵,基本上,在房间 Arraylist 中的四个房间的每一个下面我都有一个选项卡式窗格,我在每个选项卡中创建按钮,具体取决于每个房间有多少灯,如何将每个选项卡中的按钮与指定的房间相关联?所以就像当我点击 Room 1 选项卡中的灯光按钮时,事件监听器知道该按钮属于 room1?

感谢您的帮助。

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){

}  

【问题讨论】:

  • 一个包装类可以工作,或者一个HashMap&lt;JButton, Room&gt;
  • Java 有一个for-each loop,这意味着您不必执行所有get(x) 调用。您也可以在第一次创建面板时将按钮添加到面板,而不是一个循环来制作面板,另一个循环来添加按钮。

标签: java swing jbutton actionlistener jtabbedpane


【解决方案1】:

首先,您需要将ActionListener 添加到按钮,以便在单击按钮时调用它。

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

就区分单击的按钮而言,有两种主要方法可以解决此问题。第一种是在ActionEvent 上使用getSource() 来获取对触发事件的对象的引用。您可以使用它来决定如何进一步进行。另一种选择是让MasterGUI实现ActionListener。相反,为每个按钮创建一个唯一的ActionListener,以便在调用它时立即知道需要执行什么操作。第一个选项使注册侦听器更容易,但需要在处理程序中进行更多工作以确定源。我更喜欢第二种方法。

【讨论】:

    【解决方案2】:

    actionPerformed() 中的 ActionEvent 会告诉您按下按钮的来源。所以你可以做两件事之一,你可以命名按钮(这与按钮文本不同)一些指示房间的东西,或者你可以提供一个按钮调用的命令字符串,这也可以从 ActionEvent 获得.

    查看JButton JavaDoc,它有处理动作的链接,特别是支持的按钮动作。

    它也会更好地集中你的问题,因为你会更好地了解你希望如何实现你的目标。

    【讨论】:

      猜你喜欢
      • 2019-12-12
      • 1970-01-01
      • 1970-01-01
      • 2020-04-11
      • 1970-01-01
      • 2013-08-16
      • 2015-05-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多