2012-04-07 228 views
0

我的意圖是將JFileChooser嵌入到其他組件中,例如,可以選擇一個文件並單擊「添加」按鈕,以便將文件添加到JList中(在運行時)。我已經以這種形式創建了一個例子GUI:在另一個組件中嵌入JFileChooser

GUI

我無法創建JFileChooser中和的JList之間的聯繫。任何人都可以幫忙嗎?

您還可以看看我曾嘗試:

 public Converter() { 
    setForeground(Color.BLACK); 
    getContentPane().setLayout(null); 

    textField = new JTextField(); 
    textField.setBounds(20, 12, 714, 20); 
    getContentPane().add(textField); 
    textField.setColumns(10); 

    final JScrollPane scrollPane = new JScrollPane(); 
    setTitle("ABC"); 
    scrollPane.setBounds(0, 470, 766, -438); 
    getContentPane().add(scrollPane); 

    list = new JList(); 
    list.setBackground(Color.LIGHT_GRAY); 
    list.setForeground(Color.GRAY); 

    vector = new Vector<File>(); 
    field = new JTextField(); 

    final JFileChooser fileChooser = new JFileChooser(); 
    fileChooser.setBounds(10, 43, 485, 463); 
    getContentPane().add(fileChooser); 


    list = new JList(vector); 
    list.setBackground(Color.LIGHT_GRAY); 

    JButton btnNewButton = new JButton("ADD"); 
    btnNewButton.setBounds(505, 106, 89, 23); 
    btnNewButton.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
       add(); 
     } 

     private void add() { 
      // TODO Auto-generated method stub 

       { 
        for (File file : fileChooser.getSelectedFiles()) { 
         field.setText(file.getAbsolutePath()); 
         vector.add(file); 
         System.out.println("Added..!!"); 
       } 
       //list.updateUI(); 
       } 
      } 
    }); 
    getContentPane().add(btnNewButton); 


    JButton btnNewButton_1 = new JButton("REMOVE"); 
    btnNewButton_1.setBounds(505, 190, 89, 23); 
    btnNewButton_1.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent e) { 
       remove(); 
       } 

     private void remove() { 
      if(list.getSelectedIndices().length > 0) { 
        int[] selectedIndices = list.getSelectedIndices(); 
        for (int i = selectedIndices.length-1; i >=0; i--) { 
         vector.removeElementAt(i); 
         System.out.println("Removed..!!"); 
        } 
        } 
        list.updateUI(); 

     } 
     }); 
    getContentPane().add(btnNewButton_1); 

    JButton btnNewButton_2 = new JButton("DECODE"); 
    btnNewButton_2.setBounds(505, 278, 89, 23); 

    getContentPane().add(btnNewButton_2); 

    JList list_1 = new JList(); 
    list_1.setForeground(Color.BLACK); 
    list_1.setBackground(Color.LIGHT_GRAY); 
    list_1.setBounds(604, 109, 162, 328); 
    getContentPane().add(list_1); 

    final JFrame Jframe = new JFrame(); 
    Jframe.setFont(new Font("Arial", Font.BOLD, 14)); 
    Jframe.setForeground(Color.WHITE); 
    Jframe.setTitle("Additional Loader Information"); 
    Jframe.getContentPane().setLayout(null); 

}  

static class PreviewPane extends JPanel implements PropertyChangeListener { 
    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    private JLabel label; 
    private int maxImgWidth; 
    public PreviewPane() { 
     setLayout(new BorderLayout(5,5)); 
     setBorder(BorderFactory.createEmptyBorder(5,5,5,5)); 
     add(new JLabel("Preview:"), BorderLayout.NORTH); 
     label = new JLabel(); 
     label.setBackground(Color.WHITE); 
     label.setOpaque(true); 
     label.setPreferredSize(new Dimension(200, 200)); 
     maxImgWidth = 195; 
     label.setBorder(BorderFactory.createEtchedBorder()); 
     add(label, BorderLayout.CENTER); 
    } 

    public void propertyChange(PropertyChangeEvent evt) { 
     Icon icon = null; 
     if(JFileChooser.SELECTED_FILE_CHANGED_PROPERTY.equals(evt 
       .getPropertyName())) { 
      File newFile = (File) evt.getNewValue(); 
      if(newFile != null) { 
       String path = newFile.getAbsolutePath(); 
       if(path.endsWith(".gif") || path.endsWith(".jpg")                
          || path.endsWith(".png") || path.endsWith(".bmp")) { 
        try { 
         BufferedImage img = 
              ImageIO.read(newFile); 
         float width = img.getWidth(); 
         float height = img.getHeight(); 
         float scale = height/width; 
         width = maxImgWidth; 
         height = (width * scale); 
              // height should be scaled from new width        

        } 
        catch(IOException e) { 
         // couldn't read image. 
        } 
       } 
      } 

      label.setIcon(icon); 
      this.repaint(); 

     } 
        } 

       } 

       public static void main(String args[]) {   
        // Create an instance of the test application   
         Converter frame = new Converter();   
         frame.pack();  
          frame.setVisible(true);  
         } 
       } 

這將是真正有用的,如果有人可以幫助我與此有關。

+0

如何你無法創建鏈接?你是否遇到錯誤,異常或意外行爲?請更徹底地描述你的問題。此外,創建[SSCCE](http://sscce.org)將是一個巨大的幫助。 – Jeffrey 2012-04-07 18:56:37

+0

嗨,它只是不起作用。我沒有收到任何錯誤,但是當我單擊按鈕時沒有發生任何操作,並且這完全不起作用:( – dmurali 2012-04-07 19:00:03

+0

對您的代碼進行窺視:'新的JList(fileChooser)'(第一行)應該拋出請考慮製作一個[SSCCE](http://sscce.org),或者在最低限度發佈更多的代碼。 – Jeffrey 2012-04-07 19:06:37

回答

1

您遇到的問題是您的JListListModel正在爲您創建不支持更改。您需要創建DefaultListModel並使用該代替Vector

例:

public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      final DefaultListModel<String> model = new DefaultListModel<>(); 
      JList<String> list = new JList<>(model); 

      JButton add = new JButton("Click Me!"); 
      add.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        model.addElement(model.getSize() + ""); 
       } 
      }); 

      JPanel p = new JPanel(); 
      p.add(new JScrollPane(list)); 
      p.add(add); 

      JFrame frame = new JFrame("Example"); 
      frame.setContentPane(p); 
      frame.pack(); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.setVisible(true); 
     } 
    }); 
} 
+0

非常感謝這個提示..!但是,問題在於將JFileChooser與此DeafaultListModel一起集成。 – dmurali 2012-04-07 19:51:46

+0

您有什麼問題?您的添加按鈕看起來正確。只需添加到'DefaultListModel'而不是'Vector'。 – Jeffrey 2012-04-07 19:53:02

+0

'JButton add = new JButton(「ADD」); \t add.addActionListener(新的ActionListener(){ \t @覆蓋 \t公共無效的actionPerformed(ActionEvent的五){ \t \t { \t \t \t \t \t \t的(文件文件:fileChooser.getSelectedFiles()){ \t \t model.addElement(model。getElementAt(0)+「file」); \t System.out.println(「Added .. !!」); \t} \t \t } \t} \t});」 – dmurali 2012-04-07 20:31:04

0

一個JFileChooserJComponent,所以你可以add它與BorderLayout一個JPanel,它會佔滿整個面板。

+0

這是如何回答OP的問題? – Jeffrey 2012-04-07 18:54:17

+0

但是,通過邊界佈局,這些按鈕不會出現這種方式?我已經嘗試過使用borderlayout並將其添加到Jpanel中,但問題在於,當我單擊按鈕時,filechooser會打開,用戶將不得不從中選擇它。一種當我執行c時的方式噢,JFilechooser應該已經打開了(就像它在圖中那樣).. !! – dmurali 2012-04-07 18:54:45

+0

然後你不想在你的組件中嵌入JFileChooser。 – Dave 2012-04-07 18:56:24

相關問題