Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Помогите с печатью TableView (JavaFx 8) / 8 сообщений из 8, страница 1 из 1
23.11.2016, 18:08
    #39352942
RuslanGab
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с печатью TableView (JavaFx 8)
Здравствуйте!
Существует тривиальная задача печати данных. Решил сделать это пихнув их в TableView. В целом вопросов это все не вызывает, ибо, скажем, таблица "с экрана" печатается как положено, но тут немного другая ситуация и я наткнулся на нечто, что меня полностю тормознуло.
Итак, печатающий метод получает лист сущностей, создает таблицу, куда они закидываются, и печатает эту радость. Выглядит это так:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
public boolean printAnfrageTableView(List<Anfrage> anfrageListe) {
        //create printer job
        javafx.print.PrinterJob job = javafx.print.PrinterJob.createPrinterJob();

        //show print dialog
        if (job != null && job.showPrintDialog(anfrageTable.getScene().getWindow())) {    

            //Create Page (A4, landscape)
            PageLayout pageLayout = job.getPrinter().createPageLayout(Paper.A4, PageOrientation.LANDSCAPE, Printer.MarginType.DEFAULT);
            job.getJobSettings().setPageLayout(pageLayout);
            
            //Get list of items to print
            ObservableList<Anfrage> anfragenToPrint = FXCollections.observableArrayList();
            anfragenToPrint.addAll(anfrageListe);  //Тут все не совсем так - эту мое упрощение чтобы количество кода не пугало:)
            
            //Create new TableView with columns we need and add there all items
            TableView<Anfrage> printableTable = new TableView<>();           
            TableColumn column1 = new TableColumn(entitiesResources.getString("Provider"));
            ...
            TableColumn column14 = new TableColumn(entitiesResources.getString("User")); 
                       
            printableTable.getColumns().setAll(column1, 
                                               column2, 
                                               ...
                                               column14);
            
            column1.setCellValueFactory(new PropertyValueFactory<>("Provider"));
            ...
            column14.setCellValueFactory(new PropertyValueFactory<>("User"));  

            printableTable.setItems(anfragenToPrint);    
            
            //здесь printableTable.getMaxWidth()) = -1 и printableTable.getPrefWidth()) = -1
            //column1.getWidth() = 80 (остальные столбцы также)

            //пытаюсь сделать ширину равной сумме всех столбцов
            printableTable.prefWidthProperty().bind(column1.widthProperty()
                                .add(column2.widthProperty())
                                ...
                                .add(column14.widthProperty()));
                     //это работает тут ширина таблицы 80*14=1120

            printableTable.getTransforms().add(new Scale( /* тут значения, полученные сравнением ширины листа и таблицы (1120!!!) - она масштабируется "под лист" */ ));
            
            //column1.getWidth() = 80 (остальные столбцы также!)
                if (!job.printPage(printNode)) {
                    LOG.warn("Can't print page - intern error. Please check Printer settings and paper.");
                    job.endJob();
                    return false;
                }
           //column1.getWidth() = 64.09.. column2.getWidth()=106,60... (!!!)

            job.endJob();

            return true;
                
        } else {
            return false;
        }
    }



Итак собственно проблема: все красиво, НО ширина таблицы меньше, чем суммарная ширина столбцов. Часть столбцов тупо не влезает, ибо столбцы уже после печати "расползаются", что для меня вообще не очевидно. Как изначально "инициировать" это присвоение размеров до печати?

Пробовал:
- printableTable.requestLayout() и refresh() в разных местах - не помогает
- printableTable.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY) - помогает, ибо все столбцы становятся равными 80 и талица четко вписана в лист, НО тогда информация внутри столбцов обрезается (содержимое длиннее ширины столбца).

Вот как-то так. Никак не пойму чего злосчастной таблице предложить, чтобы она столбцы выставила по ширине до начала печати дабы я ее нормально отмасштабировать смог.

Заранее спасибо всем!
...
Рейтинг: 0 / 0
23.11.2016, 18:56
    #39352993
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с печатью TableView (JavaFx 8)
RuslanGab,
Мммммм... я не печатал, но если эту таблу не в динамике строить, а прямо в дизайнере FXML.
То печать будет?
...
Рейтинг: 0 / 0
24.11.2016, 14:20
    #39353669
RuslanGab
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с печатью TableView (JavaFx 8)
Petro123, Добрый день!
Если таблица "рабочая" представленная на сцене и печатать непосредственно ее (такое у меня есть в другом фрагменте), то все в порядке. Эта таблица уже имеет размеры, с которыми можно работать. А вот когда я ее "на лету" создаю возникает такая проблема... Причем опять же: она печатается. Все нрмально. Именно что ее столбцы выравниваются отчего-то именно после печати, вот я и думаю что с ней такого там происходит и как бы это еще "до печати" получить.
...
Рейтинг: 0 / 0
24.11.2016, 14:37
    #39353688
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с печатью TableView (JavaFx 8)
RuslanGabЕсли таблица "рабочая" представленная на сцене и печатать непосредственно ее (такое у меня есть в другом фрагменте), то все в порядке.
Вот и забей. По крайней мере можно окно невидимым сделать.
Ну или печатать то что видно на экране (предпросмотр).
...
Рейтинг: 0 / 0
24.11.2016, 14:45
    #39353702
RuslanGab
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с печатью TableView (JavaFx 8)
Petro123,
Ну да. Согласен. Сделать можно и даже не сказать что это трудно, НО ведь хочется сделать ХОРОШО. Не люблю я костыли:) Тем более оно же работает по сути своей. Она даже размеры столбцов совершенно верно по содержимому подгоняет, но уже ПОСЛЕ, блин, печати (посмотрите в коде в самом низу закоментированные строки).
Витает мысль лезть в дебаггер с последующей обработкой ее Skin через рефлексию, но блин это уже тоже костыль вот и думаю что что-то а-ля "refresh", "sktivateScene" etc. должно быть но я это просто найти не могу:( Ведь это при печати происходит на каком-то этапе!
...
Рейтинг: 0 / 0
24.11.2016, 14:47
    #39353710
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с печатью TableView (JavaFx 8)
RuslanGab,
дело ваше.
Я между динамикой (сколько у вас строк) и статикой (FXML разметка) всегда выбираю статику.
Там всё инициализируется автоматом платформой.
Удачи!
...
Рейтинг: 0 / 0
24.11.2016, 16:00
    #39353827
RuslanGab
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с печатью TableView (JavaFx 8)
Докопался!
Не могу сказать что решение мне нравится, но работает. С помощью дебаггера нашел что делает этот принтер, отчего столбцы получают свою щирину, так что если кому интересно...

В классе J2DPrinterJob при получении информации о странице вызывается геттер объекта Node, перед которым вызывается метод "initScene":
Код: java
1.
2.
3.
4.
        Node getNode() {
            initScene();
            return node;
        }



Этот метод само собой универсален, так что в моем случае я его весьма конкретно обкорнал и вышел он (т.е. собственно все решение) в моем случае, когда я знаю что работаю в потоке JavaFX и родителей у моей таблицы никаких нет и сама она не анимирована седующим:
Код: java
1.
2.
3.
4.
            Group group = new Group(); 
            group.getChildren().add(printableTable);
            new Scene(group);
            NodeHelper.layoutNodeForPrinting(group);



Я чересчур глубоко не лез, но основная фишка тут в последней строке, которая для имеющегося объекта group (ясно его сначала надо должным образом инициализировать) вызывает layoutChildren(), где и происходит нужное мне таинство. После этого столбцы получают свою ширину и гирина таблице становится равной ширине всех столбцов. Дальге на нее остается налодить трансформацию соразмерно размеру листа и т-т-т готово.


Жаль что нет чего-то вроде готового метода для подобной фигни - придется его засунуть в статический класс и будет мне счастье, чтобы где еще понадобится этой фигрей не заниматься:) Надеюсь может кому поможет. Может есть путь элегантнее и короче - есди так тапками не кидайтесь.
...
Рейтинг: 0 / 0
24.11.2016, 16:03
    #39353832
RuslanGab
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с печатью TableView (JavaFx 8)
P.S.: И прошу прощения за тучу опечаток - пишу с английской клавой да еще в приступе радости Жаль сообщения эдитировать нельзя.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Помогите с печатью TableView (JavaFx 8) / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]