Java 回形针:未指定错误无法布局页面
我们使用的是古董库“回形针”的旧遗留代码,如何创建Java 回形针:未指定错误无法布局页面,java,Java,我们使用的是古董库“回形针”的旧遗留代码,如何创建网格打印的列存在问题。以下独立类显示了异常: public class TableControlPrintBigColumnsTest { private final static int MAX_WIDTH = 567; public static void main(String[] args) { Shell shell = new Shell(); TableViewer tableV
网格打印
的列存在问题。以下独立类显示了异常:
public class TableControlPrintBigColumnsTest {
private final static int MAX_WIDTH = 567;
public static void main(String[] args) {
Shell shell = new Shell();
TableViewer tableViewer = new TableViewer(shell, SWT.NONE);
tableViewer.setContentProvider(ArrayContentProvider.getInstance());
createColumn(tableViewer, "A", 5000);
createColumn(tableViewer, "B", 600);
createColumn(tableViewer, "C", 70);
tableViewer.setInput(Arrays.asList("Hallo World!"));
GridPrint print = createPrint(tableViewer.getTable());
PrintDialog dialog = new PrintDialog(shell, SWT.NONE);
PrinterData printerData = dialog.open();
if (printerData != null) {
PaperClips.print(new PrintJob("Print Job", new ScalePrint(print)), printerData);
}
}
private static void createColumn(TableViewer tableViewer, String text, int width) {
TableColumn column = new TableColumn(tableViewer.getTable(), SWT.LEFT);
column.setText(text);
column.setWidth(width);
}
public static GridPrint createPrint(Table table) {
DefaultGridLook look = new DefaultGridLook();
GridPrint gridPrint = new GridPrint(look);
TableColumn[] columns = table.getColumns();
int[] columnSizes = calculateColumnSizes(columns);
TableItem[] items = table.getItems();
// create header
for (int col = 0; col < columns.length; col++) {
TableColumn column = columns[col];
gridPrint.addColumn(new GridColumn(column.getAlignment(), columnSizes[col], 1));
gridPrint.addHeader(new TextPrint(column.getText(), SWT.CENTER));
}
// create individual cells
for (int row = 0; row < items.length; row++) {
TableItem item = items[row];
for (int col = 0; col < columns.length; col++) {
gridPrint.add(new TextPrint(item.getText(col), columns[col].getAlignment()));
}
}
return gridPrint;
}
private static int[] calculateColumnSizes(TableColumn[] columns) {
int[] columnSizes = Arrays.stream(columns).mapToInt(c -> c.getWidth()).toArray();
normalize(columnSizes);
return columnSizes;
}
private static void normalize(int[] columnSizes) {
if (Arrays.stream(columnSizes).sum() > MAX_WIDTH) {
int width = Arrays.stream(columnSizes).sum();
double ratio = (double) width / MAX_WIDTH;
for (int i = 0; i < columnSizes.length; i++) {
columnSizes[i] = (int) (columnSizes[i] / ratio);
}
}
}
}
Exception in thread "main" org.eclipse.swt.SWTError: Unspecified errorUnable to layout page 1
at org.eclipse.swt.SWT.error(SWT.java:4308)
at net.sf.paperclips.PaperClips.error(PaperClips.java:82)
at net.sf.paperclips.PaperClips.error(PaperClips.java:70)
at net.sf.paperclips.PaperClips.getPages(PaperClips.java:422)
at net.sf.paperclips.PaperClips.print(PaperClips.java:255)
at net.sf.paperclips.PaperClips.print(PaperClips.java:210)
at net.sf.paperclips.PaperClips.print(PaperClips.java:186)
at TableControlPrintBigColumnsTest.main(TableControlPrintBigColumnsTest.java:39)
问题的关键是规范化(int[])
方法。如果没有它,GridPrint
将像桌子一样巨大——在这种情况下超过5000像素。由于表格是用ScalePrint
缩放的,因此它毫无例外地工作,但缩放会使表格中的字体太小而无法读取。如果省略ScalePrint
,则会引发相同的异常(因为该表对于页面来说太大了)
所以我假设,即使第三列在规格化之后只有7像素宽,它也会被拉伸到列表中最大项目的大小,因此表再次比页面大
我可以通过将TextPrint
包装在ScalePrint
中来解决这个问题,但这会使该列完全不可读。我更喜欢只显示前两个字符,并将其余的文本切掉
有没有我可以使用的打印字体?有没有办法得到字体的大小,这样我就可以自己剪下TextPrint
的文本