Graphics.fill (Shape) без растровых - PullRequest
2 голосов
/ 24 января 2012

Я печатаю компонент свинга на различных принтерах. У одного из этих принтеров большие проблемы с альфа-каналами. Если у чего-либо на экране есть альфа-канал, получающийся размер катушки огромен. По большей части я исключил альфа-каналы. Тем не менее, есть элемент, который использует Graphics2d.fill(Shape), чтобы заполнить фигуру несколькими хэш-линиями, чтобы вы могли видеть, что скрывается за хешами. Есть ли способ достичь этого, не растрачивая альфа-информацию к объекту Graphics во время печати?

Я считаю, что принтер был бы счастливее, если бы хэшированные строки были сгенерированы с использованием вызовов Graphics.drawLine() вместо fill(Shape), но форма, которую я заполняю, очень сложна (это линейный график). Есть ли способ заполнить фигуру нарисованными линиями, что сделает принтер счастливее? Кажется, что все реализации Paint по своей сути основаны на растре.

Кроме этого, есть ли способ сказать, что изображение полностью прозрачное или нет? Поможет ли это с размером катушки на принтере?

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

public class BufferedImagePrint extends JComponent implements Runnable, Printable {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new BufferedImagePrint());
    }

    public void run() {
        setPreferredSize(new Dimension(128, 128));
        final JOptionPane optionPane = new JOptionPane(this, JOptionPane.PLAIN_MESSAGE, JOptionPane.OK_CANCEL_OPTION, null, new Object[]{
                "Print",
                "Cancel"});
        final JDialog dialog = optionPane.createDialog("Painting Transparent Image");
        dialog.setResizable(true);
        dialog.setVisible(true);
        if ("Print".equals(optionPane.getValue())) {
            doPrint();
        }
    }

    private void doPrint() {
        try {
            final PrinterJob printerJob = PrinterJob.getPrinterJob();
            printerJob.setPrintable(this);
            if(printerJob.printDialog()) {
            printerJob.print();
        }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    protected void paintComponent(final Graphics g) {
        // draw horizontal lines
        g.setColor(Color.BLACK);
        for (int i=0; i<getWidth(); i+=3) {
            g.drawLine(0, i, getWidth(), i);
        }

        final BufferedImage img = new BufferedImage(32, 32, BufferedImage.TYPE_INT_ARGB_PRE);
        final Graphics2D textureGraphics = img.createGraphics();
        textureGraphics.setColor(Color.BLACK);
        for (int i=0; i<32; i+=4) {
            textureGraphics.drawLine(i, 0, i, 32);
        }
        textureGraphics.dispose();
        final TexturePaint paint = new TexturePaint(img, new Rectangle(32, 32));
        ((Graphics2D)g).setPaint(paint);
        g.fillOval(0, 0, getWidth(),  getHeight());
    }

    public int print(final Graphics graphics, final PageFormat pageFormat, final int pageIndex) throws PrinterException {
        if (pageIndex == 0) {
            paintComponent(graphics);
            return PAGE_EXISTS;
        } else {
            return NO_SUCH_PAGE;
        }
    }
}

Ответы [ 2 ]

1 голос
/ 25 января 2012

Не могли бы вы нарисовать фигуру во временное изображение, а затем нарисовать изображение (вместо фигуры) на принтере?

0 голосов
/ 05 марта 2012

Рассматривали ли вы рисовать хеш-линии, используя сложную форму в качестве клипа?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...