识别从for循环创建的数组中的对象

时间:2016-12-18 23:20:14

标签: java swing

我有一个项目,处理填充了jbuttons的三个面板。 jbuttons是从for循环创建的,我懒得重新创建一个带有jbutnel填充jbuttons的类,因为它与我的actionlisteners冲突。 假设我有三个面板,每个面板都填充了代码:

 JPanel panel109 = new JPanel(); //113, 115 for the other two
 roomPanel.add(panel109);
 for(int j = 0; j < 6*28; j++) {
    btn[j] = new JButton();
    btn[j].setName("a" + j);
    btn[j].setBackground(Color.white);
    btn[j].setText("");
    btn[j].setPreferredSize(new Dimension(35,9));
    btn[j].addActionListener(this);
    panel109.add(btn[j]);
}

对于每个面板,如何识别创建的每个btn []?我希望在用户指定数据后序列化每个按钮以更改按钮的颜色,工具提示文本等。我​​只是想知道如何访问我创建的按钮,因为三个面板使用相同的循环。 所有按钮的序列化都来自“商店”按钮,如果我想从它创建的文件中恢复,则“恢复”。

商店代码:

JButton btnStore = new JButton("Store");
    btnStore.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            ObjectOutputStream out = null;
            try {
                out = new ObjectOutputStream (new FileOutputStream("myFile"));
            } catch (FileNotFoundException e1) {
                e1.printStackTrace();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
            for (int i=0;i<6*28;i++){
                //deregister
                btn[i].removeActionListener(this);//Heres my problem,
                //serialize                    //I Don't know how to access 
                try {                         //the buttons created from the
                    out.writeObject(btn[i]); //three loops.
                } catch (IOException e1) {

                    e1.printStackTrace();
                }
                try {
                    out.flush();
                } catch (IOException e1) {

                    e1.printStackTrace();
                }
                //register
                btn[i].addActionListener(this);

            }
        }
    });

3 个答案:

答案 0 :(得分:1)

您可以使用JPanel.putClientProperty()存储JButton[]

panel109.putClientProperty("btn", btn);

然后通过

访问它
JButton[] btn = (JButton[])panel109.getClientProperty("btn");

您还可以使用MapputClientProperty()最终使用的是Map<Object,Object>,但它更通用Map<JPanel,JButton[]> mapPanelButtons = new HashMap<>(); mapPanelButtons.put(panel109, btn); ... JButton[] btn = mapPanelButtons.get(panel109); ):

JPanel

编辑:使用商店按钮代码进行编辑时,我认为最好将JButton[]子类化为成员getClientProperty()并在任何地方直接访问。懒惰是好的,它可以帮助你找出最快的方法,而不是最脏的;) 也就是说,您可以在Store按钮动作侦听器代码中使用public void actionPerformed(ActionEvent e) { ... JButton[] btn = (JButton[])panel109.getClientProperty("btn"); for (int i=0;i<6*28;i++){ // You might want to use btn.length instead of 6*28 // ... rest of your code } } ,如下所示:

GL_POSITION

答案 1 :(得分:0)

嵌套循环?

for (int i = 0; i < roomPanel.size(); i++) {
    JPanel panel = roomPanel[i];
    for (int j = 0; j < numButtons; j++) {
            btn[i][j] = new JButton();
            btn[i][j].setName(i +"-"+ j);
            btn[i][j].setBackground(Color.white);
            btn[i][j].setText("");
            btn[i][j].setPreferredSize(new Dimension(35,9));
            btn[i][j].addActionListener(this);
            panel.add(btn[i][j]);
    } 
}

假设roomPanel是您的小组列表。

答案 2 :(得分:0)

我最终分别为每个面板创建了3个不同的JButton []数组,以使事情更简单并满足截止日期,但老实说,我认为有更简单的方法。

JPanel panel109 = new JPanel();
JButton[] btnOne = new JButton();
for(int j = 0; j < 6*28; j++) {
    btnOne[j] = new JButton();
    btnOne[j].setName("a" + j);
    btnOne[j].setBackground(Color.white);
    btnOne[j].setText("");
    btnOne[j].setPreferredSize(new Dimension(35,9));
    btnOne[j].addActionListener(this);
    panel109.add(btnOne[j]);
}

JPanel panel115 = new JPanel();
JButton[] btnTwo = new JButton();
for(int j = 0; j < 6*28; j++) {
    btnOne[j] = new JButton();
    btnTwo[j].setName("b" + j);
    btnTwo[j].setBackground(Color.white);
    btnTwo[j].setText("");
    btnTwo[j].setPreferredSize(new Dimension(35,9));
    btnTwo[j].addActionListener(this);
    panel115.add(btnTwo[j]);
}
....

这使得每个JButton数组都是独一无二的,并且可以更轻松地访问。