在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)
构造函数将运行四次,除非之前抛出异常。如果您认为“它从未在调试模式下运行”,则可能没有告诉调试器正确跟踪此异常。