如何从其他类制成的按钮对象获取Source'

时间:2019-04-20 18:09:55

标签: java swing actionlistener

我正在使用Java swing制作记忆游戏。到目前为止,我已经制作了一个返回自定义JButton的类,其中已有图像(未翻转)。在主类中,我正在创建该类的对象并将其添加到面板中。一切正常,但是当我添加动作侦听器时,getSource方法返回一个JButton,结果我无法使用自定义按钮类内部的方法。如何使用getSource并从自定义按钮类创建按钮?

我尝试将getSource方法返回的按钮强制转换为Buttons(自定义按钮类),但是没有用。

public class Buttons extends JButton{
    int id;
    JButton butt;
    private static int x=0;

    public Buttons() throws IOException{
        butt=this.retButton();
    }

    public JButton retButton() throws IOException{
        BufferedImage img = 
        ImageIO.read(getClass().getResourceAsStream("/folder/flipped.png"));
        ImageIcon image = new ImageIcon(img);
        JButton button = new JButton();
        button.setName(Integer.toString(x));
        button.setIcon(image);
        button.setBackground(Color.white);
        x+=1;
        return button;

    }
    public JButton getButton(){
        return this.butt;
    }
    public int getId() {
        return id;
   }
}

我正在使用的主要班级:

    for (int i=0; i<12; i++){
        jb[i] = new Buttons();
        jb[i].getButton().addActionListener(this);
        jb[i].setId(cardNums.get(i));
        panel.add(jb[i].getButton());
    }

    frame.add(panel, BorderLayout.CENTER);

    frame.pack();

@Override
public void actionPerformed(ActionEvent e) {
    Object source = e.getSource();
    if (source instanceof JButton) {
        JButton btn = (JButton)source;
        System.out.println("hey");}

动作侦听器可以工作,但是由于btn是一个JButton,它不会让我使用Buttons类的getId方法。

1 个答案:

答案 0 :(得分:0)

为什么要让Buttons实例具有一个单独的按钮作为属性?您已经是一个按钮。这似乎是一个糟糕的设计选择。

也就是说,由于将按钮名称设置为创建索引,因此可以只使用source.getName()并将其转换回int,然后将该int用作jb数组的索引。