处理JButton集合的事件

时间:2015-03-09 21:10:49

标签: java swing arraylist event-handling

我正在尝试创建动态界面,它实际上创建了一个越来越多的面板网格,看起来类似于下图。我有一些粗略的代码来实现这一目标。关于处理我添加到ArrayList的JButton事件,我遇到了一个问题。我知道创建内部类事件处理程序是最佳实践,我如何处理存储在ArrayList中的缩放数量的按钮的事件?

目前我已经获得了获取对象源的功能。

Example of one of the panels

全局变量:

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

    }
}

2 个答案:

答案 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在一个平台和屏幕分辨率上看起来还不错,但它们在所有其他平台上看起来很糟糕。了解并使用布局管理器。
  • 也许你想要一系列动作或JButton,但我不确定你是否需要这个。如果按钮的动作知道该怎么做,则不需要任何收集。 Action可以有一个构造函数,它传递对菜单项的名称和价格的引用。

答案 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布局的人,一旦习惯使用布局管理器,我相信你会喜欢它们。