2014-10-06 39 views
0

自從我構建了一個桌面JAVA應用程序以來,它已經有一段時間了..在大量文檔和執行測試之後,我仍然沒有找到圖像網格解決方案展開圖像網格的Java swing組件

這兩種Java都沒有這樣的即用組件(?!),或者你告訴我刷新我的google-fu。 :)

我有一個非常簡單的技術前提:一個允許用戶選擇圖像的JDialog。輸入是一個包含文件名的Map<Integer, String>列表。輸出是用戶選擇的Integer密鑰。 GUI也很簡單:用戶使用鼠標或鍵盤選擇1個圖像,並關閉對話框。所有圖像都是80x80px,並從文件名加載,而不是資源。

  • 搜索組件/構件,以便顯示滾動imagegrid可以流動到左:

    今天上午我試圖幾種方法爲止。 (沒有骰子)

  • 搜索組件/構件,以便顯示滾動imagegrid(沒有骰子)
  • 搜索任何組件/部件/ GUI的庫(沒有骰子..做這些甚至還存在?)
  • 嘗試和實施myJList.setModel(),但我無法得到它只是拿我的地圖<>並顯示縮略圖。 (過於複雜!)
  • 嘗試並實施myJPanel.setlayout(new FlowLayout(..))與幾個myJPanel.add(new JButton(..)),它們只在JPanel上創建一堆JButton,每個JButton都需要一個事件處理程序。我不知道如何滾動和鍵盤輸入工作,以及我應該如何保持/參考我的Map<>關鍵值。 (過於複雜?)

代替你的答案,我現在正在研究後者,這應該工作,但我不相信每個人都需要重新發明相同的GUI輪子在這裏。如何讓用戶從我的Map<Integer, String>中選擇一個圖像?有沒有我應該看看以避免這種情況的JAVA庫/小部件/組件?

我希望這不會被改變下來,我沒有工作實現與錯誤向您展示..這個問題是關於如何/在哪裏可以找到組件或什麼方法會更好。它的2014年,我不相信JAVA仍然需要我建立自己的「GUI組件」,只是看到一些圖像..甚至沒有德爾福或莫諾這樣做。

+0

網格談論JTable,所有圖像都是80x80px,談論繪製一個圖標的渲染器的用法,seelction返回FileName,如果你想排序或過濾的地圖不是XxxTableModel的好陣列,在所有情況下(JList或JTable)使用基於util.List的數組,投票過於寬泛 – mKorbel 2014-10-06 11:28:32

回答

4

如果你想要的只是一個圖像的網格,並讓它們可選,可以考慮使用JList,填充適當的ImageIcons,並給它一個ListSelectionListener。在Listener中,您可以在選擇完成後關閉封閉對話框。

幽州:

嘗試並實現myJList.setModel(),但我不能得到它只是把我的地圖<>和顯示縮略圖。 (過於複雜!)

您需要使用您的Map來填充ListModel,並將該Model設置爲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(); 
     } 

    } 
} 
+0

謝謝你,我現在傾向於JList並進行調查。原來NetBeans生成的代碼讓我困惑。你的工作示例代碼正常工作,並且是值得的教程。會喜歡在互聯網上找到它。 :) 現在調查,連接到我的'Map '應該不難。 – 2014-10-06 13:17:28

1

沒有,Java沒有你想要的東西。

Java是一種通用編程語言,而不是工具集,特別是不是專門的桌面GUI工具集。這不是對語言的詆譭,只是對它沒有被開發完成的目的的陳述。

如果德爾福或單聲道或任何有你的特定的部件,那麼我建議你在那個程序,而不是。這不是對你的詆譭,只是一個觀察,即如果你不想把你想要的小部件從更低級別的組件和代碼中組合出來,那麼Java並不是你用來做這件事的正確語言/工具。至於不相信Java「仍然需要」你構建自己的組件,我只能說你不能選擇哪種語言提供哪些功能。我同樣很高興Java不會滿足於你的組件以及像你這樣的人會想到的數百個他們認爲Java應該提供的組件。它足夠大,因爲它是。