#java
#java
Вопрос:
У нас есть старый устаревший код с антикварной библиотекой «Скрепки», и есть проблема с тем, как создаются столбцы GridPrint
. Следующий отдельный класс показывает исключение:
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)
Суть проблемы заключается в normalize(int[])
методе. Без этого GridPrint
будет таким же огромным, как таблица — в данном случае более 5000 пикселей. Поскольку таблица масштабируется с помощью ScalePrint
, она работает без исключений, но масштабирование делает шрифт в таблице слишком маленьким для чтения. Если я опущу ScalePrint
, будет выдано то же исключение (потому что таблица слишком большая для страницы.
Итак, я предполагаю, что происходит то, что, хотя 3-й столбец имеет ширину всего 7 пикселей после нормализации, он растягивается до размера самого большого элемента в списке, и поэтому таблица снова становится больше страницы.
Я могу исправить это, обернув TextPrint
в ScalePrint
, но это делает столбец полностью нечитаемым. Я бы предпочел показывать только первые пару символов и вырезать остальной текст.
Есть ли печать, которую я мог бы использовать? Есть ли какой-либо способ получить размер шрифта, чтобы я мог сам вырезать TextPrint
текст?