用Java在同一页上打印2个JTable
我有2个JTables,我想把它们打印在同一页上。我现在Java知识的高度只让我能够在两个单独的页面上打印它们。下面是我正在进行的工作的摘录。我想在同一页上打印userTable和compTable。谢谢你的帮助用Java在同一页上打印2个JTable,java,jtable,Java,Jtable,我有2个JTables,我想把它们打印在同一页上。我现在Java知识的高度只让我能够在两个单独的页面上打印它们。下面是我正在进行的工作的摘录。我想在同一页上打印userTable和compTable。谢谢你的帮助 public void printTable(int type) { if(type == 0) { } else { userTable.getTableHeader()
public void printTable(int type)
{
if(type == 0)
{
}
else
{
userTable.getTableHeader().setFont(mainFont);
userTable.setFont(mainFont);
compTable.getTableHeader().setFont(mainFont);
compTable.setFont(mainFont);
MessageFormat header = new MessageFormat("Certificate Values");
MessageFormat footer = new MessageFormat("Page{0,number,integer}");
MessageFormat header1 = new MessageFormat("Interpolated Values");
MessageFormat footer1 = new MessageFormat("Page{0,number,integer}");
try
{
userTable.print( JTable.PrintMode.FIT_WIDTH, header, footer);
compTable.print( JTable.PrintMode.FIT_WIDTH, header1, footer1);
}
catch (PrinterException ex)
{
// TODO Auto-generated catch block
ex.printStackTrace();
}
}
}
下面是我尝试过的代码。该程序提取表格数据、HTML表格格式和HTML内容结果。生成的HTML作为编辑器内容显示在
编辑器窗格中。JEditorPane
的print()
方法允许将页面内的内容打印为两个表
注意事项:
如果表大小(行)不变,这是可以的。另外,请注意,生成的HTML非常基本,并且有更完善的解决方案(可以通过谷歌搜索找到)
JEditorPane
仅支持HTML 3.2。这意味着有限的CSS和
样式功能。如果需要更多样式,可以在JavaFX的WebView
中显示生成的HTML内容并打印出来
另一个选项是在web浏览器中显示生成的HTML并打印
已经建议使用ApachePOI
HtmlTablePrinter.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
import java.text.MessageFormat;
public class HtmlTablePrinter {
public static void main(String [] args) {
new HtmlTablePrinter().displayTable();
}
private void displayTable() {
final JTable table1 = getTable1();
final JTable table2 = getTable2();
JButton previewButton = new JButton("Print preview");
previewButton.addActionListener(actionEvent -> {
try {
printPreview(getHtml(table1, table2));
}
catch (Exception ex) {
ex.printStackTrace();
}
});
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.add(new JScrollPane(table1));
panel.add(new JScrollPane(table2));
JFrame frame = new JFrame("Tables Print Demo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(panel, BorderLayout.CENTER);
frame.add(previewButton, BorderLayout.SOUTH);
frame.setLocation(200, 100);
frame.setSize(500, 500);
frame.setVisible(true);
}
private JTable getTable1() {
String data [][] = {{"Violet", "Indigo"},
{"Blue", "Green"},
{"Yellow", "Orange"},
{"Red", "Others"}};
String header [] = {"Colors 1", "Colors 2"};
return new JTable(data, header);
}
private JTable getTable2() {
TableModel model = new AbstractTableModel() {
@Override public int getColumnCount() {
return 2;
}
@Override public int getRowCount() {
return 10;
}
@Override public Object getValueAt(int row, int col) {
return ("Cell at row " + (row+1) + " col " + (col+1));
}
};
return new JTable(model);
}
private String getHtml(JTable table1, JTable table2) {
String style = "<style>table, th, td {border:1px solid #C0C0C0;" +
"font-family:sans-serif;padding:2px;}</style>";
StringBuilder line = new StringBuilder();
line.append("<html>")
.append("<head>").append(style).append("</head>")
.append("<body>");
line = getTableHtml(table1, line);
line = getTableHtml(table2, line);
line.append("</body>").append("</html>");
return line.toString();
}
private StringBuilder getTableHtml(JTable table, StringBuilder line) {
TableModel model = table.getModel();
line.append("<table>");
line.append("<tr>");
for (int j = 0; j < model.getColumnCount(); j++) {
line.append("<th scope='col'>");
line.append(model.getColumnName(j));
line.append("</th>");
}
line.append("</tr>");
for (int i = 0; i < model.getRowCount(); i++) {
line.append("<tr>");
for (int j = 0; j < model.getColumnCount(); j++) {
line.append("<td>");
line.append(model.getValueAt(i, j));
line.append("</td>");
}
line.append("</tr>");
}
line.append("</table>").append("<br/>");
return line;
}
public void printPreview(String html) {
JDialog dialog = new JDialog();
dialog.setTitle("Tables Print Preview");
dialog.setModal(true);
JEditorPane editorPane = new JEditorPane("text/html", html);
editorPane.setMargin(new Insets(10, 10, 10, 10));
editorPane.setEditable(false);
JButton printButton = new JButton("Print...");
printButton.addActionListener(actionEvent -> {
MessageFormat hd = new MessageFormat("Colors & stuff");
MessageFormat ft = new MessageFormat("Page {0,number,integer}");
try {
editorPane.print(hd, ft);
} catch(Exception ex) {
ex.printStackTrace();
}
});
dialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
JPanel panel = new JPanel();
panel.add(new JScrollPane(editorPane));
panel.add(new JSeparator(SwingConstants.VERTICAL));
panel.add(printButton);
dialog.add(panel);
dialog.setSize(500, 700);
dialog.setLocation(300, 50);
dialog.setVisible(true);
}
}
import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
导入javax.swing.table.*;
导入java.text.MessageFormat;
公共类HtmlTablePrinter{
公共静态void main(字符串[]args){
新的HtmlTablePrinter().displayTable();
}
私有void displayTable(){
最终JTable table1=getTable1();
最终JTable table2=getTable2();
JButton previewButton=新JButton(“打印预览”);
previewButton.addActionListener(actionEvent->{
试一试{
打印预览(getHtml(表1、表2));
}
捕获(例外情况除外){
例如printStackTrace();
}
});
JPanel面板=新的JPanel();
panel.setLayout(新的BoxLayout(panel,BoxLayout.Y_轴));
添加(新的JScrollPane(表1));
添加(新的JScrollPane(表2));
JFrame=新JFrame(“表格打印演示”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
添加(面板、边框布局、中心);
添加(预览按钮,BorderLayout.SOUTH);
帧设置位置(200100);
框架。设置尺寸(500500);
frame.setVisible(true);
}
私有JTable getTable1(){
字符串数据[][]={{“紫罗兰色”、“靛蓝色”},
{“蓝色”、“绿色”},
{“黄色”、“橙色”},
{“红色”、“其他”};
字符串头[]={“颜色1”,“颜色2”};
返回新的JTable(数据、标题);
}
私有JTable getTable2(){
TableModel模型=新的AbstractTableModel(){
@重写公共int getColumnCount(){
返回2;
}
@重写公共int getRowCount(){
返回10;
}
@重写公共对象getValueAt(int行,int列){
返回(“行“+(行+1)+”列“+(列+1)”处的单元格);
}
};
返回新的JTable(模型);
}
私有字符串getHtml(JTable table1、JTable table2){
String style=“table,th,td{border:1px solid#c0;”+
“字体系列:无衬线;填充:2px;}”;
StringBuilder行=新的StringBuilder();
行。追加(“”)
.append(“”)。append(样式)。append(“”)
.附加(“”);
line=getTableHtml(表1,第行);
line=getTableHtml(表2,第行);
行。追加(“”)。追加(“”);
返回行.toString();
}
私有StringBuilder getTableHtml(JTable表,StringBuilder行){
TableModel模型=table.getModel();
行。追加(“”);
行。追加(“”);
对于(int j=0;j );
回流线;
}
公共void打印预览(字符串html){
JDialog dialog=新建JDialog();
对话框.setTitle(“表格打印预览”);
dialog.setModal(true);
JEditorPane editorPane=新的JEditorPane(“text/html”,html);
editorPane.setMargin(新插图(10,10,10,10));
editorPane.setEditable(false);
JButton printButton=新JButton(“打印…”);
printButton.addActionListener(actionEvent->{
MessageFormat hd=新的MessageFormat(“颜色和内容”);
MessageFormat ft=新的MessageFormat(“第{0页,数字,整数}”);
试一试{
editorPane.print(高清、红外);
}捕获(例外情况除外){
例如printStackTrace();
}
});
setDefaultCloseOperation(WindowConstants.DISPOSE\u ON\u CLOSE);
JPanel面板=新的JPanel();
添加(新的JScrollPane(editorPane));
添加(新的JSepator(SwingConstants.VERTICAL));
面板。添加(打印按钮);
对话框。添加(面板);
对话框。设置大小(500700);
对话框。设置位置(300,50);
对话框.setVisible(true);
}
}
请提供更多详细信息。你尝试了什么?我已经更新了帖子,打印不是一个简单的任务/主题,JTable
是其中一个更复杂的组件,你正在将复杂的任务组合在一起。你需要克服一些可能的问题,比如,当没有问题时会发生什么