简体   繁体   English

在另一个组件中嵌入 JFileChooser

[英]Embed JFileChooser in another component

My intention is to embed the JFileChooser in an other component, for instance, one can choose a file and click the "add" button, so that the file gets added to the JList(during run-time).I have created an example GUI in this form:我的目的是将 JFileChooser 嵌入到另一个组件中,例如,可以选择一个文件并单击“添加”按钮,以便将文件添加到 JList(在运行时)。我创建了一个示例 GUI以这种形式:

图形用户界面

I am unable to create a link between the JFileChooser and JList.我无法在 JFileChooser 和 JList 之间创建链接。 Can anybody help?有人可以帮忙吗?

You can also see what I have tried:您还可以看到我尝试过的内容:

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

It would be really helpful if somebody could help me out with this.如果有人可以帮助我解决这个问题,那将非常有帮助。

The problem you are running into is that the ListModel your JList is creating for you does not support changes.您遇到的问题是您的JList为您创建的ListModel不支持更改。 You need to create a DefaultListModel and use that instead of your Vector .您需要创建一个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);
        }
    });
}

A JFileChooser is a JComponent , so you can just add it to a JPanel with BorderLayout and it will fill the whole panel. JFileChooser是一个JComponent ,因此您只需它添加到带有BorderLayoutJPanel中,它就会填满整个面板。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM