Нарисуйте JPanel в BufferedImage или распечатайте его, не отображая его на экране - PullRequest
1 голос
/ 08 марта 2011

Изобразите это ... Графический интерфейс программы JFrame, который разделен на 2, EAST и WEST. Первый JPanel - просто экран предварительного просмотра. На стороне ВОСТОК JFrame пользователь может создать изображение размером 1, 2 или 3. Пользователь нажимает кнопку «Добавить», и определенное изображение справа переходит на панель слева. Таким образом, если пользователь нажимает «Добавить» 3 раза с изображениями разного размера, то панель использует FlowLayout для организации добавленных изображений панели, добавленных слева.

Когда вы запускаете этот код, вы можете увидеть своего рода представление о том, что я хочу. На самом деле было бы неплохо создать все это за пределами экрана и назвать его MainPanel. Затем заставьте printPreview расширить MainPanel и уменьшить его для просмотра на экране. И пусть метод Printable раскрасит MainPanel в метод печати, который будет иметь правильный размер.

Итак, мой вопрос ... -Можете ли вы скопировать или нарисовать JPanel до того, как он отобразится на экране? -Есть лучший способ сделать то, что я хочу, я FlowLayout решительно решаю, что я хочу, поэтому JPanel, кажется, ответ, если нет чего-то, о чем я не знаю.

Хорошо, теперь, когда это изображено. Я построил некоторый код, примерно такой же SSCCE, как только могу.

Ребята, я пытался задать этот вопрос на форумах New To Java, и они просто не отвечают, я специально не публикуюсь дважды, я полностью переписал это с нуля.

import javax.swing.*;
import java.awt.*;
import java.awt.image.*;
import java.awt.print.*;
import java.awt.event.*;

public class PrintGrid extends JFrame {

    Paper paper = new Paper();

    PrintGrid() {
        super("Check out this grid panel");
        setSize(672, 750);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);



        add(paper);
        setVisible(true);

    } // end PrintGrid constructor



    // **************************
    // ****** PAPER CLASS *******
    // **************************
    private class Paper extends JPanel {

        final int PAPER_X = 672, PAPER_Y = 975, UNIT = 12, DPI = 72;
        X1 x1a = new X1(), x1b = new X1(), x1c = new X1();
        X2 x2a = new X2(), x2b = new X2(), x2c = new X2();
        X3 x3a = new X3(), x3b = new X3(), x3c = new X3();

        Paper() {
            setPreferredSize(new Dimension(PAPER_X, PAPER_Y));
            setBackground(Color.GRAY);
            setLayout(new FlowLayout(FlowLayout.LEADING));

            //Users will manually add different sizes to this sheet.
            add(x1a);
            add(x2a);
            add(x3a);
            add(x1b);
            add(x1c);
            add(x2b);
            add(x3b);
        }


        // ******* Parent Class for GridUnits *******
        abstract class GridUnit extends JPanel {

            MouseListen ml = new MouseListen();
            float alpha = 1.0f;

            GridUnit() {
                this.addMouseListener(ml);
            }

            public void paintComponent(Graphics g) {
                super.paintComponent(g);
                this.setBackground(Color.BLACK);

                Graphics2D g2 = (Graphics2D) g;
                g2.setComposite(makeComposite(alpha));

                g.setColor(Color.WHITE);
                g.drawRect(0, 0, this.getWidth()-1, this.getHeight()-1);

                g.setColor(Color.darkGray);
                g.fillRect(15, 15, this.getWidth()-30, this.getHeight()-30);

            } // end paintComponent.

            private AlphaComposite makeComposite(float alpha) {
                int type = AlphaComposite.SRC_OVER;
                return(AlphaComposite.getInstance(type, alpha));
            }

            void click() {
                setVisible(false);
            }
            void entered() {
                alpha = 0.8f;
                repaint();

            }
            void exited() {
                alpha = 1.0f;
                repaint();
            }

            class MouseListen extends MouseAdapter {
                public void mouseEntered(MouseEvent event) {
                    entered();
                }
                public void mouseExited(MouseEvent event) {
                    exited();
                }
                public void mousePressed(MouseEvent event) {
                    click();
                }
            }

        } // end GridUnit class

        class X1 extends GridUnit {
            X1() {
                setPreferredSize(new Dimension(UNIT*13, UNIT*18));
            }
        } // end X1 Class

        class X2 extends GridUnit {
            X2() {
                setPreferredSize(new Dimension(UNIT*26, UNIT*18));
            }
        } // end X1 Class

        class X3 extends GridUnit {
            X3() {
                setPreferredSize(new Dimension(UNIT*39, UNIT*18));
            }
        } // end X1 Class

    } // end Paper class.



    public static void main(String[] args) {
        new PrintGrid();
    } // end main method.

} //  end PrintGrid class.

1 Ответ

3 голосов
/ 08 марта 2011

Довольно просто зарисовать любой компонент Java в изображение за пределами экрана, из которого вы можете делать, как вам угодно, включая копирование части или масштабированного изображения в конечную цель.,Нарисуйте BufferedImage, затем скопируйте изображение в целевой компонент.С макушки головы, что-то вроде:

void paintComponent(Graphics g) {
    BufferedImage img=new BufferedImage(getWidth(),getHeight(),BufferedImage.TYPE_INT_ARGB);
    Graphics2D    gph=(Graphics2D)img.getGraphics();

    // paint to gph here
    gph.dispose();

    g.drawImage(img);  // paints the contents of img to the component's graphics context.
    }
...