2013-02-25 2 views
2

Я пишу GUI в Swing, где я хочу сделать выбора файлов, который находится в главном окне, глядя что-то, как на картинке ниже:Выбор файла в-панели с Свинг

enter image description here

в то время как, кажется, довольно много учебников о том, как написать всплывающий файл-выбор, я не вижу много информации о том, как этот тип выбора может быть выполнен в swing.

также жаль, если это было предложено ранее, я сделал хороший немного поиска вокруг и wan't в состоянии найти что-нибудь еще ..

ответ

2

JFileChooser фактически расширяет JComponent, так что вы можете использовать, как и любой другой компонент. Вот пример с двумя в-панелью файл функция выбор:

public class TestInPaneChoosers { 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       buildFrame(); 
      } 
     }); 
    } 

    private static void buildFrame() { 
     JFrame f = new JFrame("Test"); 
     f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 

     f.setLayout(new FlowLayout()); 

     f.add(new JFileChooser()); 
     f.add(new JFileChooser()); 

     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 
} 
+0

ах действительно, самый превосходный! однако это не позволяет просматривать панорамирование, которое было у меня на изображении, которое я разместил ранее. это просто невозможность с Swing/AWT? –

+0

Это не невозможно, в Swing вы можете написать свои собственные компоненты. Однако это было бы непросто. – lbalazscs

+0

Да, это звучит как кошмар. Спасибо за вашу помощь! –

5

PanelBrowser, как показано ниже, является основным прототипом, который функционирует аналогично виду по Mac OS X Finder колонка, показанные на ваш вопрос.

PanelBrowser

Обновление: Добавлен горизонтальный скроллинг и больше информации о файле.

import java.awt.Color; 
import java.awt.Component; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.GridLayout; 
import java.io.File; 
import java.text.DateFormat; 
import java.util.ArrayList; 
import java.util.Date; 
import java.util.List; 
import javax.swing.Box; 
import javax.swing.BoxLayout; 
import javax.swing.DefaultListCellRenderer; 
import javax.swing.DefaultListModel; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JList; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.ListSelectionModel; 
import javax.swing.event.ListSelectionEvent; 
import javax.swing.event.ListSelectionListener; 
import javax.swing.filechooser.FileSystemView; 

/** 
* @see http://stackoverflow.com/a/15104660/230513 
*/ 
public class PanelBrowser extends Box { 

    private static final Dimension SIZE = new Dimension(200, 300); 
    private List<FilePanel> list = new ArrayList<FilePanel>(); 

    public PanelBrowser(File root) { 
     super(BoxLayout.LINE_AXIS); 
     setBackground(Color.red); 
     FilePanel panel = new FilePanel(this, root); 
     list.add(panel); 
     this.add(panel); 
    } 

    private void update(FilePanel fp, File file) { 
     int index = list.indexOf(fp); 
     int i = list.size() - 1; 
     while (i > index) { 
      list.remove(i); 
      this.remove(i); 
      i--; 
     } 
     final FilePanel panel = new FilePanel(this, file); 
     list.add(panel); 
     this.add(panel); 
     revalidate(); 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       scrollRectToVisible(panel.getBounds()); 
      } 
     }); 
    } 

    private static class FilePanel extends Box { 

     private static FileSystemView fsv = FileSystemView.getFileSystemView(); 
     private static DateFormat df = DateFormat.getDateTimeInstance(
      DateFormat.SHORT, DateFormat.DEFAULT); 
     private PanelBrowser parent; 
     private JList list; 

     public FilePanel(PanelBrowser parent, File file) { 
      super(BoxLayout.PAGE_AXIS); 
      this.parent = parent; 
      DefaultListModel model = new DefaultListModel(); 
      if (file.isFile()) { 
       JLabel name = new JLabel(file.getName()); 
       name.setIcon(fsv.getSystemIcon(file)); 
       this.add(name); 
       Date d = new Date(file.lastModified()); 
       JLabel mod = new JLabel("Date: " + df.format(d)); 
       this.add(mod); 
       final String v = String.valueOf(file.length()); 
       JLabel length = new JLabel("Size: " + v); 
       this.add(length); 
      } 
      if (file.isDirectory()) { 
       for (File f : file.listFiles()) { 
        model.addElement(f); 
       } 
       list = new JList(model); 
       list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
       list.setCellRenderer(new FileRenderer()); 
       list.addListSelectionListener(new SelectionHandler()); 
       this.add(new JScrollPane(list) { 
        @Override 
        public int getVerticalScrollBarPolicy() { 
         return JScrollPane.VERTICAL_SCROLLBAR_ALWAYS; 
        } 
       }); 
      } 
     } 

     private static class FileRenderer extends DefaultListCellRenderer { 

      @Override 
      public Component getListCellRendererComponent(JList list, Object value, 
       int index, boolean isSelected, boolean cellHasFocus) { 
       JLabel label = (JLabel) super.getListCellRendererComponent(
        list, value, index, isSelected, cellHasFocus); 
       File f = (File) value; 
       setText(f.getName()); 
       setIcon(fsv.getSystemIcon(f)); 
       return label; 
      } 
     } 

     private class SelectionHandler implements ListSelectionListener { 

      @Override 
      public void valueChanged(ListSelectionEvent e) { 
       if (!e.getValueIsAdjusting()) { 
        File f = (File) list.getSelectedValue(); 
        parent.update(FilePanel.this, f); 
       } 
      } 
     } 

     @Override 
     public Dimension getMinimumSize() { 
      return new Dimension(SIZE); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(SIZE); 
     } 

     @Override 
     public Dimension getMaximumSize() { 
      return new Dimension(SIZE.width, Short.MAX_VALUE); 
     } 
    } 

    private static void display() { 
     String path = System.getProperty("user.dir"); 
     PanelBrowser browser = new PanelBrowser(new File(path)); 
     JFrame f = new JFrame(path); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(new JScrollPane(browser) { 
      @Override 
      public int getVerticalScrollBarPolicy() { 
       return JScrollPane.VERTICAL_SCROLLBAR_NEVER; 
      } 
     }); 
     f.pack(); 
     f.setSize(4 * SIZE.width, SIZE.height); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       display(); 
      } 
     }); 
    } 
} 
+0

См. Также [* GUI файла браузера *] (http://codereview.stackexchange.com/q/4446/6692). – trashgod

+0

Отличный код! Как я уже сказал в комментариях к моему ответу, написать такой компонент непросто, но похоже, что это было легко для вас :). Должен быть репозиторий таких компонентов ... – lbalazscs

+0

@lbalazscs: Это всего лишь прототип , не имея большой функциональности 'JFileChooser'. – trashgod