保存(绘制)JPanel而不显示它

时间:2018-03-25 16:10:59

标签: java swing jpanel

我有这个JPanel列表,我想保存它们而不显示它们 制作Jpanel - >保存(不显示)

我尝试使用BufferedImage并将其绘制,但返回的图像始终为黑色,我使用的方法是"保存"并显示在下面的代码中。

我想知道如何解决这个问题。

编辑:

@camickr感谢你的建议和这个帖子

Why does the JTable header not appear in the image?

我能够解决问题,这是固定代码:

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;

public class Solution extends JFrame
{
    int i;
    ArrayList <Individual> AKA;
    Container jgraph;
    JButton gauche;
    JButton droite;
    JMenuBar barre;
    JMenu fichier;
    JMenuItem enregistrer;
    JPanel jpgenerale ;
    Solution current;
    Component middle;

    public Solution(ArrayList <Individual> graph) throws HeadlessException 
    {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        barre = new JMenuBar();

        fichier = new JMenu("Fichier");

        enregistrer = new JMenuItem("Enregistrer");
        enregistrer.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, KeyEvent.CTRL_DOWN_MASK));

        fichier.add(enregistrer);
        barre.add(fichier);

        AKA = graph;
        current = this;
        gauche = new JButton("Gauche");
        droite = new JButton("Droite");
        getContentPane().setLayout(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();
        c.fill = GridBagConstraints.HORIZONTAL;
        c.anchor = GridBagConstraints.PAGE_END;

        c.gridx = 1;
        c.gridy = 2;
        gauche.addActionListener(new ActionListener()
            {
                @Override
                public void actionPerformed(java.awt.event.ActionEvent e)
                {
                    i = (AKA.size() + (i - 1)) % AKA.size();
                    jpgenerale.removeAll();
                    jpgenerale.validate();

                    jpgenerale.add(AKA.get(i).chopper.getContentPane());

                    jpgenerale.revalidate();
                    jpgenerale.repaint();
                }
            });
        getContentPane().add(gauche, c);

        c.gridx = 3;
        c.gridy = 2;
        droite.addActionListener(new ActionListener()
            {
                @Override
                public void actionPerformed(java.awt.event.ActionEvent e)
                {
                    i = (i+1)% AKA.size();
                    jpgenerale.removeAll();
                    jpgenerale.validate();

                    jpgenerale.add(AKA.get(i).chopper.getContentPane());

                    jpgenerale.revalidate();
                    jpgenerale.repaint();
                }
            });
        getContentPane().add(droite, c);

        jpgenerale = new JPanel();
        c.anchor = GridBagConstraints.CENTER;
        jpgenerale.setLayout(new BoxLayout(jpgenerale,BoxLayout.LINE_AXIS));
        jpgenerale.setPreferredSize(new Dimension(400, 400));
        jpgenerale.add(AKA.get(0).chopper.getContentPane());

        c.ipady = 40;
        c.gridx = 2;
        c.gridy = 1;
        getContentPane().add(jpgenerale,c);

        setTitle("AGPM");// le titre on va change plutard
        setSize(600,600);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setVisible(true);

        middle = AKA.get(0).chopper.getContentPane();
        scan(middle);
        middle = AKA.get(1).chopper.getContentPane();
        scan(middle);

    }


    private static void scan(Component pan1)
    {
        JPanel temp = new JPanel();
        temp.setBackground(Color.WHITE);//so that the image and JPanel background are unified
        temp.setPreferredSize(new Dimension(400, 400));
        temp.add(pan1);

        BufferedImage bi = ScreenImage.createImage(temp);

        try {
            ScreenImage.writeImage(bi, "image.png");
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

我编辑了帖子的标题,以便它更清晰,如果您有任何建议,欢迎他们。

再次感谢大家:)

1 个答案:

答案 0 :(得分:1)

如果组件未添加到可见框架中,则组件的大小为(0,0),因此无需绘制任何内容。此外,由于尚未调用布局管理器,因此组件尚未定位在面板上。

所以你首先需要:

  1. 将组件的大小设置为首选大小
  2. 在组件上调用doLayout()
  3. 或者,您可以查看为您执行上述操作的Screen Image,并可用于创建任何组件的图像。