无法打印线条

时间:2014-11-12 15:09:50

标签: java swing nullpointerexception

我正在使用我的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);
   }

因此,当我点击打印按钮时,它显示空指针异常 请帮我明天是我的展览...... 提前致谢

1 个答案:

答案 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>