簡體   English   中英

保存(繪制)JPanel,而不顯示它

[英]save(paint) JPanel without displaying it

我有這個JPanels列表,我想保存它們而不顯示它們,使Jpanel->保存它(不顯示它)

我嘗試使用BufferedImage並將其繪制,但是返回的圖像始終為黑色,我使用的方法是“保存”,並顯示在下面的代碼中。

我想知道如何解決此問題。

編輯:

@camickr感謝您的建議和此主題

為什么JTable標頭沒有出現在圖像中?

我能夠解決問題,這是固定的代碼:

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();
        }
    }
}

我對主題的標題進行了編輯,以使標題更清晰,如果您有任何建議,歡迎他們的參與。

再次感謝大家:)

如果尚未將組件添加到可見框中,則組件的大小為(0,0),因此無需繪制任何內容。 另外,由於尚未調用布局管理器,因此未將組件放置在面板上。

因此,您首先需要:

  1. 設置組件的大小等於首選大小
  2. 在組件上調用doLayout()

或者,您可以簽出為您執行上述操作的屏幕圖像 ,該屏幕圖像可用於創建任何組件的圖像。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM