我想用saveDialog初始化一个帧,但是当使用这个chooser.showSaveDialog(this);
时,我收到一个错误:
public void initialize() {
JFrame frame = new JFrame();
Container content = frame.getContentPane();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Menu
JMenu menu = new JMenu("File");
menu.add(new AbstractAction("Make Image") {
public void actionPerformed(ActionEvent e) {
JFileChooser chooser = new JFileChooser();
int option = chooser.showSaveDialog(this);
if(option == JFileChooser.APPROVE_OPTION) {
File file = chooser.getSelectedFile();
writeJPEGImage(file);
}
}});
JPopupMenu.setDefaultLightWeightPopupEnabled(false);
JMenuBar menuBar = new JMenuBar();
menuBar.add(menu);
frame.setJMenuBar(menuBar);
content.add(tree);
frame.pack();
frame.setVisible(true);
}
错误:
JFileChooser类型中的方法showSaveDialog(Component)不是 适用于arguments()
我知道这个方法通常会得到一个Component,但是我的类中没有,因为我在这个方法中加载它。
有任何建议如何解决?
感谢您的回答!
PS。: new Test()
确实有效,但我必须给它当前的组件!
答案 0 :(得分:5)
您可以使用已创建的帧变量作为参数或内容变量。
int option = chooser.showSaveDialog(frame);
或
int option = chooser.showSaveDialog(content);
此外,您必须将它们定义为final,以便能够从您的匿名类访问它们:
final JFrame frame = new JFrame();
或
final Container content = frame.getContentPane();
答案 1 :(得分:2)
第一个参数应该是它所在的父组件/窗口,JFrame最像。但是this
引用了一个匿名的AbstractAction子类。
如果代码在框架类中,请使用null,或使用类名this
:
int option = chooser.showSaveDialog(MyFrame.this);
答案 2 :(得分:1)
在此背景下......
new AbstractAction("Make Image") {
public void actionPerformed(ActionEvent e) {
int option = chooser.showSaveDialog(this);
this
指的是AbstractAction
。
相反,您最有可能想要使用父组件引用。
int option = chooser.showSaveDialog(frame);
由于您已将frame
创建为本地变量,因此您需要将其设为final
final JFrame frame = new JFrame();