java: 包 com.sun.java.swing.plaf.windows 不存在

问题描述 投票:0回答:1

我从 Java 8 切换到 Java 17。代码现在无法编译

具体来说,从

com.sun.java.swing.plaf.windows
包导入现在无效。

java: 包 com.sun.java.swing.plaf.windows 不存在

但是,它确实存在。只是新的编译器不合理而已。现在由于某种原因它拒绝承认它的存在。

编译错误,com.sun.java.swing.plaf.windows不存在

这些 com.sun.java.swing 包从未打算在 Java 本身之外使用,也不应该直接使用。 Java 现在强制执行这一点。

马克·罗特维尔

好吧,但我们还是引用了这个包。 Java 声称是向后兼容的,因此任何在旧版本中合法的内容在新版本中也应该合法

那么我们该怎么办?

// MRE. Compilation fails. Amazon Corretto 17

package demos.button;

import com.sun.java.swing.plaf.windows.WindowsLookAndFeel;

import javax.swing.*;
import java.awt.*;

public class CheckBoxDemo {
    public static void main(String[] args) throws UnsupportedLookAndFeelException, ClassNotFoundException,
            InstantiationException, IllegalAccessException {
        // you don't expect us to pass strings directly, do you?
        UIManager.setLookAndFeel(WindowsLookAndFeel.class.getName());

        JFrame frame = new JFrame("Check Box demo");
        JPanel mainPanel = createMainPanel();
        frame.setContentPane(mainPanel);
        frame.setLocationRelativeTo(null);
        frame.pack();
        frame.setVisible(true);
    }

    private static JPanel createMainPanel() {
        FlowLayout layout = new FlowLayout();
        layout.setAlignment(FlowLayout.CENTER);
        JPanel mainPanel = new JPanel(layout);
        mainPanel.add(createCheckBox());
        return mainPanel;
    }

    private static JCheckBox createCheckBox() {
        JCheckBox checkBox = new JCheckBox();
        return checkBox;
    }
}

即使我禁用

--release
选项,代码也不会编译。例如,因为
ComboPopup
getList()
曾经看起来像这样

public JList getList();

现在看起来像这样

public JList<Object> getList();

因此,如果您的

ComboPopup
实现使用了任何类型参数,那么运气不好

// no longer compiles
@Override
public JList<T> getList() {
    return itemList;
}

它看起来根本不像向后兼容。这(连同跨平台支持)难道不是 Java 的全部意义吗?

java swing
1个回答
0
投票
系统适用时才可以选择。

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

© www.soinside.com 2019 - 2024. All rights reserved.