我正在尝试创建动态界面,它实际上创建了一个越来越多的面板网格,看起来类似于下图。我有一些粗略的代码来实现这一目标。关于处理我添加到ArrayList的JButton事件,我遇到了一个问题。我知道创建内部类事件处理程序是最佳实践,我如何处理存储在ArrayList中的缩放数量的按钮的事件?
目前我已经获得了获取对象源的功能。
全局变量:
ArrayList<JButton> buttons = new ArrayList<JButton>();
向面板添加按钮:
for (int i = 0; i < 2; i ++) {
int xTotal = 150;
if (i == 0) {
xTotal = 132;
}
else {
xTotal = 308;
}
xTotal = xTotal + xTotal;
JButton currentButton = new JButton("+");
currentButton.setBounds(xTotal , 375, 45, 25);
currentButton.setFont(currentButton.getFont().deriveFont(14f));
currentButton.addActionListener(new AddHandler());
buttons.add(currentButton);
panel.add(currentButton);
}
事件处理程序:
class AddHandler implements ActionListener {
public void actionPerformed(ActionEvent event) {
Object source = event.getSource();
if (source == buttons.get(0)) {
System.out.println("hello");
}
else {
System.out.println("it worked");
}
}
}
答案 0 :(得分:4)
在我看来,您创造的不仅仅是JButtons
的集合。相反,你似乎想要创建(并纠正我,如果我错了),一组带有JButton
的图像/文本。这表明你想要创建一个封装一个(?)菜单项的类,它包含一个用于图像的JLabel,一个JLabel
可能用于文本,也许是其他组件,以及用户可以按JButton
选择菜单项。该组件将是一个JPanel(在此重要)使用布局管理器来智能地安排其所有组成组件。我建议不要使用ActionListeners
,而是在扩展AbstractAction
的类中创建一个单独的展台,您可以使用它来设置每个JButton
Action
,或者通过JButton
的构造函数或通过其setAction(...)
方法。然后,您可以将这些JPanel的集合放在使用JPanel
的主GridLayout
中,并将其保存在JScrollPane
中。
我的建议和代码的细节当然取决于GUI和当前代码的详细信息。
其他&#34; side&#34;建议:
null
布局和setBounds(...)
。通常新手Swing程序员认为这是创建复杂GUI的最简单方法,并且在短期内可能是,但从长远来看,当需要维护,升级和增强GUI时,它不是#39;吨。此外,如此创建的GUI在一个平台和屏幕分辨率上看起来还不错,但它们在所有其他平台上看起来很糟糕。了解并使用布局管理器。答案 1 :(得分:1)
即使你已经接受了另一个答案,我想分享我的想法。
我的想法是通过创建JButton的子类在按钮上存储一个数字(可能是一个ID)。 (ID可能是,此按钮当前链接的食品的ID)
class FoodButton extends JButton{
long id;
public FoodButton(String text, long id){
super(text);
this.id = id;
}
//Perhaps more constructors
public long getId(){
return id;
}
}
然后编写一个获取事件源的actionListener(即使你认为这是不好的做法,我认为在这个例子中它是有意义的),观察:
ActionListener al = new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
FoodButton btn = (FoodButton) e.getSource();
long id = btn.getId();
//Do something now that you know what button was clicked (id)
}
}
让我再次注意,此actionListener是在之前创建的,因此您只需要一个,并且您将相同的一个分配给所有按钮。
然后在你的循环中而不是创建一个普通的JButton,你创建一个FoodButton:
ActionListener al = new ActionListener(){...};
for (int i = 0; i < 2; i ++) {
//...
//Assigning id 'i' here, but you could pick something else
JButton currentButton = new FoodButton("+", i);
//...
currentButton.addActionListener(al);
buttons.add(currentButton);
panel.add(currentButton);
}
我希望这对你有意义。
此外,作为曾经使用过null布局的人,一旦习惯使用布局管理器,我相信你会喜欢它们。