Я пытаюсь следовать некоторому демонстрационному коду, основанному на Java Preferences API, но я получаю странный метод, который не находит ошибок, связанных с setDefaultCloseOperation (int) и setJMenuBar (JMenuBar). Этот пример программы со страниц 796-799 Core Java, том I - Основы, 11-е издание , Кей С. Хорстман.
Я прошу прощения за то, что кажется тривиальной ошибкой, но я ломал голову над тем, что должно быть простым исправлением. Весь файл необходим, чтобы воспроизвести проблему, так как другие ошибки компиляции, помимо вышеупомянутого, могут возникнуть, если части файла будут пропущены.
Я пробовал следующее.
- Изменение порядка импорта и вызов специфического импорта по сравнению с подстановочными символами
.*
.
- Проверено написание методов несколько раз.
- Запущен на другом JDK с использованием онлайн-компилятора (https://www.tutorialspoint.com/compile_java_online.php), чтобы изолировать проблемы локального компьютера (например,
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