Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 回形针:未指定错误无法布局页面_Java - Fatal编程技术网

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
的文本