【发布时间】:2019-06-25 15:52:20
【问题描述】:
我正在尝试遵循一些基于 Java Preferences API 的演示代码,但我得到了奇怪的方法未找到与 setDefaultCloseOperation(int) 和 setJMenuBar(JMenuBar) 相关的错误。此示例程序来自 Cay S. Horstman 的 Core Java, Volume I - Fundamentals, 11th Edition 第 796-799 页。
对于看似微不足道的错误,我深表歉意,但我一直在为应该是一个简单的解决方案而摸不着头脑。重现该问题需要整个文件,因为如果遗漏部分文件,可能会出现除上述之外的其他编译错误。
我已经尝试了以下方法。
- 重新排列导入并调用特定导入而不是通配符
.*。 - 多次检查方法的拼写。
- 使用在线编译器 (https://www.tutorialspoint.com/compile_java_online.php) 在不同的 JDK 上运行,以隔离本地机器问题(例如,
JDK 1.8_202与较旧/从未使用过的 JDK 版本)。 - 查看文档以了解这些方法属于哪些类。
- 检查了方法参数以检查没有类型错误。
PreferencesFrame.java
import java.awt.*;
import java.io.*;
import java.util.prefs.*;
import javax.swing.*;
import javax.swing.filechooser.*;
/** A program to test preference settings. The program remembers the frame position, size, and title. **/
public class PreferencesTest {
public static void main(String[] args) {
EventQueue.invokeLater(() -> {
PreferencesFrame frame = new PreferencesFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
});
}
}
/** A frame that restores position and size from user preferences and updates the preferences upon exit. **/
class PreferencesFrame extends Frame {
private static final int DEFAULT_WIDTH = 300;
private static final int DEFAULT_HEIGHT = 200;
private Preferences root = Preferences.userRoot();
private Preferences node = root.node("/com/horstmann/corejava");
public PreferencesFrame() {
// Get position, size, and title from preferences.
int left = node.getInt("left", 0);
int top = node.getInt("top", 0);
int width = node.getInt("width", DEFAULT_WIDTH);
int height = node.getInt("height", DEFAULT_HEIGHT);
setBounds(left, top, width, height);
// If no title was given, ask the user.
String title = node.get("title", "");
if (title.equals(""))
title = JOptionPane.showInputDialog("Title:");
if (title == null) title = "";
setTitle(title);
// Set up the file chooser to show XML files, to select the preferences.xml file.
final JFileChooser chooser = new JFileChooser();
chooser.setCurrentDirectory(new File("."));
chooser.setFileFilter(new FileNameExtensionFilter("XML files", "xml"));
// Set up the menus.
JMenuBar menuBar = new JMenuBar();
setJMenuBar(menuBar);
JMenu menu = new JMenu("File");
menuBar.add(menu);
JMenuItem exportItem = new JMenuItem("Export Preferences");
menu.add(exportItem);
exportItem.addActionListener(event -> {
if (chooser.showSaveDialog(PreferencesFrame.this) == JFileChooser.APPROVE_OPTION) {
try {
savePreferences();
OutputStream out = new FileOutputStream(chooser.getSelectedFile());
node.exportSubtree(out);
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
});
JMenuItem importItem = new JMenuItem("Import Preferences");
menu.add(importItem);
importItem.addActionListener(event -> {
if (chooser.showSaveDialog(PreferencesFrame.this) == JFileChooser.APPROVE_OPTION) {
try {
InputStream in = new FileInputStream(chooser.getSelectedFile());
Preferences.importPreferences(in);
in.close();
} catch (Exception e) {
e.printStackTrace();
}
}
});
JMenuItem exitItem = new JMenuItem("Exit");
menu.add(exitItem);
exitItem.addActionListener(event -> {
savePreferences();
System.exit(0);
});
}
public void savePreferences() {
node.putInt("left", getX());
node.putInt("top", getY());
node.putInt("width", getWidth());
node.putInt("height", getHeight());
node.put("title", getTitle());
}
}
preferences.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE preferences SYSTEM "http://java.sun.com/dtd/preferences.dtd">
<preferences EXTERNAL_XML_VERSION="1.0">
<root type="user">
<map/>
<node name="com">
<map/>
<node name="horstmann">
<map/>
<node name="corejava">
<map>
<entry key="left" value="11"/>
<entry key="top" value="9"/>
<entry key="width" value="453"/>
<entry key="height" value="365"/>
<entry key="title" value="Hello, World!"/>
</map>
</node>
</node>
</node>
</root>
</preferences>
我希望程序能够编译并显示一个 JFrame,但是看到了 2 个编译错误。
1. PreferencesTest.java.13: error: cannot find symbol
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
symbol: method setDefaultCloseOperation(int)
class PreferencesFrame
2. PreferencesTest.java:49: error: cannot find symbol setJMenuBar(menuBar);
symbol: method setJMenuBar(JMenuBar)
class PreferencesFrame
【问题讨论】:
-
您使用
Frame而不是JFrame似乎很奇怪。你确定你从书中复制的正确吗? -
谢谢,就是这样!没听懂,太专注于为什么 setVisible() 被调用,但 setDefaultCloseOperation() 不能。
标签: java swing preferences