我有一个项目,处理填充了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);
}
}
});
答案 0 :(得分: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()
并在任何地方直接访问。懒惰是好的,它可以帮助你找出最快的方法,而不是最脏的;)
也就是说,您可以在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数组都是独一无二的,并且可以更轻松地访问。