Java 无法打印行

Java 无法打印行,java,swing,nullpointerexception,Java,Swing,Nullpointerexception,我正在使用java程序打印文本字段中输入的一行,它显示空指针异常 我的代码在公共int printGraphics图形,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=(Graphics

我正在使用java程序打印文本字段中输入的一行,它显示空指针异常

我的代码在公共int printGraphics图形,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);
           }
        } 
     }
});
我的打印机工作方法是

 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);
           }
        } 
     }
});
我的UI代码是

 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);
   }
因此,当我点击打印按钮时,它显示空指针异常 请帮助我明天是我的展览。。。
提前感谢

如您在评论中所述:

String s=tf.getText();
是nullpointer异常的源

发生这种情况的原因有多种可能性。 如果不看你的实际课程,就不可能给你一个明确的答案

有可能在分配tf之前执行此方法。 您的类可能附加到一个完全不同的printer实例,该实例的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//全局变量

但是,如果这不是公共静态final,则它不是全局变量。这不是公开这个变量的理想方法,只是说

如果tf是一个实例变量,那么我想我看到了您的问题。 将新打印机传递给pj.setPrintable方法。 这台新打印机是一个全新的实例

如果拥有JTextField的类是printer,并且是printer job方法的所有者,那么您可能需要执行以下操作:

pj.setPrintable(this);
pj.setTextField( ... find the text field and put it in ...)
如果拥有JTextField的类与打印机作业方法的所有者不同,则可能需要执行以下操作:

pj.setPrintable(this);
pj.setTextField( ... find the text field and put it in ...)
在后一种情况下,您需要创建这个setTextField方法

我的直觉告诉我你属于第一类,因为你有一个tf变量,你的代码可以编译。目前出现的问题是,您创建了一个新的打印机实例,通过这样做,您创建了一个完全新的副本,所有变量都设置为null comp method将这些变量设置为非null值,但这对您没有帮助,因为它们将是全新的按钮


希望这有帮助。如果您复制了类文件的剥离版本,而不是复制了部分方法,这可能会更容易找到/意味着对我和其他人的猜测会少很多。

我建议至少公布整个方法和你得到的全部错误。你能公布使用PrinterJob对象获取打印机的方法吗job@vembutech请参阅编辑:信息不足。。什么是tf?什么是图形?哪一行有空指针异常?这是相关信息。使用e.printStackTrace而不是System.out.printlne来获取完整的stacktrace.oops现在才注意到前4行包含npe,不仅仅是这样,你可以在答案中添加一个示例代码,在文本字段中打印用户键入的文本。这将非常有帮助。我正试图帮助你解决遇到的实际问题。您只提供少量代码,并且仅在特别要求时提供。我认为你的代码可能有用,但是有很多问题。您声明获得一个nullpointer异常。就我所见,这是一个需要解决的问题,至少是一个需要首先解决的问题。要解决此问题,您需要提供stacktrace或基于stacktrace的find,空指针出现在哪一行。要做到这一点,您可能需要删除try/catch块,并检查标准输出/控制台日志中的stacktrace。我怀疑您的java进程不知何故找不到打印机。在代码中设置断点并运行调试器,它会很快变得清晰;它会被打印出来,但当我使用字符串s=tf.getText;等变量时。。。。。然后g.拉丝,50,20;它显示空指针异常。。。。。我已经把字符串s=tf.getText;在公共int打印方法中。。。