在 Java 中,为什么我的构造函数在外部 class 中时没有被调用?

In Java, why does my constructor not get called when it is in the outer class?

当运行宁以下代码时,构造函数:

public ItemHandler(Font f)

似乎不​​是 运行,或者至少不是当变量:

private Font font = null;

在外class。如果我把它放在 "ItemHandler" class 中它会起作用,但我的主要问题是,为什么我不能把它放在它外面的 class 中?

public class Window extends JFrame {

    private Font font = null;
    private Font plainFont;
    private Font boldFont;
    private Font italicFont;
    private Font boldItalicFont;
    private JTextField textField;
    private JRadioButton plainBtn;
    private JRadioButton boldBtn;
    private JRadioButton italicBtn;
    private JRadioButton boldItalicBtn;
    private ButtonGroup group;

    public Window() {

        super("Item Test Program");
        setLayout(new FlowLayout());

        plainFont = new Font("Serif", Font.PLAIN, 14);
        boldFont = new Font("Serif", Font.BOLD, 14);
        italicFont = new Font("Serif", Font.ITALIC, 14);
        boldItalicFont = new Font("Serif", Font.BOLD + Font.ITALIC, 14);
        textField = new JTextField("Please enter something here.", 16);
        plainBtn = new JRadioButton("Plain", true);
        boldBtn = new JRadioButton("Bold", false);
        italicBtn = new JRadioButton("Italic", false);
        boldItalicBtn = new JRadioButton("Bold and Italic", false);
        group = new ButtonGroup();

        ItemHandler plainItemHandler = new ItemHandler(plainFont);
        ItemHandler boldItemHandler = new ItemHandler(boldFont);
        ItemHandler italicItemHandler = new ItemHandler(italicFont);
        ItemHandler boldItalicItemHandler = new ItemHandler(boldItalicFont);

        plainBtn.addItemListener(plainItemHandler);
        boldBtn.addItemListener(boldItemHandler);
        italicBtn.addItemListener(italicItemHandler);
        boldItalicBtn.addItemListener(boldItalicItemHandler);

        textField.setFont(new Font("Serif", Font.PLAIN, 14));

        group.add(plainBtn);
        group.add(boldBtn);
        group.add(italicBtn);
        group.add(boldItalicBtn);

        add(textField);
        add(plainBtn);
        add(boldBtn);
        add(italicBtn);
        add(boldItalicBtn);

    }

    private class ItemHandler implements ItemListener { 

        public ItemHandler(Font f) {

            font = f;

        }

        public void itemStateChanged(ItemEvent event) {

            textField.setFont(font);

        }

    }

}

ItemHandler 构造函数运行良好。问题是它的每个实例都试图在 Window 实例(它们共享)中的相同 font 字段中设置值,因此它将存储上次创建的 ItemHandler 设置的值。

为避免此问题,请将 font 字段从 Window 移至 ItemHandler

public class Window extends JFrame {

    //private Font font = null; // move it from here ------+
    //...                                                  |
    private class ItemHandler implements ItemListener { // |
                                                        // |
        private Font font = null; // <--- [ here ]---------+

        public ItemHandler(Font f) {
            font = f;
        }

        public void itemStateChanged(ItemEvent event) {
            textField.setFont(font);
        }

    }

}

因此 ItemHandler 的每个实例都有自己的字段,用于存储自己的字体信息。

我不认为你问的很清楚。但是,请注意您的构造函数

    public ItemHandler(Font f) {
        font = f;
    }

正在修改属于 Window 的变量,而不是 ItemHandler。因此,当 Window 的同一个实例创建四个 ItemHandler 实例时,每个 ItemHandler 构造函数都会修改 same[=30] 中的 font 变量=] Window 实例。这意味着当 Window 代码这样做时:

    ItemHandler plainItemHandler = new ItemHandler(plainFont);
    ItemHandler boldItemHandler = new ItemHandler(boldFont);
    ItemHandler italicItemHandler = new ItemHandler(italicFont);
    ItemHandler boldItalicItemHandler = new ItemHandler(boldItalicFont);

它们都将覆盖同一个 font 变量,这意味着只有 last 一个有效。如果您期待不同的东西,即四个不同的 font 变量,每个变量都设置为相应的参数,那是不会发生的。