[英]Why are some methods not found, even though imports have been included?
我試圖遵循一些基於Java Preferences API的演示代碼,但是我發現沒有找到與setDefaultCloseOperation(int)和setJMenuBar(JMenuBar)有關的錯誤的奇怪方法。 該示例程序摘自Cay S. Horstman撰寫的Core Java,第一卷-基礎,第11版的 796-799頁。
對於可能出現的小錯誤,我深表歉意,但是我一直在為應該是一個簡單的解決方法而head之以鼻。 重現此問題需要整個文件,因為如果忽略了文件的某些部分,則可能會引起除上述以外的其他編譯錯誤。
我嘗試了以下方法。
.*
調用特定的導入。 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
問題可能在這里: class PreferencesFrame extends Frame
。 它應該是class PreferencesFrame extends JFrame
。 Frame
類來自java.awt
包,而JFrame
類(具有setDefaultCloseOperation
方法的類)來自javax.swing
包。
您的總進口應為:
import java.awt.EventQueue;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.prefs.Preferences;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.filechooser.FileNameExtensionFilter;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.