Как добавить фоновое изображение в JTable при печати? - PullRequest
3 голосов
/ 10 августа 2011

Я хочу напечатать JTable с фоновым изображением или водяным знаком.Мой код:

public void actionPerformed(ActionEvent ae)
{
    boolean status=false;

    MessageFormat header = null;
    header = new MessageFormat("Header");
    MessageFormat footer = null;
    footer = new MessageFormat("Page");

    boolean fitWidth = true;
    boolean showPrintDialog = true;
    boolean interactive = true;

    /* determine the print mode */
    JTable.PrintMode mode = fitWidth ? JTable.PrintMode.FIT_WIDTH
                                     : JTable.PrintMode.NORMAL;

    try
    {
        status = jt.print(mode, header, footer,showPrintDialog,null,interactive);

        if(status ==true)
        {
            frame.dispose();
        }
    }
    catch(Exception ee)
    {
        System.out.println(ee.getMessage());
    }
}

Как я могу передать или установить фоновое изображение этим методом?

Ответы [ 2 ]

3 голосов
/ 10 августа 2011

Проблема состоит из двух частей

  • печать изображение на каждой странице
  • убедитесь, что изображение "просвечивает" стол

второй адрес @mKorbel (хотя на самом деле не решен, потому что нет хорошего решения :-)

Чтобы решить первое, я бы пошел для пользовательского Printable и подкласса JTable, чтобы вернуть его, что-то вроде

public class BackgroundPrintable implements Printable {

    Printable tablePrintable;
    JTable table;
    MessageFormat header; 
    MessageFormat footer;
    BufferedImage background;

    public BackgroundPrintable(MessageFormat header, MessageFormat footer) {
        this.header = header;
        this.footer = footer;
    }

    public void setTablePrintable(JTable table, Printable printable) {
        tablePrintable = printable;        
        this.table = table;
    }

    @Override
    public int print(Graphics graphics, PageFormat pageFormat, 
            int pageIndex) throws PrinterException {
        printImage(graphics, pageFormat, pageIndex);
        int exists = tablePrintable.print(graphics, pageFormat, pageIndex);
        if (exists != PAGE_EXISTS) {
            return exists;
        }
        return PAGE_EXISTS;        
    }

    private void printImage(Graphics graphics, PageFormat pageFormat,
            int pageIndex) {
        // grab an untainted graphics
        Graphics2D g2d = (Graphics2D)graphics.create();
        // do the image painting 
        ....
        // cleanup  
        g2d.dispose();
    }

}

// use in JTable subclass
@Override
public Printable getPrintable(PrintMode printMode,
        MessageFormat headerFormat, MessageFormat footerFormat) {
    Printable printable = super.getPrintable(printMode, null, null);
    BackgroundPrintable custom = new BackgroundPrintable(headerFormat, footerFormat);
    custom.setTablePrintable(this, printable);
    return custom;
}

Чтобы достичь второго, JTable и его средства визуализации должны быть прозрачными. Хитро, потому что:

  • возможно только при печати - в противном случае они должны иметь свою обычную непрозрачность
  • все рендера должны быть прозрачными, и не существует абсолютно безопасного способа получить их всех

Пользовательский JTable может попытаться добиться этого, принудительно установив непрозрачность компонента рендеринга в его prepareRenderer:

  @Override
   public Component prepareRenderer(TableCellRenderer renderer,
            int row, int column) {
        JComponent comp = (JComponent) super.prepareRenderer(renderer, row, column);
        if (isPaintingForPrint()) {
            comp.setOpaque(false);
        } else {
            comp.setOpaque(true);
        }   
        return comp;
   }

На самом деле, это не совсем верно: код в блоке else может быть неправильным для естественных прозрачных компонентов. Боюсь, нет действительно надежного решения.

3 голосов
/ 10 августа 2011

нет простого способа установить что-либо для BackGround для всего JTable , но JViewPort из JScrollPane может сделать это легко, поэтому не имеет значения,внутри JScrollPane a JTable или другого JComponents

например

import java.awt.*;
import javax.swing.*;

class ImageAsTableBackround {

    private JScrollPane sp;
    private JTable table;
    private String[] head = {"One", "Two", "Three", "Four", "Five", "Six"};
    private String[][] data = new String[25][6];

    public void buildGUI() {
        sp = new JScrollPane();

// uncomment these codes lines for panting an image from package, 
// but then block code table = new TableBackroundPaint0(data, head);
        //sp.setViewport(new ImageViewport());
        //table = new JTable(data, head);
        //table.setOpaque(false);

// code for painting from generated code    
        table = new TableBackroundPaint0(data, head);

        table.setBackground(new Color(0, 0, 0, 0));
        table.setFillsViewportHeight(true);
        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        sp.setViewportView(table);
        JFrame frame = new JFrame();
        frame.getContentPane().add(sp);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

    class ImageViewport extends JViewport {

        private static final long serialVersionUID = 1L;
        private Image img;

        public ImageViewport() {
            try {
                ImageIcon image = new ImageIcon(getClass().getResource("resources/PICT6090.jpg"));
                img = image.getImage();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            if (img != null) {
                g.drawImage(img, 0, 0, this.getWidth(), this.getHeight(), this);
            } else {
                g.drawString("This space for rent", 50, 50);
            }
        }
    }

    class TableBackroundPaint0 extends JTable {

        private static final long serialVersionUID = 1L;

        TableBackroundPaint0(Object[][] data, Object[] head) {
            super(data, head);
            setOpaque(false);
            ((JComponent) getDefaultRenderer(Object.class)).setOpaque(false);
        }

        @Override
        public void paintComponent(Graphics g) {
            Color background = new Color(168, 210, 241);
            Color controlColor = new Color(230, 240, 230);
            int width = getWidth();
            int height = getHeight();
            Graphics2D g2 = (Graphics2D) g;
            Paint oldPaint = g2.getPaint();
            g2.setPaint(new GradientPaint(0, 0, background, width, 0, controlColor));
            g2.fillRect(0, 0, width, height);
            g2.setPaint(oldPaint);
            for (int row : getSelectedRows()) {
                Rectangle start = getCellRect(row, 0, true);
                Rectangle end = getCellRect(row, getColumnCount() - 1, true);
                g2.setPaint(new GradientPaint(start.x, 0, controlColor, (int) ((end.x + end.width - start.x) * 1.25), 0, Color.orange));
                g2.fillRect(start.x, start.y, end.x + end.width - start.x, start.height);
            }
            super.paintComponent(g);
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new ImageAsTableBackround().buildGUI();
            }
        });
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...