Java 为什么getFont()方法可以';不能调用并发出NullPointerException。

Java 为什么getFont()方法可以';不能调用并发出NullPointerException。,java,swing,user-interface,fonts,awt,Java,Swing,User Interface,Fonts,Awt,/我的目标是使listener对象指向这个GUI,这样每当选定的字体样式或字体系列发生变化,或者按下“OK”按钮时,字体的全名就会显示在文本字段中。先谢谢你/ 首先,您没有在JFrame中设置Font,因此在调用getFont时,它不会返回Font 第二,这可以更干净。您只需为按钮创建一个actionListenersoley,并在类的一部分创建您想要使用的变量。在那里,您可以简单地添加一个函数来更改字体 我这么做是因为我很无聊 导入java.awt.Container; 导入java.awt.

/我的目标是使listener对象指向这个GUI,这样每当选定的字体样式或字体系列发生变化,或者按下“OK”按钮时,字体的全名就会显示在文本字段中。先谢谢你/


首先,您没有在
JFrame
中设置
Font
,因此在调用
getFont
时,它不会返回
Font

第二,这可以更干净。您只需为按钮创建一个
actionListener
soley,并在类的一部分创建您想要使用的变量。在那里,您可以简单地添加一个函数来更改字体

我这么做是因为我很无聊

导入java.awt.Container;
导入java.awt.Font;
导入java.awt.GridLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.ButtonGroup;
导入javax.swing.JButton;
导入javax.swing.JCheckBox;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
导入javax.swing.JRadioButton;
导入javax.swing.JTextField;
公开课问题二{
公共静态void main(字符串[]args){
CheckRadio 2=新的CheckRadio(“字体选择器”);
二、init();
}
}
@抑制警告(“串行”)
类CheckRadio扩展JFrame{
JButton-okButton;
JCheckBox粗体;
JCheckBox斜体;
JRadioButton-ti;
伊拉迪布顿;
杰拉迪布顿公司;
按钮组;
JTextField;
公共支票收音机(字符串s){
超级(s);
}
公共void init(){
setFont(新字体(“Times”,Font.PLAIN,12));
JPanel check=新的JPanel();
检查.setLayout(新的GridLayout(2,1));
bold=新的JCheckBox(“bold”);
bold.setFont(getFont().deriveFont(Font.bold));
斜体=新的JCheckBox(“斜体”);
italic.setFont(getFont().deriveFont(Font.italic));
勾选。添加(粗体);
勾选。添加(斜体);
JPanel radio=新的JPanel();
radio.setLayout(新网格布局(3,1));
组=新按钮组();
ti=新的JRadioButton(“时间”);
he=新JRadioButton(“Heltivica”);
co=新的JRadioButton(“信使”);
ti.setFont(getFont().deriveFont(Font.TRUETYPE_-Font,15));
he.setFont(getFont().deriveFont(Font.TRUETYPE_-Font,16));
co.setFont(getFont().deriveFont(Font.TRUETYPE_-Font,17));
添加组(ti);
加组(he);
加组(co),;
无线电.添加(ti);
收音机。加上(他);
电台.add(co);
JLabel textBox=新的JLabel();
setLayout(新的GridLayout(3,1));
tf=新的JTextField(10);
textBox.add(新的JLabel(“”);
textBox.add(tf);
textBox.add(新的JLabel(“”);
JLabel okLabel=新的JLabel();
setLayout(新的GridLayout(3,1));
OK按钮=新的JButton(“OK”);
okLabel.add(新的JLabel(“”);
确定标签。添加(确定按钮);
okLabel.add(新的JLabel(“”);
容器面板=this.getContentPane();
panel.setLayout(新网格布局(1,4));
面板。添加(检查);
面板.添加(收音机);
panel.add(文本框);
面板。添加(okLabel);
okButton.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件arg0){
updateFont();
}
});
此.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
这个包();
此.setVisible(true);
}
public void updateFont(){
int-derivedFont=Font.TRUETYPE\u-Font;
字符串文本=”;
int font=0;
if(斜体.isSelected())
derivedFont+=Font.ITALIC;
if(粗体.isSelected())
derivedFont+=Font.BOLD;
if(ti.isSelected()){
字体=15;
text=“时代”;
}否则如果(他被选为()){
font=16;
text=“helvtica”;
}else if(公司被选为()){
font=18;
text=“Courier”;
}
tf.setFont(getFont().deriveFont(derivedFont,font));
tf.setText(文本);
}
}

真的吗?
getFont()
方法返回null。因此,取消对它的引用当然会抛出一个NullPointerException。我是一个初学者,有人能帮我解决我的问题吗?我应该为getFont()方法做些什么?感谢您哪一行代码抛出了NullPointerException(简称NPE)?
private Font getFont(){return null;}
对您来说似乎没有问题?如果您有类似的问题,作为将来的参考,
“line 31”
告诉我们没有什么用处,因为我们都不想在您发布的代码中逐个计算每一行,希望您已经发布了包括包声明在内的所有代码,并且没有跳过任何行。您需要发布实际行,以便我们可以搜索它。一旦
JFrame
可显示,
getFont
将返回有效的value@MadProgrammer谢谢你的解释,这对我很有帮助:)你真的弥补了我的一天。
import java.awt.*;
import java.awt.event.*;
import java.awt.Component.*;

import javax.swing.*;

public class QuestionTwo {

    public static void main(String[] args) {
        CheckRadio two = new CheckRadio("Font Chooser");
        two.init();

    }
}

@SuppressWarnings("serial")
class CheckRadio extends JFrame {


    public CheckRadio(String s) {
        super(s);
    }

    public void init() {

        JPanel check = new JPanel();
        check.setLayout(new GridLayout(2, 1));


        check.add(new JCheckBox("Bold"));
        check.setFont(getFont().deriveFont(Font.BOLD)); //getFont() method can be found through out the code`enter code here. Bottom down at the Listener method I also did create a getFont() method for those listener.
        check.add(new JCheckBox("Italic"));
        check.setFont(getFont().deriveFont(Font.ITALIC));

        JPanel radio = new JPanel();
        radio.setLayout(new GridLayout(3, 1));
        ButtonGroup group = new ButtonGroup();

        JRadioButton ti = new JRadioButton("Times");
        JRadioButton he = new JRadioButton("Heltivica");
        JRadioButton co = new JRadioButton("Courier");
        ti.setFont(getFont().deriveFont(Font.TRUETYPE_FONT,15));
        he.setFont(getFont().deriveFont(Font.TRUETYPE_FONT,16));
        co.setFont(getFont().deriveFont(Font.TRUETYPE_FONT,17));
        group.add(ti);
        group.add(he);
        group.add(co);

        radio.add(ti);
        radio.add(he);
        radio.add(co);

        JLabel textBox = new JLabel();
        textBox.setLayout(new GridLayout(3, 1));

        textBox.add(new JLabel(""));
        textBox.add(new JTextField(10));
        textBox.add(new JLabel(""));

        JLabel okButton = new JLabel();
        okButton.setLayout(new GridLayout(3, 1));

        okButton.add(new JLabel(""));
        okButton.add(new JButton("OK"));
        okButton.add(new JLabel(""));

        Container panel = this.getContentPane();
        panel.setLayout(new GridLayout(1, 4));
        panel.add(check);
        panel.add(radio);
        panel.add(textBox);
        panel.add(okButton);

        ti.addActionListener(new TimesListener(textBox));
        he.addActionListener(new HelvticaListener(textBox));
        co.addActionListener(new CourierListener(textBox));

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.pack();
        this.setVisible(true);
    }

}

class TimesListener implements ActionListener {

    // JLabel okButton;
    JButton okButton;
    JRadioButton ti;
    JCheckBox bo, it;
    JLabel textBox;
    Font f;

    public TimesListener(JLabel textBox) {
        this.textBox = textBox;
    }

    public TimesListener(JButton okButton, JRadioButton ti, JCheckBox bo,
            JCheckBox it, JLabel textBox) {
        this.okButton = okButton;
        this.ti = ti;
        this.bo = bo;
        this.it = it;
        this.textBox = textBox;

    }

    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == okButton) {
            if (ti.isSelected()) {
                if (bo.isSelected()) {
                    if (it.isSelected()) {
                        textBox.setFont(getFont().deriveFont(
                                Font.TRUETYPE_FONT + Font.BOLD + Font.ITALIC,
                                15));
                        textBox.setText("Times");
                    } else {
                        textBox.setFont(getFont().deriveFont(
                                Font.TRUETYPE_FONT + Font.BOLD, 15));
                        textBox.setText("Times");
                    }
                } else if (it.isSelected()) {
                    textBox.setFont(getFont().deriveFont(
                            Font.TRUETYPE_FONT + Font.ITALIC, 15));
                    textBox.setText("Times");
                } else {
                    textBox.setFont(getFont()
                            .deriveFont(Font.TRUETYPE_FONT, 15));
                    textBox.setText("Times");
                }
            }

        }
    }

    private Font getFont() {
        return null;
    }
}

class HelvticaListener implements ActionListener {

    JButton okButton;
    JRadioButton he;
    JCheckBox bo, it;
    JLabel textBox;
    Font f;

    public HelvticaListener(JLabel textBox) {
        this.textBox = textBox;
    }

    public HelvticaListener(JButton okButton, JRadioButton he, JCheckBox bo,
            JCheckBox it, JLabel textBox) {
        this.okButton = okButton;
        this.he = he;
        this.bo = bo;
        this.it = it;
        this.textBox = textBox;

    }

    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == okButton) {
            if (he.isSelected()) {
                if (bo.isSelected()) {
                    if (it.isSelected()) {
                        textBox.setFont(getFont().deriveFont(
                                Font.TRUETYPE_FONT + Font.BOLD + Font.ITALIC,
                                16));
                        textBox.setText("Helvtica");
                    } else {
                        textBox.setFont(getFont().deriveFont(
                                Font.TRUETYPE_FONT + Font.BOLD, 16));
                        textBox.setText("Helvtica");
                    }
                } else if (it.isSelected()) {
                    textBox.setFont(getFont().deriveFont(
                            Font.TRUETYPE_FONT + Font.ITALIC, 16));
                    textBox.setText("Helvtica");
                } else {
                    textBox.setFont(getFont()
                            .deriveFont(Font.TRUETYPE_FONT, 16));
                    textBox.setText("Helvtica");
                }

            }
        }
    }

    private Font getFont() {
        return null;
    }
}

class CourierListener implements ActionListener {

    // JLabel okButton;
    JButton okButton;
    JRadioButton co;
    JCheckBox bo, it;
    JLabel textBox;
    Font f;

    public CourierListener(JLabel textBox) {
        this.textBox = textBox;
    }

    public CourierListener(JButton okButton, JRadioButton co, JCheckBox bo,
            JCheckBox it, JLabel textBox) {
        this.okButton = okButton;
        this.co = co;
        this.bo = bo;
        this.it = it;
        this.textBox = textBox;

    }

    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == okButton) {
            if (co.isSelected()) {
                if (bo.isSelected()) {
                    if (it.isSelected()) {
                        textBox.setFont(getFont().deriveFont(
                                Font.TRUETYPE_FONT + Font.BOLD + Font.ITALIC,
                                18));
                        textBox.setText("Courier");
                    } else {
                        textBox.setFont(getFont().deriveFont(
                                Font.TRUETYPE_FONT + Font.BOLD, 18));
                        textBox.setText("Courier");
                    }
                } else if (it.isSelected()) {
                    textBox.setFont(getFont().deriveFont(
                            Font.TRUETYPE_FONT + Font.ITALIC, 18));
                    textBox.setText("Courier");
                } else {
                    textBox.setFont(getFont()
                            .deriveFont(Font.TRUETYPE_FONT, 18));
                    textBox.setText("Courier");
                }
            }
        }
    }

    private Font getFont() {
        return null;
    }
}