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

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);

        }

    }

}

最佳答案

我不明白您要问的是什么。但是,请注意,您的构造函数

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


正在修改属于Window而不是ItemHandler的变量。因此,当同一Window实例创建四个ItemHandler实例时,这些ItemHandler构造函数中的每一个将修改同一font实例中的Window变量。这意味着当Window代码执行此操作时:

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


它们都将覆盖相同的font变量,这意味着仅最后一个计数。如果您期望有所不同,即四个不同的font变量都设置为相应的参数,那将不会发生。

关于java - 在Java中,为什么在外部类中没有调用我的构造函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28521845/

10-12 01:16
查看更多