【问题标题】:In Java, why does my constructor not get called when it is in the outer class?在Java中,为什么我的构造函数在外部类中时没有被调用?
【发布时间】:2015-02-15 00:31:51
【问题描述】:

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

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 构造函数没有运行?
  • 它永远不会在调试模式下运行。
  • 你真的在做一些导致Window()构造函数被使用的事情吗? (new Window() 在你的程序中的某处)如果Window() 构造函数运行,那么ItemHandler(Font) 构造函数将运行四次,除非之前抛出异常。如果您相信“它永远不会在调试模式下运行”,那么您可能没有告诉调试器正确跟踪这一点。

标签: java constructor scope


【解决方案1】:

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

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

正在修改属于Window 的变量,而不是ItemHandler。因此,当Window 的同一个实例创建四个ItemHandler 实例时,每个ItemHandler 构造函数都会修改same 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 变量,每个变量都设置为相应的参数,那是不会发生的。

【讨论】:

    【解决方案2】:

    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 的每个实例都将有自己的字段,在其中存储自己的字体信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-16
      • 1970-01-01
      • 2018-02-04
      • 1970-01-01
      • 2013-08-11
      相关资源
      最近更新 更多