【问题标题】:Why are some methods not found, even though imports have been included?为什么有些方法没有找到,即使已经包含了导入?
【发布时间】: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 页。

对于看似微不足道的错误,我深表歉意,但我一直在为应该是一个简单的解决方案而摸不着头脑。重现该问题需要整个文件,因为如果遗漏部分文件,可能会出现除上述之外的其他编译错误。

我已经尝试了以下方法。

  1. 重新排列导入并调用特定导入而不是通配符 .*
  2. 多次检查方法的拼写。
  3. 使用在线编译器 (https://www.tutorialspoint.com/compile_java_online.php) 在不同的 JDK 上运行,以隔离本地机器问题(例如,JDK 1.8_202 与较旧/从未使用过的 JDK 版本)。
  4. 查看文档以了解这些方法属于哪些类。
  5. 检查了方法参数以检查没有类型错误。

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


【解决方案1】:

问题可能在这里:class PreferencesFrame extends Frame。应该是class PreferencesFrame extends JFrameFrame 类来自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;

【讨论】:

  • 谢谢,就是这样!我太专注于方法,从来没有注意到我正在扩展java.awt而不是javax.swing的类...
猜你喜欢
  • 1970-01-01
  • 2021-01-29
  • 2020-08-25
  • 1970-01-01
  • 2011-01-04
  • 2011-07-18
  • 1970-01-01
  • 1970-01-01
  • 2017-10-26
相关资源
最近更新 更多