2010-08-11 5 views
1

J'ai une JTable dans une application de swing. J'ai écrit une opération sans dock rapide et sale où le JTable est enlevé de son parent par défaut et est ajouté à un JFrame séparé. Lorsque le JTable est détaché et placé sur un JPane séparé, il est vraiment lent à se déplacer dans le JTable ... dès que je le replace à sa place d'origine, il revient à l'action normale ... ci-dessous est le code pour le désancrage .. des idées? merciJTable très lent

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 DOCKER

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

}

Répondre

1

Il y a un profileur rudimentaire inclus dans le JDK de JDK 1.6, je pense appelé jvisualvm. Vous pourriez essayer de l'utiliser pour voir ce qui se passe. Mieux encore, il s'agirait d'un vrai profileur, mais les seuls bons sont les paiements à la carte, bien que certains aient des essais gratuits de 30 jours.