在 Java 中,为什么我的构造函数在外部 class 中时没有被调用?
In Java, why does my constructor not get called when it is in the outer class?
当运行宁以下代码时,构造函数:
public ItemHandler(Font f)
似乎不是 运行,或者至少不是当变量:
private Font font = null;
在外class。如果我把它放在 "ItemHandler" class 中它会起作用,但我的主要问题是,为什么我不能把它放在它外面的 class 中?
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
实例(它们共享)中的相同 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
的每个实例都有自己的字段,用于存储自己的字体信息。
我不认为你问的很清楚。但是,请注意您的构造函数
public ItemHandler(Font f) {
font = f;
}
正在修改属于 Window
的变量,而不是 ItemHandler
。因此,当 Window
的同一个实例创建四个 ItemHandler
实例时,每个 ItemHandler
构造函数都会修改 same[=30] 中的 font
变量=] Window
实例。这意味着当 Window
代码这样做时:
ItemHandler plainItemHandler = new ItemHandler(plainFont);
ItemHandler boldItemHandler = new ItemHandler(boldFont);
ItemHandler italicItemHandler = new ItemHandler(italicFont);
ItemHandler boldItalicItemHandler = new ItemHandler(boldItalicFont);
它们都将覆盖同一个 font
变量,这意味着只有 last 一个有效。如果您期待不同的东西,即四个不同的 font
变量,每个变量都设置为相应的参数,那是不会发生的。
当运行宁以下代码时,构造函数:
public ItemHandler(Font f)
似乎不是 运行,或者至少不是当变量:
private Font font = null;
在外class。如果我把它放在 "ItemHandler" class 中它会起作用,但我的主要问题是,为什么我不能把它放在它外面的 class 中?
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
实例(它们共享)中的相同 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
的每个实例都有自己的字段,用于存储自己的字体信息。
我不认为你问的很清楚。但是,请注意您的构造函数
public ItemHandler(Font f) {
font = f;
}
正在修改属于 Window
的变量,而不是 ItemHandler
。因此,当 Window
的同一个实例创建四个 ItemHandler
实例时,每个 ItemHandler
构造函数都会修改 same[=30] 中的 font
变量=] Window
实例。这意味着当 Window
代码这样做时:
ItemHandler plainItemHandler = new ItemHandler(plainFont);
ItemHandler boldItemHandler = new ItemHandler(boldFont);
ItemHandler italicItemHandler = new ItemHandler(italicFont);
ItemHandler boldItalicItemHandler = new ItemHandler(boldItalicFont);
它们都将覆盖同一个 font
变量,这意味着只有 last 一个有效。如果您期待不同的东西,即四个不同的 font
变量,每个变量都设置为相应的参数,那是不会发生的。