2010-03-23 4 views
2

En bref, je crée un composant Swing personnalisé qui est essentiellement un JTable avec un panneau sur son côté. La table devrait bien sûr être scrollable et avoir un en-tête de table, mais puisque je veux seulement que l'en-tête soit au-dessus du JTable réel et pas au-dessus du panneau latéral, j'ai dû tirer quelques trucs pour le faire fonctionner. Mais cette partie fonctionne bien.Impossible de faire glisser pour redimensionner les colonnes JTable

Cependant, dans le processus, j'ai réussi à briser la fonctionnalité de redimensionnement de la souris-drag-column de la JTableHeader. Je suis complètement désemparé quant à pourquoi et ce que je peux faire à ce sujet. Ci-dessous est un échantillon de travail minimal pour illustrer mon problème.

import java.awt.Dimension; 
import java.awt.Rectangle; 
import java.awt.event.ComponentAdapter; 
import java.awt.event.ComponentEvent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JViewport; 
import javax.swing.Scrollable; 
import javax.swing.table.JTableHeader; 


final class FooTable extends JPanel implements Scrollable { 

    public FooTable() { 
     initComponents(); 
    } 

    // Generated by NetBeans IDE 
    @SuppressWarnings("unchecked") 
    // <editor-fold defaultstate="collapsed" desc="Generated Code"> 
    private void initComponents() { 
     java.awt.GridBagConstraints gridBagConstraints; 

     sidePanel = new javax.swing.JPanel(); 
     table = new javax.swing.JTable(); 

     setLayout(new java.awt.GridBagLayout()); 

     sidePanel.setMinimumSize(new java.awt.Dimension(70, 0)); 
     sidePanel.setPreferredSize(new java.awt.Dimension(70, 0)); 
     sidePanel.setLayout(null); 
     gridBagConstraints = new java.awt.GridBagConstraints(); 
     gridBagConstraints.gridx = 0; 
     gridBagConstraints.gridy = 0; 
     gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; 
     gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; 
     gridBagConstraints.weighty = 1.0; 
     add(sidePanel, gridBagConstraints); 

     table.setFont(table.getFont().deriveFont(table.getFont().getSize()+1f)); 
     table.setModel(new javax.swing.table.DefaultTableModel(
      new Object [][] { 
       {"1", "A", "I", "-"}, 
       {"2", "B", "II", "--"}, 
       {"3", "C", "III", "---"}, 
       {"4", "D", "IV", "----"}, 
       {"5", "E", "V", "-----"}, 
       {"6", "F", "VI", "------"}, 
       {"7", "G", "VII", "-------"}, 
       {"8", "H", "VIII", "--------"}, 
       {"9", "I", "IX", "---------"}, 
       {"10", "J", "X", "----------"} 
      }, 
      new String [] { 
       "Column 1", "Column 2", "Column 3", "Column 4" 
      } 
     )); 
     table.setRowHeight(24); 
     table.setSelectionMode(javax.swing.ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); 
     gridBagConstraints = new java.awt.GridBagConstraints(); 
     gridBagConstraints.gridx = 1; 
     gridBagConstraints.gridy = 0; 
     gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; 
     gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; 
     gridBagConstraints.weightx = 1.0; 
     add(table, gridBagConstraints); 
    }// </editor-fold> 

    public JScrollPane createScrollView() { 
     JScrollPane jsp = new JScrollPane(this); 
     JViewport jvp = new JViewport(); 
     final JTableHeader th = new JTableHeader(); 

     th.setTable(table); 
     th.setColumnModel(table.getColumnModel()); 
     th.setResizingAllowed(true); 

     jvp.setView(new JPanel() { 

      { 
       setLayout(null); 
       add(th); 

       th.setLocation(70, 0); 

       FooTable.this.addComponentListener(new ComponentAdapter() { 

        @Override 
        public void componentResized(ComponentEvent e) { 
         th.setSize(FooTable.this.getWidth(), th.getPreferredSize().height); 
        } 
       }); 
       setPreferredSize(new Dimension(th.getPreferredSize().width, th.getPreferredSize().height)); 
      } 
     }); 
     jsp.setColumnHeader(jvp); 
     return jsp; 
    } 

    // Variables declaration - do not modify 
    private javax.swing.JPanel sidePanel; 
    private javax.swing.JTable table; 
    // End of variables declaration 


    // 
    // Scrollable implementation 
    // 
    public Dimension getPreferredScrollableViewportSize() { 
     Dimension d = new Dimension(); 
     d.width = sidePanel.getPreferredSize().width + table.getPreferredSize().width; 
     d.height = sidePanel.getPreferredSize().height + table.getPreferredSize().height; 
     return d; 
    } 

    public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) { 
     return table.getScrollableUnitIncrement(visibleRect, orientation, direction); 
    } 

    public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) { 
     return table.getScrollableBlockIncrement(visibleRect, orientation, direction); 
    } 

    public boolean getScrollableTracksViewportWidth() { 
     return table.getScrollableTracksViewportWidth(); 
    } 

    public boolean getScrollableTracksViewportHeight() { 
     return table.getScrollableTracksViewportHeight(); 
    } 

    // 
    // Test program 
    // 
    public static void main(String[] args) { 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     FooTable fooTable = new FooTable(); 
     f.add(fooTable.createScrollView()); 
     f.pack(); 
     f.setVisible(true); 
    } 

} 

Répondre

2

Je pense que ce qui vous manque est aussi le dire JTable sur le JTableHeader. Dans la méthode createScrollView essayer d'ajouter ce qui suit juste avant le retour:

table.setTableHeader(th); 
+0

qui l'a fait! Je vous remercie! – perp

Questions connexes