gpt4 book ai didi

java - Swing组件占用大量内存

转载 作者:行者123 更新时间:2023-11-29 05:03:42 28 4
gpt4 key购买 nike

我用 JLabel 创建了一个表。我这样做是为了在调整标签所在的 Jpanel 大小时,文本将相应缩放。我最初忘记在 JFrame 上设置默认关闭操作,所以我最终在后台运行了它们的大量实例,直到 eclipse 说堆栈/堆已满。我添加了它,所以现在它可以正确关闭,但是它让我想知道它的一个实例占用了多少。当它以默认大小时启动时,它只占用大约 24000K。如果你经常移动它,它会偷看大约 200000K,如果你不理它,它会坐在 180000K。为什么我的程序占用这么多内存?

/**
* 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);
}

}

最佳答案

你会想 profile可以肯定的是,但专注于 componentResized() 的实现可能会有所帮助。随着封闭容器的大小调整,该方法将被重复调用。在处理程序中,您不断地在 while 循环中实例化一个新的 Font。至少,考虑使用 deriveFont() .特别注意 size 参数是一个 float,而您目前的计算似乎使用了 truncating integer division。 .

关于java - Swing组件占用大量内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31149294/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com