java GUI中JFileChooser的问题

时间:2014-02-18 16:33:39

标签: java swing

我正在尝试将JFileChooser添加到JPanel。有时它工作正常,有时它只显示没有JFileChooser对话框的JPanel。现在我实际上不知道该怎么做。有人可以帮帮我吗?

这是我的代码(这是一种方法):

public  File chooseFileFromComputer(){

    methodPanel = new JPanel();
    methodPanel.setLayout(null);


    methodFrame = new JFrame();
    methodFrame.setTitle("File Chooser");
    methodFrame.setVisible(true);

    BufferedImage removeJavaImage = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
    methodFrame.setIconImage(removeJavaImage);

    methodLabel = new JLabel("Choose a file: ");
    methodLabel.setBounds(10, 10, 80, 20);
    methodPanel.add(methodLabel);

    fileChooser = new JFileChooser();
    fileChooser.setMultiSelectionEnabled(false);
    fileChooser.setBounds(10, 35, 550, 500 );
    fileChooser.setVisible(true);
    add(fileChooser);
       /**
     * Action Events                                                    #********AE*******#
    **/

    fileChooser.addActionListener( new ActionListener(){
        public void actionPerformed(ActionEvent actionEvent) {
            String command = actionEvent.getActionCommand();
        if (command.equals(JFileChooser.APPROVE_SELECTION)) {
           selectedFile = fileChooser.getSelectedFile();
           methodFrame.setVisible(false);     
        }  else if (command.equals(JFileChooser.CANCEL_SELECTION)) {
            methodFrame.setVisible(false);
        }
      }
    });

    //End of Action Events                                              #________AE_______#


    methodPanel.add(fileChooser);
    methodFrame.setContentPane(methodPanel);
    methodFrame.setResizable(false);
    methodFrame.setSize(600, 600);
    methodFrame.setDefaultCloseOperation(EXIT_ON_CLOSE);

    return selectedFile;
} 

3 个答案:

答案 0 :(得分:3)

  1. 您正在使用null布局并在组件上调用setBounds(...)。虽然这似乎是新手创建复杂GUI的更好方法,但这是一个谬论,你创建Swing GUI的次数越多,你学会尊重和使用布局管理器就越多,并且看到这些生物在创造灵活,美丽和创造方面有很大帮助。需要,复杂的GUI。
  2. 将您的组件添加到JFrame,然后只在JFrame上调用setVisible(true)
  3. 如果您将其设置为可见且不可见,则看起来您根本不应该使用JFrame。也许你真的想要使用JDialog甚至是一个独立的JFileChooser对话框。

  4. 修改
    您正在将JFileChooser添加到多个容器中:

      add(fileChooser); // ******************* here *************
    
      fileChooser.addActionListener( new ActionListener(){
          private File selectedFile;
    
         public void actionPerformed(ActionEvent actionEvent) {
              String command = actionEvent.getActionCommand();
          if (command.equals(JFileChooser.APPROVE_SELECTION)) {
             selectedFile = fileChooser.getSelectedFile();
             methodFrame.setVisible(false);     
          }  else if (command.equals(JFileChooser.CANCEL_SELECTION)) {
              methodFrame.setVisible(false);
          }
        }
      });
    
      methodPanel.add(fileChooser); // ******** here *******
    

    你不能这样做。只将其添加到 一个 容器中,否则它可能无法正确显示或显示。


    修改2

    您从方法中返回错误的结果。您返回selectedFile变量,但在设置之前执行此操作,因为它是由ActionListener设置的,在此方法返回后调用long

    解决方案:再次,不要在这里使用模式JDialog可以更好地工作的JFrame。如果你使用了一个模态对话框并在之后返回,那么ActionListener就完成了,你的代码就可以了。


    编辑3
    但是对于我的钱,我只是使用JFileChooser作为模态对话框。例如:

      JFileChooser fileChooser = new JFileChooser();
      fileChooser.setDialogTitle("Choose a File");
    
      // don't use null in the method below but rather a reference to your current GUI
      int response = fileChooser.showOpenDialog(null);
      if (response == JFileChooser.APPROVE_OPTION) {
         File file = fileChooser.getSelectedFile();
         System.out.println(file);
      }
    

答案 1 :(得分:0)

您的JPanel - methodPanel的布局为空methodPanel.setLayout(null);,例如使用FlowLayout

答案 2 :(得分:0)

我不知道你的类是否扩展了jpanel,但你应该将filechooser与label一起添加到methodPanel。我测试你的代码是正常的,除了actionPerform。

methodPanel.add(fielChooser);

我建议,试一试。