Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JTextPane и JTable, Печать JTextPane с вставленное JTable 
V
    Опции темы
hail
Дата 15.4.2011, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 26.1.2007

Репутация: нет
Всего: нет



Доброго времени суток!
У меня такая проблема:

Есть JTextPane в который я вставляю JScrollPane в которой находится JTable метододом textpane.insertComponent();
На экране все замечательно, но когда я пытаюсь это напечатать - вставленный компонент исчезает.

Как это можно напечатать?

Вот код:
Код

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.print.PrinterException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextPane;
import javax.swing.table.DefaultTableModel;


public class JTextPaneWithTable {
    JTextPane textPane;
    JTextPaneWithTable(){
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setLayout(new BorderLayout());
        textPane = new JTextPane();
        frame.add(new JScrollPane(), BorderLayout.CENTER);
        textPane.setText("Text, text, text\n");
        textPane.setCaretPosition(textPane.getDocument().getLength());
        textPane.insertComponent(getTable());
        frame.add(new JScrollPane(textPane), BorderLayout.CENTER);
        JButton print = new JButton("Печать");
        print.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent arg0) {
                try {
                    textPane.print();
                } catch (PrinterException e) {
                    e.printStackTrace();
                }
            }
        });
        frame.add(print, BorderLayout.SOUTH);
        frame.setSize(800, 600);
        frame.setVisible(true);
    }
    public JScrollPane getTable(){
        DefaultTableModel model = new DefaultTableModel(5,5);
        JTable table = new JTable(model);
        Dimension d = table.getPreferredSize();
        table.setPreferredScrollableViewportSize(d);
        return new JScrollPane(table);
    }
    public static void main(String[] args) {
        new JTextPaneWithTable();
    }

}

почему таблица пропадает???
PM MAIL   Вверх
dorogoyIV
Дата 16.4.2011, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 36
Всего: 46



Цитата(hail @  15.4.2011,  15:31 Найти цитируемый пост)
Как это можно напечатать?

проще всего сделать картинку и распечатать ее
Код

 Point p = textPane.getLocationOnScreen();
 Rectangle rect = new Rectangle(p.x - 1, p.y - 1, textPane.getWidth() + 1, textPane.getHeight() + 1);

  try
  {
   BufferedImage bi = new Robot().createScreenCapture(rect);
   PrinterJob job = PrinterJob.getPrinterJob();
   PageFormat pf = job.defaultPage();
   int x = (int)pf.getImageableX();
   int w = (int)pf.getImageableWidth();
   int y = (int)pf.getImageableY();
   job.cancel();
   // это нужно было для определения размера страницы...


   PrintJob pj = Toolkit.getDefaultToolkit().getPrintJob(..., "", null); // вместо точек подставить нужное значение
   Graphics g = pj.getGraphics();
   double k = (double)bi.getWidth() / (double)bi.getHeight(); // коэффициент отношения длины и ширины
   g.drawImage(bi, x, y, w, (int)((double)w / k), null);
   g.dispose();
   pj.end();
  }
  catch(Exception ex){}

PM MAIL   Вверх
hail
Дата 16.4.2011, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 26.1.2007

Репутация: нет
Всего: нет



Спасибо dorogoyIV благодаря этому ответу я закрыл другую проблему о которой не спрашивал, но это было очень кстати. Огромное спасибо.

А по поводу перевода в картинку используя new Robot().createScreenCapture(rect); - к сожалению таблица часто становиться больше чем окно по длине, а createScreenCapture(rect) дает только видимую часть :(

А куда и почему таблица вообще пропадает?
PM MAIL   Вверх
dorogoyIV
Дата 16.4.2011, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 36
Всего: 46



я конечно предполагал это - то, что, невидимая часть не будет распечатана...
тут нужно разобраться с пакетом javax.print.*
если будет время, попробую что то сделать...

пока что тебе нужно получить из JTextPane все компоненты и текст распечатать их...

PM MAIL   Вверх
hail
Дата 16.4.2011, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 26.1.2007

Репутация: нет
Всего: нет



Спасибо, буду ждать.

Есть конечно вариант получить текст, получить таблицу, переделать это в html код, загрузить в JTextPane как страницу и напечатать. Но это как-то не очень :(
PM MAIL   Вверх
dorogoyIV
Дата 16.4.2011, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 36
Всего: 46



Цитата(hail @  16.4.2011,  23:08 Найти цитируемый пост)
переделать это в html код

это по индусски  smile 

тогда уж лучше перевести все в формат *.pdf , и распечатать по страницам (по индусски  smile )

Это сообщение отредактировал(а) dorogoyIV - 16.4.2011, 23:46
PM MAIL   Вверх
hail
Дата 21.4.2011, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 26.1.2007

Репутация: нет
Всего: нет



Нашел. 
Сделал вот так, все отлично работает. 

Код

//JTextPane plan_tp - объявлено раньше.
for (Component component : plan_tp.getComponents()) {
    Container container = (Container) component;
    if (container.getComponent(0) instanceof JTable) {
        JTable tableI = (JTable) container.getComponent(0);
        int width;
        int height;
        BufferedImage image;
        JComponent compToSave = (JComponent)tableI;
        width = compToSave.getWidth();
        height = compToSave.getHeight();
        image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics2D g2r = image.createGraphics();
        compToSave.paint(g2r);
        g2r.dispose();
        ImageIcon ic=null;
        ic = new ImageIcon(image);
        int ofs = plan_tp.viewToModel(component.getLocation());
        plan_tp.setCaretPosition(ofs);
        plan_tp.insertIcon(ic);
        plan_tp.setSelectionStart(ofs + 1);
        plan_tp.setSelectionEnd(ofs + 2);
        plan_tp.replaceSelection("");
    }
}

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0733 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.