[英]Why does the java compiler create a synthetic constructor in outer 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;
在外層。 如果將其放在“ 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.