2010-08-11 74 views
1

我在一个swing应用程序中有一个JTable。我写了一个快速而脏的un-dock操作,其中JTable从其默认父项中移除,并被添加到单独的JFrame中。当JTable脱离并放置在一个单独的JPane上时,它在JTable中移动时真的很慢......只要我将它重新放回原始位置,它就会再次正常运行......下面是代码对开.. 任何想法? 谢谢JTable很慢

JTable中UNDOCKER

public class MatrixWindowUndocker implements ActionListener{ 

private static final Logger logger = Logger.getLogger(
     MatrixWindowUndocker.class.getName()); 
MatrixVerifier mv; 

public MatrixWindowUndocker(MatrixVerifier mv) 
{ 
    this.mv = mv; 
} 

public void actionPerformed(ActionEvent e) 
{ 
    undockMatrixPanel(mv); 
} 

private static void undockMatrixPanel(MatrixVerifier mv) 
{ 
    JFrame undockedFrame = mv.undockedWindowFrame; 

    undockedFrame.setDefaultCloseOperation(
      WindowConstants.DO_NOTHING_ON_CLOSE); 

    locateFrame(undockedFrame); 

    mv.mainMatrixTablePanel.remove(mv.mainMatrixTableScrollPane); 
    undockedFrame.setLayout(new BorderLayout()); 
    undockedFrame.add(mv.mainMatrixTableScrollPane); 
    mv.pdfAndMetadata_JPanel.remove(mv.table_pdf_splitter); 
    mv.pdfAndMetadata_JPanel.add(mv.pdfDrawCanvasPanel); 
    mv.pack(); 
    mv.setExtendedState(JFrame.MAXIMIZED_BOTH); 
    undockedFrame.pack(); 
    undockedFrame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
    mv.undockedFrame = undockedFrame; 
    undockedFrame.setVisible(true); 
} 

private static void locateFrame(JFrame frame) 
{ 
    GraphicsConfiguration gc = null; 
    GraphicsDevice[] gds = GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices(); 
    logger.debug("gds.length: " + gds.length); 

    if (gds != null && gds.length > 1) 
    { 
     gc = gds[1].getDefaultConfiguration(); 
    } 
    else 
    { 
     gc = gds[0].getDefaultConfiguration(); 
    } 
    frame.setLocation(10 + gc.getBounds().x, 10 + gc.getBounds().y); 
} 

}

JTable中泊坞窗

public class MatrixWindowDocker implements ActionListener {

MatrixVerifier mv; 

public void setMv(MatrixVerifier mv) 
{ 
    this.mv = mv; 
} 

public MatrixWindowDocker(MatrixVerifier mv) 
{ 
    this.mv = mv; 
} 

/** 
* Main action method. 
* @param e 
*/ 
public void actionPerformed(ActionEvent e) 
{ 
    dockMatrixPanel(mv); 
} 

private static void dockMatrixPanel(MatrixVerifier mv) 
{ 
    if (mv.undockedFrame != null) 
    { 
     mv.undockedFrame.dispose(); 

     mv.pdfAndMetadata_JPanel.setAlignmentX(0.8F); 
     mv.pdfAndMetadata_JPanel.setMinimumSize(new java.awt.Dimension(550, 
       0)); 
     mv.pdfAndMetadata_JPanel.setPreferredSize(new java.awt.Dimension(800, 
       0)); 
     mv.pdfAndMetadata_JPanel.setLayout(new java.awt.BorderLayout()); 

     mv.table_pdf_splitter.setDividerLocation(.60); 
     mv.table_pdf_splitter.setDividerSize(2); 
     mv.table_pdf_splitter.setResizeWeight(0.3); 
     mv.table_pdf_splitter.setDividerLocation(0.50); 

     mv.pdfAndMetadata_JPanel.add(mv.table_pdf_splitter, 
       java.awt.BorderLayout.CENTER); 

     mv.table_pdf_splitter.setLeftComponent(mv.pdfDrawCanvasPanel); 

     mv.mainMatrixTablePanel.setLayout(new java.awt.BorderLayout()); 
     mv.mainMatrixTableScrollPane.setViewportView(mv.metadataTable_JTable); 

     mv.mainMatrixTablePanel.add(mv.mainMatrixTableScrollPane, 
       java.awt.BorderLayout.CENTER); 
     mv.table_pdf_splitter.setRightComponent(mv.mainMatrixTablePanel); 
    } 
} 

}

回答

1

没有包含在JDK中一个基本的探查从JDK 1.6,我想叫jvisualvm。你可以试着用它来看看发生了什么。更好的将是一个真正的分析器,但唯一好的是支付,虽然有些人有30天免费试用。