Встроить JFileChooser в другой компонент

Мое намерение состоит в том, чтобы встроить JFileChooser в другой компонент, например, можно выбрать файл и нажать кнопку «Добавить», чтобы файл был добавлен в JList (во время выполнения). Я создал пример графического интерфейса в этой форме:

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);     
                      }
                 }

Было бы очень полезно, если бы кто-нибудь помог мне с этим.


person dmurali    schedule 07.04.2012    source источник
comment
Как вы не можете создать ссылку? Вы получаете ошибки, исключения или просто неожиданное поведение? Пожалуйста, опишите вашу проблему более подробно. Кроме того, создание SSCCE было бы огромным подспорьем.   -  person Jeffrey    schedule 07.04.2012
comment
Привет, это просто не работает. Я не получаю никаких ошибок, но когда я нажимаю кнопку, никаких действий не происходит, и это вообще не работает :(   -  person dmurali    schedule 07.04.2012
comment
Взгляните на ваш код: new JList(fileChooser) (первая строка) должна вызывать ошибку. Рассмотрите возможность создания SSCCE или, как минимум, опубликуйте больше своего кода.   -  person Jeffrey    schedule 07.04.2012
comment
Да, это была ошибка, после чего я изменил его на просто новый JList(). Делая это, я не получаю никаких ошибок, но ничего не происходит.   -  person dmurali    schedule 07.04.2012
comment
Кроме того, я добавил полный код..!!   -  person dmurali    schedule 07.04.2012


Ответы (2)


Проблема, с которой вы столкнулись, заключается в том, что ListModel, который создает для вас ваш JList, не поддерживает изменения. Вам нужно создать DefaultListModel и использовать его вместо Vector.

Ex:

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);
        }
    });
}
person Jeffrey    schedule 07.04.2012
comment
Большое спасибо за эту подсказку ..! Но опять же, проблема заключается в интеграции JFileChooser вместе с этой DeafaultListModel. - person dmurali; 07.04.2012
comment
Какие у вас проблемы? Ваша кнопка добавления выглядела правильно. Просто добавьте к DefaultListModel вместо Vector. - person Jeffrey; 07.04.2012
comment
'JButton add = new JButton(ADD); add.addActionListener (новый ActionListener () { @Override public void actionPerformed (ActionEvent e) { { for (File file: fileChooser.getSelectedFiles ()) { model.addElement (model.getElementAt (0) + файл); System.out. println(Добавлено..!!); } } } });' - person dmurali; 08.04.2012
comment
@dmurali Если вы хотите сохранить File в своем ListModel, объявите его как DefaultListModel<File>. Тогда вы можете просто позвонить model.addElement(file). - person Jeffrey; 08.04.2012
comment
Я только что понял, что не могу указать «DefaultListModel‹File›» в своем коде, поскольку он не принимает никаких аргументов, кроме DefaultListModel. Следовательно, я не могу правильно интегрировать его :( - person dmurali; 09.04.2012
comment
Ааа... я использую java6 в настоящее время... может быть, я скачаю java7 прямо сейчас и попробую еще раз.! Спасибо за ваш быстрый ответ..!! - person dmurali; 09.04.2012

JFileChooser – это JComponent, поэтому вы можете просто добавить его в JPanel с BorderLayout и заполнит всю панель.

person Dave    schedule 07.04.2012
comment
Как это отвечает на вопрос ОП? - person Jeffrey; 07.04.2012
comment
Но с макетом границы эти кнопки не будут отображаться таким образом, верно? я уже пытался сделать это с помощью borderlayout и добавив его в Jpanel, но тогда проблема будет заключаться в том, что когда я нажимаю кнопку, открывается средство выбора файлов, и пользователю приходится выбирать из него. Но я хочу, чтобы при выполнении кода JFilechooser уже был открыт (как на рисунке) !! - person dmurali; 07.04.2012
comment
Тогда вы не хотите, чтобы JFileChooser был встроен в ваш компонент. - person Dave; 07.04.2012
comment
Да, я также хочу встроить JFileChooser в JList, добавив между ними несколько кнопок. - person dmurali; 07.04.2012