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

在Java中,为什么我的构造函数在外部类中时没有被调用?,java,constructor,scope,Java,Constructor,Scope,运行以下代码时,构造函数: public ItemHandler(Font f) 似乎没有运行,或者至少当变量: private Font font = null; 他在外班。如果我把它放在“ItemHandler”类中,它会工作,但我的主要问题是,为什么我不能把它放在它之外的类中 public class Window extends JFrame { private Font font = null; private Font plainFont; privat

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

public ItemHandler(Font f)
似乎没有运行,或者至少当变量:

private Font font = null;
他在外班。如果我把它放在“ItemHandler”类中,它会工作,但我的主要问题是,为什么我不能把它放在它之外的类中

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
构造函数运行良好。问题是,它的每个实例都试图在
窗口
实例的同一
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);
        }

    }

}
公共类窗口扩展JFrame{
//private Font=null;//从此处移动------+
//...                                                  |
私有类ItemHandler实现ItemListener{//|
// |

private-Font-Font=null;//我认为您的问题并不清楚。但是,请注意,您的构造函数

    public ItemHandler(Font f) {
        font = f;
    }
正在修改属于
Window
的变量,而不是
ItemHandler
。因此,当
Window
的同一实例创建四个
ItemHandler
实例时,这些
ItemHandler
构造函数中的每一个都将修改同一
窗口
实例中的
font
变量。这意味着当
窗口执行以下操作时:

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

它们都将覆盖相同的
font
变量,这意味着只有最后的一个才算。如果您期望的是不同的东西,即四个不同的
font
变量分别设置为相应的参数,则不会发生这种情况。

是什么让您相信
ItemHandler
constructor未运行?它从未在调试模式下运行。您是否确实在执行导致使用
Window()
构造函数的操作?(
new Window()
程序中的某个位置)如果运行
Window()
构造函数,则运行
ItemHandler(Font)
构造函数将运行四次,除非之前抛出异常。如果您认为“它从未在调试模式下运行”,则可能没有告诉调试器正确跟踪此异常。