powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Помогите с печатью TableView (JavaFx 8)
8 сообщений из 8, страница 1 из 1
Помогите с печатью TableView (JavaFx 8)
    #39352942
RuslanGab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
Существует тривиальная задача печати данных. Решил сделать это пихнув их в 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
Помогите с печатью TableView (JavaFx 8)
    #39352993
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RuslanGab,
Мммммм... я не печатал, но если эту таблу не в динамике строить, а прямо в дизайнере FXML.
То печать будет?
...
Рейтинг: 0 / 0
Помогите с печатью TableView (JavaFx 8)
    #39353669
RuslanGab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123, Добрый день!
Если таблица "рабочая" представленная на сцене и печатать непосредственно ее (такое у меня есть в другом фрагменте), то все в порядке. Эта таблица уже имеет размеры, с которыми можно работать. А вот когда я ее "на лету" создаю возникает такая проблема... Причем опять же: она печатается. Все нрмально. Именно что ее столбцы выравниваются отчего-то именно после печати, вот я и думаю что с ней такого там происходит и как бы это еще "до печати" получить.
...
Рейтинг: 0 / 0
Помогите с печатью TableView (JavaFx 8)
    #39353688
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RuslanGabЕсли таблица "рабочая" представленная на сцене и печатать непосредственно ее (такое у меня есть в другом фрагменте), то все в порядке.
Вот и забей. По крайней мере можно окно невидимым сделать.
Ну или печатать то что видно на экране (предпросмотр).
...
Рейтинг: 0 / 0
Помогите с печатью TableView (JavaFx 8)
    #39353702
RuslanGab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123,
Ну да. Согласен. Сделать можно и даже не сказать что это трудно, НО ведь хочется сделать ХОРОШО. Не люблю я костыли:) Тем более оно же работает по сути своей. Она даже размеры столбцов совершенно верно по содержимому подгоняет, но уже ПОСЛЕ, блин, печати (посмотрите в коде в самом низу закоментированные строки).
Витает мысль лезть в дебаггер с последующей обработкой ее Skin через рефлексию, но блин это уже тоже костыль вот и думаю что что-то а-ля "refresh", "sktivateScene" etc. должно быть но я это просто найти не могу:( Ведь это при печати происходит на каком-то этапе!
...
Рейтинг: 0 / 0
Помогите с печатью TableView (JavaFx 8)
    #39353710
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RuslanGab,
дело ваше.
Я между динамикой (сколько у вас строк) и статикой (FXML разметка) всегда выбираю статику.
Там всё инициализируется автоматом платформой.
Удачи!
...
Рейтинг: 0 / 0
Помогите с печатью TableView (JavaFx 8)
    #39353827
RuslanGab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Докопался!
Не могу сказать что решение мне нравится, но работает. С помощью дебаггера нашел что делает этот принтер, отчего столбцы получают свою щирину, так что если кому интересно...

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


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