我通常不编写Java GUI应用程序,但是我需要一个简单的实用程序,并且设法使用Swing和AWT编写了它。该实用程序需要打开和保存文件,并且主要在Macos上使用。 Apple recommends使用AWT的FileDialog
而不是Swing文件选择器,因为FileDialog
的行为更像是本机Macos文件对话框。这就是我所做的。
完成的实用程序工作正常,除了一件事我无法解决。用于保存文件的对话框包括一个用于输入文件名的文本框。右键单击文本框将显示一个带有复制和粘贴选项的菜单。但是相关的击键(Cmd-C,Cmd-V)什么也没做。
以下程序演示了该问题:
import java.awt.BorderLayout;
import java.awt.FileDialog;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class Scratch extends JPanel implements ActionListener {
private static final long serialVersionUID = 1L;
JButton saveButton;
FileDialog fd;
public Scratch(Frame aFrame) {
super(new BorderLayout());
fd = new FileDialog(aFrame, "Save", FileDialog.SAVE);
saveButton = new JButton("Save a File...");
saveButton.addActionListener(this);
this.add(saveButton);
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == saveButton) {
fd.setVisible(true);
String file = fd.getFile();
System.out.println(file);
}
}
private static void createAndShowGUI() {
JFrame frame = new JFrame("Scratch");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new Scratch(frame));
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
运行时,它会打开一个带有保存按钮的窗口。单击该按钮将打开一个带有“另存为”字段的FileDialog。您可以在该字段中键入内容,也可以右键单击该字段,然后从弹出菜单中选择“复制”或“粘贴”。但是您不能使用Cmd-V粘贴到该字段中-复制或粘贴操作似乎没有任何击键。
是否有直接方法将击键绑定到FileDialog
内的文件名框中?
答案 0 :(得分:0)
AWT FileDialog(至少在MacOS的Java 8下)最终调用CFileDialog. nativeRunFileDialog()以显示实际对话框。传递给此方法的参数似乎没有包含可用于将击键附加到保存对话框的文件名字段的任何内容。
我的结论是,没有合理的方法来更改FileDialog来向save选项添加击键。我已经在应用程序中恢复到Swing JFileChooser。