代码之家  ›  专栏  ›  技术社区  ›  Abdelghani Bekka

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

  •  0
  • Abdelghani Bekka  · 技术社区  · 7 年前

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

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

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

    编辑:

    @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 回复  |  直到 7 年前
        1
  •  1
  •   camickr    7 年前

    如果尚未将组件添加到可见帧,则组件的大小为(0,0),因此没有要绘制的内容。此外,由于尚未调用布局管理器,因此组件尚未定位在面板上。

    因此,您首先需要:

    1. 将组件的大小设置为首选大小
    2. 在组件上调用doLayout()

    或者,你可以退房 Screen Image 它可以为您执行上述操作,并可用于创建任何组件的图像。