有没有办法在JButton中存储数据?

时间:2014-02-03 17:12:20

标签: java image dynamic jbutton imageicon

我的程序当前将一个图像添加到List,然后它创建一个动态存储缩略图的Jbutton。喜欢找到here。虽然图像是在用户选择时添加的。

我遇到的问题是我无法将图像更改为所选的缩略图,因为它们未链接到列表中的图像。有没有办法可以在按钮中存储图像的索引号,所以当我点击它时,我知道列表中显示哪个图像?还是有另一种更聪明的方式吗?感谢。

 //Create thumbnail
    private void createThumbnail(ImpImage image){
        Algorithms a = new Algorithms();
        ImpImage thumb = new ImpImage();
        //Create Thumbnail
        thumb.setImg(a.shrinkImage(image.getImg(), 75, 75));
        //Create ImageIcon
        ImageIcon icon = new ImageIcon(thumb.getImg());
        //Create JButton
        JButton iconButton = new JButton(icon); 
        //Create ActionListener
        iconButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                bottomBarLabel.setText("Clicked");
                imagePanel.removeAll();
                imagePanel.add(images.get(position)); //Needs Fixing
                imagePanel.revalidate();
            }
        });
        //Add to previewPanel
        previewPanel.add(iconButton);
        previewPanel.revalidate();
        previewPanel.repaint();
    }

我实现这个的方法是:1)打开图像,2)将图像添加到列表,3)创建图像的缩略图 - >添加到ImageIcon - >添加到Jbutton - >添加到组件w / actionListener。问题是我没有将按钮存储在列表中,因此它不知道列表中各自图像的编号。

2 个答案:

答案 0 :(得分:4)

如何扩展JButton类。

class MyButton extends JButton{
    public int index;
    MyButton(){super();}
    MyButton(int index){super();this.index=index;}
}

当您需要获取索引时,将其强制转换回MyButton并获取索引;

MyButton mybtn = (MyButton)this;

答案 1 :(得分:1)

您可以尝试的一种方法是在创建按钮时在按钮上设置动作命令。 This java tutorial证明了这个概念更为详细。

在您的情况下,您可以这样设置:

final JButton iconButton = new JButton(icon);
iconButton.setActionCommand("some_unique_identifying_information");

您可以在actionPerformed回调中检索它,如下所示:

@Override
public void actionPerformed(ActionEvent e) {
    String actionCommand = iconButton.getActionCommand();
    // ... rest of method
}

请注意在iconButton上使用final。从代码的外观中,可以通过动作侦听器的闭包来访问触发事件的按钮。如果您愿意或不能使用上述方法,您可以像这样访问按钮:

@Override
public void actionPerformed(ActionEvent e) {
    JButton button = (JButton) e.getSource();
    String actionCommand = button.getActionCommand();
    // ... rest of method
}

与Christian在评论中的建议类似,如果您愿意,您可以维护Map或其他数据结构,其中您的唯一操作命令与图像相关。您的地图可能看起来像Map<String, ImpImage>(假设ImpImage是您图标的类别。)

或者,action命令可以是索引值的字符串表示形式。虽然必须以String形式存储,但是一旦通过getActionCommand()检索它,您就可以使用Integer.parseInt(String)将其解析为数字。