我正在使用我的java程序使用打印机打印在文本字段中输入的行,它显示空指针异常
我的代码在public int print(Graphics graphics,PageFormat pf,int pageIndex)方法是
public int print(Graphics graphics,PageFormat pf,PageIndex pageIndex)
{
if(pageIndex>0)
return NO_SUCH_PAGE;
String s=tf.getText();
Graphics2D g=(Graphics2D)graphics;
g.translate(pageIndex.getImageableX(),pageIndex.getImageableY());
g.drawString(s,50,20);
return PAGE_EXISTS;
}
我的打印机作业方法是
// i have implemented Printable interface previously
b.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
printer pr=new printer(); //printer is my class name
PrinterJob pj=PrinterJob.getPrinterJob();
pj.setPrintable(pr);
if(pj.printDialog==true)
{
try
{
pj.print();
}
catch(Exception e)
{
System.out.print(e);
}
}
}
});
我的用户界面代码是
JButton b; //Global variable
JTextField tf; //Global variable
public void comp()
{
JFrame f=new JFrame();
f.setLayout(new FlowLayout());
b=new JButton("print");
tf=new JTextField(10);
f.add(b);
f.add(tf);
}
因此,当我点击打印按钮时,它显示空指针异常 请帮我明天是我的展览...... 提前致谢
答案 0 :(得分:0)
正如你在评论中所述:
String s=tf.getText();
是nullpointer异常的来源。
为什么会发生这种情况有很多种可能性。 如果没有看到你的实际课程,你就无法给出明确的答案。
在分配tf之前,可能会执行此方法。 您的类可能附加到完全不同的打印机实例(具有tf = null)。
您在问题中遗漏了重要细节
您正在请求阅读文本字段的示例:在这里。
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TestButton extends JFrame {
private JTextField textField;
private JButton button;
private JTextField outField;
public TestButton() {
Dimension dimension = new Dimension(400,400);
setSize(dimension);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setLayout(new FlowLayout());
this.textField = new JTextField(10);
this.button = new JButton("doStuff");
this.outField = new JTextField(10);
add(textField);
add(button);
add(outField);
button.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
outField.setText(textField.getText());
textField.setText("");
}
});
pack();
setVisible(true);
}
public static void main(String[] argv) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
TestButton testButton = new TestButton();
}
});
}
}
我认为您的问题与您在内部类中创建可打印的新实例有关。如果外部类是可打印的,那意味着它将使用新的实例变量构造。您可能需要将此传递给它
在上面的代码中列出:
JTextField tf; //全局变量
但是,如果这不是公共静态final,则它不是全局变量。 (这不是公开这个变量的理想方式,只是说)
如果 tf是一个实例变量,那么我认为我看到了你的问题。 您将新的printer()传递给pj.setPrintable方法。 这台新打印机是一个全新/新鲜的实例。
如果拥有JTextField tf的类是打印机并且是打印机作业方法的所有者,那么您可能需要这样做:
pj.setPrintable(this);
如果拥有JTextField tf的类是与打印机作业方法的所有者不同的类,那么您可能需要这样做:
pj.setTextField( ... find the text field and put it in ...)
在后一种情况下,您需要创建此setTextField方法
我的直觉告诉我你是第一类,因为你有一个tf变量,你的代码编译。目前出现的问题是您创建了一个新的printer()实例,并通过这样做创建了一个完整的新副本,所有变量都设置为null(comp()方法将这些设置为非空值,但这不会帮助你,因为他们将是全新的按钮)。
希望这会有所帮助。如果您复制了类文件的剥离版本而不是复制了部分方法,那么这可能会更容易找到/意味着更少猜测我和其他人的部分。< / p>