2016-12-18 38 views
-1

我有一个项目处理三个使用jbuttons填充的面板。 jbuttons是从一个for循环创建的,我懒得重新创建一个jpanel填充了jbuttons的类,因为它与我的actionlisteners冲突。 可以说我有每个三块板填入代码:确定从for循环创建的数组中的对象

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

      } 
     } 
    }); 
+0

首先你应该http://stackoverflow.com/mcve你的例子,第二如果你使用单选按钮,然后使用JRadioButton()...你也可以使用https://docs.oracle.com/javase /tutorial/uiswing/examples/components/index.html#ListDialog作为一个开始的例子,因为你正在挑选整个按钮主机 –

+0

哎呀,我搞砸了什么类型的按钮 – kfloresmx5

+0

@ kfloresmx5你正在访问'JButton [] btn'在ActionListener里面,我们猜它是一个类成员(还是一个“final”局部变量)?除非为每个容器创建一个新数组,否则不能将同一对象添加到多个容器('JPanel')。这些变量的范围很重要,特别是当你想要将它们检索到别处时... – Matthieu

回答

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是您的名单。

+0

我不明白这是如何回答我的问题,就像我不想再次填充面板,但我想找到一种方法来访问循环中按钮的标识符,以便在用户编辑它们之后序列化它。 – kfloresmx5

+0

您可以将您的按钮表示为二维数组,第一个维度为面板,第二个按钮。否则,我可能完全误解你的问题。 –

+0

是的我的问题有点令人困惑,但我添加了我的“商店”按钮代码,以显示我到底做了什么。 – kfloresmx5

1

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

panel109.putClientProperty("btn", btn); 

然后通过

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

访问它,你也可以使用一个Map(这是什么putClientProperty()用到底,虽然它是更一般的Map<Object,Object>):

Map<JPanel,JButton[]> mapPanelButtons = new HashMap<>(); 
mapPanelButtons.put(panel109, btn); 
... 
JButton[] btn = mapPanelButtons.get(panel109); 

编辑:从您使用商店按钮代码进行编辑,我认为如果继承JPanel以将JButton[]作为成员并在任何地方直接访问,您会更好。懒惰是好当它可以帮助你找出最快速的方法,而不是最脏;) 这就是说,你可以在你的商店按钮动作监听器代码使用getClientProperty()这样的:

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 
    } 
} 
+0

我添加了我的“商店”按钮代码,我很困惑你的答案将如何结合到循环中。 – kfloresmx5

+0

@ kfloresmx5你也可以在'JButton'的每个实例中保存'JPanel':'btn [j] .putClientProperty(“panel”,panel109)'并在'ActionListener'中检索它。 – Matthieu

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数组本身都是唯一的,并且可以更容易地访问。

+0

是的:继承'JPanel' ... – Matthieu