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