我的程序当前将一个图像添加到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。问题是我没有将按钮存储在列表中,因此它不知道列表中各自图像的编号。
答案 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)
将其解析为数字。