我正在尝试将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;
}
答案 0 :(得分:3)
setBounds(...)
。虽然这似乎是新手创建复杂GUI的更好方法,但这是一个谬论,你创建Swing GUI的次数越多,你学会尊重和使用布局管理器就越多,并且看到这些生物在创造灵活,美丽和创造方面有很大帮助。需要,复杂的GUI。 setVisible(true)
。 修改强>
您正在将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);
我建议,试一试。