簡體   English   中英

在Java中,為什么在外部類中沒有調用我的構造函數?

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

運行以下代碼時,構造函數:

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構造函數中的每一個都將修改同一 Window實例中的font變量。 這意味着當Window代碼執行此操作時:

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

它們都將覆蓋相同的font變量,這意味着只有最后一個才重要。 如果您期望有所不同,即四個不同的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每個實例ItemHandler將具有其自己的字段,該字段將存儲自己的字體信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM