我已经有一段时间没有构建桌面JAVA应用程序了。经过大量的文档和实现测试之后,我仍然没有找到映像网格解决方案。
或者Java缺少这样一个现成的组件(?!)或者你叫我把我的google-fu刷干净。:)
我有一个非常简单的技术前提:一个允许用户选择图像的JDialog。输入是一个包含文件名的Map<Integer, String>列表。输出是用户选择的Integer键。GUI也很简单:用户使用鼠标或键盘选择1张图像,对话框就会关闭。所有图像都是从文件名加载的80x80px,而不是资源。
--我今天早上已经尝试了几种方法:
myJList.setModel(),但我不能让它只拿我的Map<>和显示缩略图。(太复杂了!)myJPanel.setlayout(new FlowLayout(..))实现myJPanel.add(new JButton(..)),它只是在JPanel上创建了一堆JButton,每个JButton都需要一个事件处理程序。我想知道滚动和键盘输入将如何工作,以及我应该如何保存/引用我的Map<>键值。(过于复杂?)代替你的答案,我现在正在研究后者,这应该是可行的,但我不相信每个人都需要在这里重新发明相同的GUI车轮。如何让用户从我的Map<Integer, String>中选择图像?我是否应该寻找JAVA库/小部件/组件来避免这种情况?
我希望这不是被修改过的,我没有错误的工作实现给你们看..这个问题是关于如何/在哪里找到组件,或者什么方法会更好。2014年,我无法相信JAVA仍然需要我构建自己的"GUI组件“,只为了看到一些图像。就连德尔福和莫诺也不会这么做。
发布于 2014-10-06 11:28:56
如果您只需要一个图像网格,并且它们是可选择的,那么可以考虑使用一个JList,用适当的ImageIcons填充它,并给它一个ListSelectionListener。在侦听器中,您可以在选定内容完成后关闭封闭对话框。
你说:
尝试并实现myJList.setModel(),但我无法让它只使用我的Map<>并显示缩略图。(太复杂了!)
您需要使用映射来填充您的ListModel,并将该模型设置为JList的模型。
例如:
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dialog.ModalityType;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
@SuppressWarnings("serial")
public class ImageGridPanel extends JPanel {
public static final String PATH = "http://images-2.drive.com.au/2011/";
public static final String[] CARS = {
"04/15/2308961/giulietta_1024-80x80.jpg",
"11/18/2781958/audi-a1-sportback_600-80x80.jpg",
"12/23/2856762/fiat-500-80x80.jpg",
"01/12/2129944/Honda-Civic-Sedan-concept-1_600-80x80.jpg",
"12/23/2856581/mini-roadster-80x80.jpg",
"12/23/2856571/hyundai-veloster-80x80.jpg",
"12/23/2856771/hyundai-i30-80x80.jpg",
"12/23/2856580/mini-coupe-80x80.jpg" };
private DefaultListModel<Car> carModel = new DefaultListModel<>();
final JTextField textField = new JTextField(20);
public ImageGridPanel() {
for (String carPath : CARS) {
String path = PATH + carPath;
try {
URL imgUrl = new URL(path);
BufferedImage img = ImageIO.read(imgUrl);
ImageIcon icon = new ImageIcon(img);
String name = carPath.substring(carPath.lastIndexOf("/"));
name = name.substring(1, name.lastIndexOf("-"));
carModel.addElement(new Car(name, icon));
} catch (IOException e) {
e.printStackTrace();
System.exit(-1);
}
}
ShowGridAction showAction = new ShowGridAction("Car Grid", carModel);
JButton showGridBtn = new JButton(showAction);
add(showGridBtn);
add(textField);
}
private class ShowGridAction extends AbstractAction {
private CarGridPanel carGridPanel;
public ShowGridAction(String name, DefaultListModel<Car> carModel) {
super(name);
carGridPanel = new CarGridPanel(carModel);
}
public CarGridPanel getCarGridPanel() {
return carGridPanel;
}
@Override
public void actionPerformed(ActionEvent e) {
Window win = SwingUtilities.getWindowAncestor((Component) e.getSource());
JDialog dialog = new JDialog(win, "Cars", ModalityType.APPLICATION_MODAL);
dialog.add(carGridPanel);
dialog.pack();
dialog.setLocationRelativeTo(null);
int x = dialog.getLocation().x;
int y = dialog.getLocation().y - 150;
dialog.setLocation(x, y);
dialog.setVisible(true);
Car selectedCar = carGridPanel.getSelectedCar();
if (selectedCar != null) {
textField.setText(selectedCar.getName());
}
}
}
private static void createAndShowGui() {
JFrame frame = new JFrame("ImageGrid");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new ImageGridPanel());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
class Car {
String name;
Icon icon;
public Car(String name, Icon icon) {
this.name = name;
this.icon = icon;
}
public String getName() {
return name;
}
public Icon getIcon() {
return icon;
}
}
@SuppressWarnings("serial")
class CarGridPanel extends JPanel {
private JList<Car> carList = new JList<>();
private Car selectedCar;
public CarGridPanel(ListModel<Car> model) {
carList.setModel(model);
carList.setLayoutOrientation(JList.HORIZONTAL_WRAP);
carList.setVisibleRowCount(2);
carList.setCellRenderer(new DefaultListCellRenderer() {
@Override
public Component getListCellRendererComponent(JList<?> list,
Object value, int index, boolean isSelected, boolean cellHasFocus) {
if (value != null) {
Car carValue = (Car) value;
value = carValue.getIcon();
} else {
value = "";
}
return super.getListCellRendererComponent(list, value, index,
isSelected, cellHasFocus);
}
});
setLayout(new BorderLayout());
add(new JScrollPane(carList));
carList.addListSelectionListener(new ListListener());
}
public Car getSelectedCar() {
return selectedCar;
}
private class ListListener implements ListSelectionListener {
@Override
public void valueChanged(ListSelectionEvent e) {
selectedCar = carList.getSelectedValue();
Window win = SwingUtilities.getWindowAncestor(CarGridPanel.this);
win.dispose();
}
}
}发布于 2014-10-06 11:30:35
不,Java没有你想要的。
Java是一种通用的编程语言,不是工具集,尤其不是专门的桌面GUI工具集。这不是对语言的贬低,只是一种目的的陈述,而不是为了达到目的而发展起来的。
如果Delphi或Mono或其他任何东西都有您的特定小部件,那么我建议您使用它进行编程。这不是贬低你,只是一个观察,如果你不想把你想要的小部件从较低层次的组件和代码,那么Java不是正确的语言/工具,您可以使用它。
至于不相信Java“仍然需要”您构建自己的组件,我只能说您不能选择哪种语言提供哪些特性。我同样感到高兴的是,Java并没有随处可见您的组件,还有像您这样的人认为Java应该提供的数百个组件。它已经够大了。
https://stackoverflow.com/questions/26215086
复制相似问题