2012-10-13 4 views
1

Dans un exemple ci-dessous, une fenêtre affiche une table contenant la largeur de la fenêtre elle-même. Lorsque la fenêtre est redimensionnée, la valeur de sa largeur reflète la vérité actuelle.Comment TableModel sait que la valeur a été modifiée?

Comment cela peut-il être? Comment Swing a informé une table, qu'il devrait récupérer le modèle? Ou peut-être que le modèle reçoit des informations indiquant que la valeur a été modifiée?

public class JTableDynamicUpdate extends JFrame { 



private AbstractTableModel tableModel = new AbstractTableModel() { 

    private String[] columnNames = new String[] {"Parameter", "Value"}; 

    public String getColumnName(int column) { 
     return columnNames[column]; 
    }; 

    @Override 
    public int getRowCount() { 
     return 1; 
    } 

    @Override 
    public int getColumnCount() { 
     return 2; 
    } 

    @Override 
    public Object getValueAt(int rowIndex, int columnIndex) { 
     if(rowIndex == 0) { 
      if(columnIndex == 0) { 
       return "Window width:"; 
      } 
      else if(columnIndex==1) { 
       return getSize().width; 
      } 
     } 
     throw new IndexOutOfBoundsException(); 
    } 

}; 

private JTable table = new JTable(tableModel); 

private JScrollPane tableScroll = new JScrollPane(table); 

private Container contentPane = getContentPane(); 
{ 
    contentPane.setLayout(new BorderLayout()); 
    contentPane.add(tableScroll, BorderLayout.CENTER); 

    setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
} 

public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 

      JTableDynamicUpdate frame = new JTableDynamicUpdate(); 
      frame.pack(); 
      frame.setVisible(true); 

     } 
    }); 
} 
} 
+0

Si vous ajoutez un simple appel d'enregistrement dans la fonction « getValueAt » (comme 'système. out.println ("value") ') vous verrez quand swing interroge votre fonction. Il appellera probablement la valeur chaque fois que quelque chose change, y compris la taille de votre composant. – mercutio

Répondre

2

JTable est juste une vue qui signifie qu'il ne détient aucune valeur. A va générer une exception pour vous de vous laisser voir toute la trace:

Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException 
at TestClass$1.getValueAt(TestClass.java:36) 
at javax.swing.JTable.getValueAt(JTable.java:2686) 
at javax.swing.JTable.prepareRenderer(JTable.java:5703) 
at javax.swing.plaf.basic.BasicTableUI.paintCell(BasicTableUI.java:2072) 
at javax.swing.plaf.basic.BasicTableUI.paintCells(BasicTableUI.java:1974) 
at javax.swing.plaf.basic.BasicTableUI.paint(BasicTableUI.java:1770) 
at javax.swing.plaf.ComponentUI.update(ComponentUI.java:143) 
at javax.swing.JComponent.paintComponent(JComponent.java:752) 
at javax.swing.JComponent.paint(JComponent.java:1029) 
at javax.swing.JComponent.paintChildren(JComponent.java:862) 
at javax.swing.JComponent.paint(JComponent.java:1038) 
at javax.swing.JViewport.paint(JViewport.java:747) 
at javax.swing.JComponent.paintChildren(JComponent.java:862) 
at javax.swing.JComponent.paint(JComponent.java:1038) 
at javax.swing.JComponent.paintChildren(JComponent.java:862) 
at javax.swing.JComponent.paint(JComponent.java:1038) 
at javax.swing.JComponent.paintChildren(JComponent.java:862) 
at javax.swing.JComponent.paint(JComponent.java:1038) 
at javax.swing.JLayeredPane.paint(JLayeredPane.java:567) 
at javax.swing.JComponent.paintChildren(JComponent.java:862) 
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5131) 
at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1491) 
at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1422) 
at javax.swing.RepaintManager.paint(RepaintManager.java:1225) 
at javax.swing.JComponent.paint(JComponent.java:1015) 
at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:21) 
at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:60) 
at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:97) 
at java.awt.Container.paint(Container.java:1778) 
at java.awt.Window.paint(Window.java:3379) 

Repeindre du cadre finira par déclencher repeindre de la table. Le modèle de table sera utilisé pour obtenir une valeur nécessaire pour repeindre certaines cellules.

2

il suffit de changer la méthode getValueAt() de cette façon et vous pouvez facilement trouver ce qui se passe de la chaîne des appels de méthode:

@Override 
public Object getValueAt(int rowIndex, int columnIndex) { 
     throw new RuntimeException("Trace!"); 
} 
Questions connexes