0

我的意图是将 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);     
                      }
                 }

如果有人可以帮助我解决这个问题,那将非常有帮助。

4

2 回答 2

1

您遇到的问题是ListModelJList为您创建的不支持更改。您需要创建一个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);
        }
    });
}
于 2012-04-07T19:28:11.917 回答
0

JFileChooser是一个JComponent 因此您只需其添加到具有BorderLayout的JPanel中,它将填满整个面板。

于 2012-04-07T18:51:04.340 回答