Java如何将id分配给按钮并检索它们?

时间:2015-09-15 06:46:27

标签: java swing jbutton

我在构建像应用程序这样有投票按钮的论坛时陷入困境。

我为每个自动生成的内容投票并投票。我希望此按钮仅显示向上和向下箭头,但不显示任何文本或标签..如何找出按下哪个按钮?

自动内容..

ImageIcon upvote = new ImageIcon(getClass().getResource("vote_up.png"));
ImageIcon downvote = new ImageIcon(getClass().getResource("vote_down.png"));
JButton vote_up = new JButton(upvote);
JButton vote_down = new JButton(downvote);
vote_up.addActionListener(voting);
vote_down.addActionListener(voting);

Action voting = new AbstractAction(){
    @Override
    public void actionPerformed(ActionEvent e){
        //What to do here to find out which button is pressed?
    }
};

感谢任何帮助。

public void a(){
    int crt_cnt = 0;
    for(ClassA temp : listofClassA)
    {                    
        b(crt_cnt);
        crt_cnt++;
    }

}
public void b(crt_cnt){
     //draw button
}

如上所述,我有多个由b函数创建的vote_up和vote_down按钮,如何区分哪个crt_cnt是按钮?

4 个答案:

答案 0 :(得分:3)

您可以通过多种方式实现此目标

你可以......

只需使用source

ActionEvent即可
Action voting = new AbstractAction(){
    @Override
    public void actionPerformed(ActionEvent e){
        if (e.getSource() == vote_up) {
            //...
        } else if (...) {
            //...
        }
    }
};

如果你有对原始按钮的引用

,这可能没问题

你可以......

为每个按钮分配actionCommand

JButton vote_up = new JButton(upvote);
vote_up.setActionCommand("vote.up");
JButton vote_down = new JButton(downvote);
vote_down .setActionCommand("vote.down");
//...
Action voting = new AbstractAction(){
    @Override
    public void actionPerformed(ActionEvent e){
        if ("vote.up".equals(e.getActionCommand())) {
            //...
        } else if (...) {
            //...
        }
    }
};

你可以......

充分利用Action API并为每个按钮制作单独的,自包含的操作......

public class VoteUpAction extends AbstractAction {

    public VoteUpAction() {
        putValue(SMALL_ICON, new ImageIcon(getClass().getResource("vote_up.png")));
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        // Specific action for up vote
    }

}

然后你可以简单地使用

JButton vote_up = new JButton(new VoteUpAction());
//...

这将根据Action的属性配置按钮,并在触发按钮时触发它的actionPerformed方法。通过这种方式,您可以100%了解调用actionPerformed方法时应该/需要做的事情,毫无疑问。

详细了解How to Use Actions了解更多详情

答案 1 :(得分:1)

您可以使用getSource()

的方法EventAction进行检测
Action voting = new AbstractAction(){
    @Override
    public void actionPerformed(ActionEvent e){
        if (e.getSource() == vote_up ) {
           // vote up clicked
       } else if (e.getSource() == vote_down){
          // vote down clicked
       }
    }
};

答案 2 :(得分:0)

我会将JButton包装成类似于:

    JButton createMyButton(final JPanel panel, final String text,
        final boolean upOrDown, final int gridx, final int gridy) {
        final JButton button = new JButton();
        button.setPreferredSize(new Dimension(80, 50));
        final GridBagConstraints gbc = Factories.createGridBagConstraints(gridx,
            gridy);
        panel.add(button, gbc);
        button.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(final ActionEvent e) {
            myActionPerformed(text, upOrDown);
        }
    });
    return button;
}

如果更方便的话,你可以使用int而不是文本。

答案 3 :(得分:0)

嘿,感谢所有的帮助和帮助!我终于明白了!我解决了 在按钮上分配文本,+ / - 用于向上或向下投票,然后是我需要的内容ID,然后将字体大小更改为0

vote.setText("+"+thistopic.content.get(crt_cnt).get_id());
vote.setFont(heading.getFont().deriveFont(0.0f));

之后我可以通过与

比较来轻松追踪按下的按钮
actionEvent.getActionCommand()

返回按钮上的文字!