Java 无法正常打印

Java 无法正常打印,java,swing,printing,jtable,Java,Swing,Printing,Jtable,我有一个系统,用户可以注册学生、科目和每个科目的学生成绩,以及主题和日期。您可以通过输入学生代码并从组合框中选择科目来搜索特定科目中的特定学生成绩。如果搜索它,这些内容将显示在jTable1中 然后,我有一个打印按钮。当用户单击打印按钮时,jTable1中显示的内容将转到jTable2,这两个表之间的区别在于jTable1显示学生的姓名和科目的名称,但jTable2不显示。为了更好地理解,这里有一张图片: 因此,当用户单击按钮打印jTable2时,我在这里使用了以下代码: Me

我有一个系统,用户可以注册学生、科目和每个科目的学生成绩,以及主题和日期。您可以通过输入学生代码并从组合框中选择科目来搜索特定科目中的特定学生成绩。如果搜索它,这些内容将显示在jTable1中

然后,我有一个打印按钮。当用户单击打印按钮时,jTable1中显示的内容将转到jTable2,这两个表之间的区别在于jTable1显示学生的姓名和科目的名称,但jTable2不显示。为了更好地理解,这里有一张图片:

因此,当用户单击按钮打印jTable2时,我在这里使用了以下代码:

        MessageFormat header = new MessageFormat("Ficha Pedagógica - "+jComboBox1.getSelectedItem());

    MessageFormat footer = new MessageFormat("Página {0,number,integer}");

    try{
        jTable2.print(JTable.PrintMode.NORMAL, header, null);
    }
    catch(java.awt.print.PrinterException e){
        System.out.println("error");
    }
事实上,我想打印两个标题,但使用内置的打印功能无法实现这一点。因此,在堆栈溢出中,我找到了以下主题:

在我找到这个之后,我尝试使用那里给出的代码。因为我是一个初学者,即使代码中有所有的注释,我也不能完全理解它。所以,我试图实现它,但现在,当我点击“打印”按钮时,什么都没有发生。这是我的打印按钮代码:

private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    // TODO add your handling code here:
        try{
        Class.forName(driver);
        con = DriverManager.getConnection(str_conn,usuario,senha);
        stmt = con.createStatement();
        sql = "select topico, nota, datanota from notas where notas.cod_aluno ="+jTextField1.getText()+" and notas.cod_curso ="+jTextField2.getText()+" order by notas.datanota";
        rs = stmt.executeQuery(sql);
        if(rs == null){
            return;
        }
        ResultSetMetaData rsmd;
        rsmd = rs.getMetaData();
        Vector vetColuna = new Vector();
        for(int i = 0;i<rsmd.getColumnCount();i++){
            vetColuna.add(rsmd.getColumnLabel(i+1));
        }
        Vector vetLinhas = new Vector();

        while(rs.next()){
            Vector vetLinha = new Vector();
            for(int i = 0;i<rsmd.getColumnCount();i++){
                vetLinha.add(rs.getObject(i+1));
            }
            vetLinhas.add(vetLinha);
            jTable2.setModel(new DefaultTableModel(vetLinhas,vetColuna));
        }
    }catch(ClassNotFoundException ex){
        JOptionPane.showMessageDialog(null,"Erro\nNão foi possível carregar o driver.");
        System.out.println("Nao foi possivel carregar o driver");
        ex.printStackTrace();
    }catch(SQLException ex){
        JOptionPane.showMessageDialog(null,"Erro\nCertifique-se de que todos os\ncampos estejam preenchidos corretamente.");
        System.out.println("Problema com o SQL");
        ex.printStackTrace();
    }

    /*MessageFormat header = new MessageFormat("Ficha Pedagógica - "+jComboBox1.getSelectedItem());

    MessageFormat footer = new MessageFormat("Página {0,number,integer}");

    try{
        jTable2.print(JTable.PrintMode.NORMAL, header, null);
    }
    catch(java.awt.print.PrinterException e){
        System.out.println("gsgd");
    }*/    
DefaultTableModel dtm = new DefaultTableModel(new String[] { "Column 1" }, 1);
JTable jTable2 = new JTable(dtm) {
@Override
public Printable getPrintable(PrintMode printMode, MessageFormat headerFormat, MessageFormat footerFormat) {
   return new TablePrintable(this, printMode, headerFormat, footerFormat);
        }
    };
}         
private void jButton4ActionPerformed(java.awt.event.ActionEvent evt){
//TODO在此处添加您的处理代码:
试一试{
Class.forName(驱动程序);
con=DriverManager.getConnection(str_conn、usuario、senha);
stmt=con.createStatement();
sql=“从notas中选择topico、nota、datanota,其中notas.cod_aluno=“+jTextField1.getText()+”和notas.cod_curso=“+jTextField2.getText()+”按notas.datanota排序”;
rs=stmt.executeQuery(sql);
如果(rs==null){
返回;
}
结果元数据rsmd;
rsmd=rs.getMetaData();
Vector vetColuna=新向量();
for(int i=0;i=rowCount){
打破
}
rowHeight=table.getRowHeight(行);

}使用新修改的
JTable
(clip.height+rowHeight),只需调用它的
print
方法即可

DefaultTableModel dtm = new DefaultTableModel(new String[] { "Column 1" }, 1);
JTable jTable2 = new JTable(dtm) {
    @Override
    public Printable getPrintable(PrintMode printMode, MessageFormat headerFormat, MessageFormat footerFormat) {
        return new TablePrintable(this, printMode, headerFormat, footerFormat);
    }
};

try{
    jTable2.print(JTable.PrintMode.NORMAL, header, null);
}
catch(java.awt.print.PrinterException e){
    System.out.println("error");
}
因为您已经重写了
getPrintable
方法来返回您自己的实现,所以这将用于物理打印表

已更新

标题文本需要用
\n
分隔,例如

MessageFormat header = new MessageFormat("Testing, 01\n02\n03");
它可以产生

已更新

据我所知,在无法完全运行代码的情况下,您的打印代码应该看起来像

private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {

    Vector vetColuna = new Vector();
    Vector vetLinhas = new Vector();
    try {
        Class.forName(driver);
        con = DriverManager.getConnection(str_conn, usuario, senha);
        stmt = con.createStatement();
        sql = "select topico, nota, datanota from notas where notas.cod_aluno =" + jTextField1.getText() + " and notas.cod_curso =" + jTextField2.getText() + " order by notas.datanota";
        rs = stmt.executeQuery(sql);
        if (rs == null) {
            return;
        }
        ResultSetMetaData rsmd;
        rsmd = rs.getMetaData();
        for (int i = 0; i < rsmd.getColumnCount(); i++) {
            vetColuna.add(rsmd.getColumnLabel(i + 1));
        }

        while (rs.next()) {
            Vector vetLinha = new Vector();
            for (int i = 0; i < rsmd.getColumnCount(); i++) {
                vetLinha.add(rs.getObject(i + 1));
            }
            vetLinhas.add(vetLinha);
        }
    } catch (ClassNotFoundException ex) {
        JOptionPane.showMessageDialog(null, "Erro\nNão foi possível carregar o driver.");
        System.out.println("Nao foi possivel carregar o driver");
        ex.printStackTrace();
    } catch (SQLException ex) {
        JOptionPane.showMessageDialog(null, "Erro\nCertifique-se de que todos os\ncampos estejam preenchidos corretamente.");
        System.out.println("Problema com o SQL");
        ex.printStackTrace();
    }

    MessageFormat header = new MessageFormat("Ficha Pedagógica - " + jComboBox1.getSelectedItem() + "\nNome do Aluno - " + jTextField1.getText());

    DefaultTableModel dtm = new DefaultTableModel(vetLinhas, vetColuna);
    JTable jTable2 = new JTable(dtm) {
        @Override
        public Printable getPrintable(PrintMode printMode, MessageFormat headerFormat, MessageFormat footerFormat) {
            return new TablePrintable(this, printMode, headerFormat, footerFormat);
        }
    };
    try {
        jTable2.setSize(jTable2.getPreferredSize());
        JTableHeader tableHeader = jTable2.getTableHeader();
        tableHeader.setSize(tableHeader.getPreferredSize());
        jTable2.print(JTable.PrintMode.FIT_WIDTH);
    } catch (PrinterException ex) {
        ex.printStackTrace();
    }

}
private void jButton4ActionPerformed(java.awt.event.ActionEvent evt){
Vector vetColuna=新向量();
Vector vetLinhas=新向量();
试一试{
Class.forName(驱动程序);
con=DriverManager.getConnection(str_conn、usuario、senha);
stmt=con.createStatement();
sql=“从notas中选择topico、nota、datanota,其中notas.cod_aluno=“+jTextField1.getText()+”和notas.cod_curso=“+jTextField2.getText()+”按notas.datanota排序”;
rs=stmt.executeQuery(sql);
如果(rs==null){
返回;
}
结果元数据rsmd;
rsmd=rs.getMetaData();
对于(int i=0;i
什么时候将
可打印文件发送到打印机?试着调用
jTable2.print(JTable.PrintMode.NORMAL,header,null);
在方法的末尾…但是,这不是和我以前做的一样吗?在“TablePrintable”方法的末尾,或者在“returnnewtableprintable”之后?我不太熟悉那些更高级的东西,所以我仍然很难跟上…不,你已经覆盖了tables
getPrintable
方法,它在调用
print
时使用该方法来打印表格…”在“TablePrintable”方法的末尾,你说-不,在
jButton4ActionPerformed
方法的末尾,我尝试过这样做,但最终结果是:可能这是因为我调用了一个定制的可打印方法,并再次使用内置方法造成的?对我来说似乎很好,但您可能想看看如何打印屏幕外的表。。.好吧,但是我的任务
private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {

    Vector vetColuna = new Vector();
    Vector vetLinhas = new Vector();
    try {
        Class.forName(driver);
        con = DriverManager.getConnection(str_conn, usuario, senha);
        stmt = con.createStatement();
        sql = "select topico, nota, datanota from notas where notas.cod_aluno =" + jTextField1.getText() + " and notas.cod_curso =" + jTextField2.getText() + " order by notas.datanota";
        rs = stmt.executeQuery(sql);
        if (rs == null) {
            return;
        }
        ResultSetMetaData rsmd;
        rsmd = rs.getMetaData();
        for (int i = 0; i < rsmd.getColumnCount(); i++) {
            vetColuna.add(rsmd.getColumnLabel(i + 1));
        }

        while (rs.next()) {
            Vector vetLinha = new Vector();
            for (int i = 0; i < rsmd.getColumnCount(); i++) {
                vetLinha.add(rs.getObject(i + 1));
            }
            vetLinhas.add(vetLinha);
        }
    } catch (ClassNotFoundException ex) {
        JOptionPane.showMessageDialog(null, "Erro\nNão foi possível carregar o driver.");
        System.out.println("Nao foi possivel carregar o driver");
        ex.printStackTrace();
    } catch (SQLException ex) {
        JOptionPane.showMessageDialog(null, "Erro\nCertifique-se de que todos os\ncampos estejam preenchidos corretamente.");
        System.out.println("Problema com o SQL");
        ex.printStackTrace();
    }

    MessageFormat header = new MessageFormat("Ficha Pedagógica - " + jComboBox1.getSelectedItem() + "\nNome do Aluno - " + jTextField1.getText());

    DefaultTableModel dtm = new DefaultTableModel(vetLinhas, vetColuna);
    JTable jTable2 = new JTable(dtm) {
        @Override
        public Printable getPrintable(PrintMode printMode, MessageFormat headerFormat, MessageFormat footerFormat) {
            return new TablePrintable(this, printMode, headerFormat, footerFormat);
        }
    };
    try {
        jTable2.setSize(jTable2.getPreferredSize());
        JTableHeader tableHeader = jTable2.getTableHeader();
        tableHeader.setSize(tableHeader.getPreferredSize());
        jTable2.print(JTable.PrintMode.FIT_WIDTH);
    } catch (PrinterException ex) {
        ex.printStackTrace();
    }

}