Swing组件占用大量内存

时间:2015-06-30 22:00:17

标签: java swing memory

我用JLabels创建了一个表。我这样做是为了在调整标签所在的Jpanel时调整文本大小。我最初忘了在JFrame上设置默认的关闭操作,所以我最终在背景中运行了大量的实例,直到eclipse说堆栈/堆已满。我补充说,所以现在它正确关闭,但它让我想知道它的一个实例占多少。当它启动到默认大小时,它只需要大约24000K。如果你把它移动很多,它会偷看大约200000K,如果你不管它就坐在180000 K.为什么我的程序占用了这么多内存?

/**
 * Class to create the specified table
 * @author CGordo01
 *
 */
public class WordDocumentTable extends JPanel{
    Font f;
    // Holds all the label, is used for resizing
    ArrayList<JLabel> allLabels= new ArrayList<JLabel>();
    /**
     * Creates the table
     */
    public WordDocumentTable(){

        // Sets the layout to a gridBagLayout
        this.setLayout(new GridBagLayout());
        //Adds a component listener
        this.addComponentListener(new ComponentAdapter() {
            @Override
            /**
             * If the component is resized makes the text fit the dimensions
             */
            public void componentResized(ComponentEvent e) {
                // Boolean used to see if the text width fits the component.
                Boolean fits= false;

                // value used to divide the components height by.
                int divider = 16;

                // Makes the font size scale according to the width and height.
                while(fits == false){
                    f = new Font("SansSerif", Font.PLAIN, e.getComponent().getHeight()/divider);
                    for (int i = 0; i<allLabels.size();i++){
                        allLabels.get(i).setFont(f);
                        //System.out.println(divider);
                        if(allLabels.get(i).getGraphics().getFontMetrics().stringWidth(allLabels.get(i).getText())>allLabels.get(i).getWidth()){
                            fits = false;
                            divider++;
                            break;
                        }
                        else{
                            fits = true;
                        }

                    }
                }
            }
        });
        makeLeftCells();

        makeMidCells();

        makeLongCells();

        makeTopCells();

    }
    /**
     * Creates the cells that are in between widths of the other cells
     */
    private void makeMidCells() {
        GridBagConstraints midCells = new GridBagConstraints();
        midCells.fill= GridBagConstraints.BOTH;
        midCells.weightx=1;
        midCells.weighty=1;
        midCells.gridwidth=4;
        midCells.gridy=9;
        midCells.gridx=1;

        JLabel b = new JLabel();
        b.setText(".Batch Total    " + "    985124  " + "      Patches ");
        b.setName("Previous Batch Total");
        b.setBackground(Color.white);
        b.setBorder(new LineBorder(Color.black));
        b.setOpaque(true);
        b.setFont(f);
        this.add(b,midCells);

        midCells.gridx=5;
        JLabel b2 = new JLabel();
        b2.setText(".Shift Total    " + "    985124  " + "      Patches ");
        b2.setName("Previous Shift Total");
        b2.setBackground(Color.white);
        b2.setBorder(new LineBorder(Color.black));
        b2.setOpaque(true);
        b2.setFont(f);
        this.add(b2,midCells);

        midCells.gridy=12;
        midCells.gridx=1;

        JLabel c = new JLabel();
        c.setText(".Batch Total    " + "    985124  " + "      Patches ");
        c.setName("Batch Total");
        c.setBackground(Color.white);
        c.setBorder(new LineBorder(Color.black));
        c.setOpaque(true);
        c.setFont(f);
        this.add(c,midCells);

        midCells.gridx=5;
        JLabel c2 = new JLabel();
        c2.setText(".Shift Total    " + "    985124  " + "      Patches ");
        c2.setName("Shift Total");
        c2.setBackground(Color.white);
        c2.setBorder(new LineBorder(Color.black));
        c2.setOpaque(true);
        c2.setFont(f);
        this.add(c2,midCells);

        allLabels.add(b);
        allLabels.add(b2);
        allLabels.add(c);
        allLabels.add(c2);
    }

        /**
         * Creates the cells which span much of the grid
         */
        private void makeLongCells() {
            GridBagConstraints longCells = new GridBagConstraints();
        longCells.fill= GridBagConstraints.BOTH;
        longCells.weightx=1;
        longCells.weighty=1;
        longCells.gridwidth=8;
        longCells.gridx=1;
        longCells.gridy=7;

        JLabel b = new JLabel();
        b.setText("Finish the Batch");
        b.setName("Previous Shift Goal");
        b.setBackground(Color.white);
        b.setBorder(new LineBorder(Color.black));
        b.setOpaque(true);
        b.setFont(f);
        this.add(b,longCells);

        longCells.gridy=8;

        JLabel c = new JLabel();
        c.setText("<html><p> blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah</p></html>");
        c.setName("Previous Shift Notes");
        c.setBackground(Color.white);
        c.setBorder(new LineBorder(Color.black));
        c.setOpaque(true);
        c.setFont(f);
        this.add(c,longCells);

        longCells.gridy=10;

        JLabel d = new JLabel();
        d.setText("Shift Goal");
        d.setName("Shift Goal");
        d.setBackground(Color.white);
        d.setBorder(new LineBorder(Color.black));
        d.setOpaque(true);
        d.setFont(f);
        this.add(d,longCells);

        longCells.gridy=11;

        JLabel e = new JLabel();
        e.setText("Shift Notes");
        e.setName("Shift Goal");
        e.setBackground(Color.white);
        e.setBorder(new LineBorder(Color.black));
        e.setOpaque(true);
        e.setFont(f);
        this.add(e,longCells);

        longCells.gridy=13;

        JLabel f2 = new JLabel();
        f2.setText("");
        f2.setName("WO Schedule Note");
        f2.setBackground(Color.white);
        f2.setBorder(new LineBorder(Color.black));
        f2.setOpaque(true);
        f2.setFont(f);
        this.add(f2,longCells);

        longCells.gridy=14;

        JLabel g = new JLabel();
        g.setText("");
        g.setName("Supervisor");
        g.setBackground(Color.white);
        g.setBorder(new LineBorder(Color.black));
        g.setOpaque(true);
        g.setFont(f);
        this.add(g,longCells);

        allLabels.add(b);
        allLabels.add(c);
        allLabels.add(d);
        allLabels.add(e);
        allLabels.add(f2);
        allLabels.add(g);

    }
    /**
     * Creates a 8x7 grid of small cells 
     */
    private void makeTopCells() {
        GridBagConstraints topCells = new GridBagConstraints();
        topCells.fill= GridBagConstraints.BOTH;
        topCells.weighty=1;
        topCells.weightx=1;
        for (int i = 0; i < 8; i++)
        {
            topCells.gridx=i+1;
            for (int j = 0; j < 7; j++)
            {
                topCells.gridy=j;
                JLabel b = new JLabel();
                b.setText("" + i + j);
                b.setName("" + i + j);
                b.setOpaque(true);
                b.setFont(f);
                if(j==0){
                    b.setBackground(new Color(242,242,242));
                }
                else{
                    b.setBackground(Color.white);
                }
                b.setBorder(new LineBorder(Color.black));
                allLabels.add(b);
                this.add(b,topCells);
            }
        }

    }

    private void makeLeftCells() {
        GridBagConstraints leftCells = new GridBagConstraints();

        leftCells.fill = GridBagConstraints.BOTH;
        leftCells.gridx = 0;
        leftCells.gridy = 0;
        leftCells.weightx=2;
        leftCells.weighty=1;

        JLabel titleBlock = new JLabel();
        titleBlock.setOpaque(true);
        titleBlock.setText("Delta Hydrogel A");
        titleBlock.setForeground(Color.white);
        titleBlock.setBackground(new Color(79,129,189));
        titleBlock.setBorder(new LineBorder(Color.black));
        titleBlock.setFont(f);

        this.add(titleBlock, leftCells);

        leftCells.gridy = 1;
        leftCells.gridheight=3;

        JLabel tallBlock1 = new JLabel();
        tallBlock1.setOpaque(true);
        tallBlock1.setText(".Day Shift");
        tallBlock1.setForeground(Color.black);
        tallBlock1.setBackground(new Color(242,242,242));
        tallBlock1.setBorder(new LineBorder(Color.black));
        tallBlock1.setFont(f);
        this.add(tallBlock1, leftCells);



        JLabel tallBlock2 = new JLabel();
        tallBlock2.setOpaque(true);
        tallBlock2.setText(".Night Shift");
        tallBlock2.setForeground(Color.black);
        tallBlock2.setBackground(new Color(242,242,242));
        tallBlock2.setBorder(new LineBorder(Color.black));
        tallBlock2.setFont(f);
        leftCells.gridy = 4;

        this.add(tallBlock2, leftCells);

        JLabel shortBlock1 = new JLabel();
        shortBlock1.setOpaque(true);
        shortBlock1.setText(".Previous Shift Goal");
        shortBlock1.setForeground(Color.black);
        shortBlock1.setBackground(new Color(242,242,242));
        shortBlock1.setBorder(new LineBorder(Color.black));
        shortBlock1.setFont(f);
        leftCells.gridy = 7;
        leftCells.gridheight=1;

        this.add(shortBlock1, leftCells);

        JLabel shortBlockTall = new JLabel();
        shortBlockTall.setOpaque(true);
        shortBlockTall.setText(".Previous Shift Notes");
        shortBlockTall.setForeground(Color.black);
        shortBlockTall.setBackground(new Color(242,242,242));
        shortBlockTall.setBorder(new LineBorder(Color.black));
        shortBlockTall.setFont(f);
        leftCells.gridy = 8;
        leftCells.ipady=50;

        this.add(shortBlockTall, leftCells);

        JLabel shortBlock2 = new JLabel();
        shortBlock2.setOpaque(true);
        shortBlock2.setText(".Previous Shift Output");
        shortBlock2.setForeground(Color.black);
        shortBlock2.setBackground(new Color(242,242,242));
        shortBlock2.setBorder(new LineBorder(Color.black));
        shortBlock2.setFont(f);
        leftCells.gridy = 9;
        leftCells.ipady=0;


        this.add(shortBlock2, leftCells);

        JLabel shortBlock3 = new JLabel();
        shortBlock3.setOpaque(true);
        shortBlock3.setText(".Shift Goals");
        shortBlock3.setForeground(Color.black);
        shortBlock3.setBackground(new Color(184,204,228));
        shortBlock3.setBorder(new LineBorder(Color.black));
        shortBlock3.setFont(f);
        leftCells.gridy = 10;
        leftCells.ipady=0;


        this.add(shortBlock3, leftCells);


        JLabel shortBlock4 = new JLabel();
        shortBlock4.setOpaque(true);
        shortBlock4.setText(".Shift Notes");
        shortBlock4.setForeground(Color.black);
        shortBlock4.setBackground(new Color(184,204,228));
        shortBlock4.setBorder(new LineBorder(Color.black));
        shortBlock4.setFont(f);
        leftCells.gridy = 11;
        leftCells.ipady=0;


        this.add(shortBlock4, leftCells);

        JLabel shortBlock5 = new JLabel();
        shortBlock5.setOpaque(true);
        shortBlock5.setText(".Output");
        shortBlock5.setForeground(Color.black);
        shortBlock5.setBackground(new Color(184,204,228));
        shortBlock5.setBorder(new LineBorder(Color.black));
        shortBlock5.setFont(f);
        leftCells.gridy = 12;


        this.add(shortBlock5, leftCells);

        JLabel shortBlock6 = new JLabel();
        shortBlock6.setOpaque(true);
        shortBlock6.setText(".WO Schedule Note");
        shortBlock6.setForeground(Color.black);
        shortBlock6.setBackground(new Color(184,204,228));
        shortBlock6.setBorder(new LineBorder(Color.black));
        shortBlock6 .setFont(f);
        leftCells.gridy = 13;

        this.add(shortBlock6, leftCells);

        JLabel shortBlock7 = new JLabel();
        shortBlock7.setOpaque(true);
        shortBlock7.setText(".Supervisor");
        shortBlock7.setForeground(Color.black);
        shortBlock7.setBackground(new Color(184,204,228));
        shortBlock7.setBorder(new LineBorder(Color.black));
        shortBlock7.setFont(f);
        leftCells.gridy = 14;

        this.add(shortBlock7, leftCells);

        allLabels.add(titleBlock);
        allLabels.add(tallBlock1);
        allLabels.add(tallBlock2);
        allLabels.add(shortBlock1);
        allLabels.add(shortBlockTall);
        allLabels.add(shortBlock2);
        allLabels.add(shortBlock3);
        allLabels.add(shortBlock4);
        allLabels.add(shortBlock5);
        allLabels.add(shortBlock6);
        allLabels.add(shortBlock7);



    }
    public static void main (String[] args)
    {
        JFrame J = new JFrame();
        J.setSize(600,400);
        J.setVisible(true);


        WordDocumentTable wdc= new WordDocumentTable();

        J.setContentPane(wdc);
        J.setVisible(true);
        J.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

}

1 个答案:

答案 0 :(得分:3)

您需要profile确定,但可能有助于关注componentResized()的实施。随着封闭容器的大小调整,将重复调用该方法。在处理程序中,您将在Font循环内不断实例化新的while。至少,请考虑使用deriveFont()。请特别注意size参数是float,而您当前的计算似乎使用truncating integer division