首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java组件显示图像网格

Java组件显示图像网格
EN

Stack Overflow用户
提问于 2014-10-06 11:16:29
回答 2查看 1.6K关注 0票数 0

我已经有一段时间没有构建桌面JAVA应用程序了。经过大量的文档和实现测试之后,我仍然没有找到映像网格解决方案

或者Java缺少这样一个现成的组件(?!)或者你叫我把我的google-fu刷干净。:)

我有一个非常简单的技术前提:一个允许用户选择图像的JDialog。输入是一个包含文件名的Map<Integer, String>列表。输出是用户选择的Integer键。GUI也很简单:用户使用鼠标或键盘选择1张图像,对话框就会关闭。所有图像都是从文件名加载的80x80px,而不是资源。

--我今天早上已经尝试了几种方法:

  • 搜索组件/小部件,这些组件/小部件显示可以向左流的可滚动图像。(无骰子)
  • 搜索显示可滚动图像的组件/小部件(没有骰子)
  • 搜索任何组件/小部件/gui-lib(没有骰子..。这些都存在吗?!)
  • 尝试并实现myJList.setModel(),但我不能让它只拿我的Map<>和显示缩略图。(太复杂了!)
  • 尝试用几个myJPanel.setlayout(new FlowLayout(..))实现myJPanel.add(new JButton(..)),它只是在JPanel上创建了一堆JButton,每个JButton都需要一个事件处理程序。我想知道滚动和键盘输入将如何工作,以及我应该如何保存/引用我的Map<>键值。(过于复杂?)

代替你的答案,我现在正在研究后者,这应该是可行的,但我不相信每个人都需要在这里重新发明相同的GUI车轮。如何让用户从我的Map<Integer, String>中选择图像?我是否应该寻找JAVA库/小部件/组件来避免这种情况?

我希望这不是被修改过的,我没有错误的工作实现给你们看..这个问题是关于如何/在哪里找到组件,或者什么方法会更好。2014年,我无法相信JAVA仍然需要我构建自己的"GUI组件“,只为了看到一些图像。就连德尔福和莫诺也不会这么做。

EN

回答 2

Stack Overflow用户

发布于 2014-10-06 11:28:56

如果您只需要一个图像网格,并且它们是可选择的,那么可以考虑使用一个JList,用适当的ImageIcons填充它,并给它一个ListSelectionListener。在侦听器中,您可以在选定内容完成后关闭封闭对话框。

你说:

尝试并实现myJList.setModel(),但我无法让它只使用我的Map<>并显示缩略图。(太复杂了!)

您需要使用映射来填充您的ListModel,并将该模型设置为JList的模型。

例如:

代码语言:javascript
复制
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();
      }

   }
}
票数 4
EN

Stack Overflow用户

发布于 2014-10-06 11:30:35

不,Java没有你想要的。

Java是一种通用的编程语言,不是工具集,尤其不是专门的桌面GUI工具集。这不是对语言的贬低,只是一种目的的陈述,而不是为了达到目的而发展起来的。

如果Delphi或Mono或其他任何东西都有您的特定小部件,那么我建议您使用它进行编程。这不是贬低你,只是一个观察,如果你不想把你想要的小部件从较低层次的组件和代码,那么Java不是正确的语言/工具,您可以使用它。

至于不相信Java“仍然需要”您构建自己的组件,我只能说您不能选择哪种语言提供哪些特性。我同样感到高兴的是,Java并没有随处可见您的组件,还有像您这样的人认为Java应该提供的数百个组件。它已经够大了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26215086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档