2012-07-27 44 views

Respuesta

37

enter image description here

import java.awt.*; 
import java.awt.event.*; 
import java.util.List; 
import java.util.Arrays; 
import javax.swing.*; 
import javax.swing.table.*; 

public class TableHeaderHeightTest { 
    private static int HEADER_HEIGHT = 32; 
    private JTable makeTable() { 
    JTable table = new JTable(new DefaultTableModel(2, 20)); 
    table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 
    return table; 
    } 
    public JComponent makeUI() { 
    JPanel p = new JPanel(new GridLayout(2,1)); 

    JTable table1 = makeTable(); 
    //Bad: >>>> 
    JTableHeader header = table1.getTableHeader(); 
    //Dimension d = header.getPreferredSize(); 
    //d.height = HEADER_HEIGHT; 
    //header.setPreferredSize(d); //addColumn case test 
    header.setPreferredSize(new Dimension(100, HEADER_HEIGHT)); 
    p.add(makeTitledPanel("Bad: JTableHeader#setPreferredSize(...)", new JScrollPane(table1))); 
    //<<<< 

    JTable table2 = makeTable(); 
    JScrollPane scroll = new JScrollPane(table2); 
    scroll.setColumnHeader(new JViewport() { 
     @Override public Dimension getPreferredSize() { 
     Dimension d = super.getPreferredSize(); 
     d.height = HEADER_HEIGHT; 
     return d; 
     } 
    }); 
//   //or 
//   table2.setTableHeader(new JTableHeader(table2.getColumnModel()) { 
//    @Override public Dimension getPreferredSize() { 
//     Dimension d = super.getPreferredSize(); 
//     d.height = HEADER_HEIGHT; 
//     return d; 
//    } 
//   }); 
    p.add(makeTitledPanel("Override getPreferredSize()", scroll)); 

    final List<JTable> list = Arrays.asList(table1, table2); 

    JPanel panel = new JPanel(new BorderLayout()); 
    panel.add(p); 
    panel.add(new JButton(new AbstractAction("addColumn") { 
     @Override public void actionPerformed(ActionEvent e) { 
     for(JTable t: list) { 
      t.getColumnModel().addColumn(new TableColumn()); 
      JTableHeader h = t.getTableHeader(); 
      Dimension d = h.getPreferredSize(); 
      System.out.println(d); 
     } 
     } 
    }), BorderLayout.SOUTH); 
    panel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5)); 
    return panel; 
    } 
    private static JComponent makeTitledPanel(String title, JComponent c) { 
    JPanel p = new JPanel(new BorderLayout()); 
    p.add(c); 
    p.setBorder(BorderFactory.createTitledBorder(title)); 
    return p; 
    } 
    public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     @Override public void run() { 
     createAndShowGUI(); 
     } 
    }); 
    } 
    public static void createAndShowGUI() { 
    JFrame f = new JFrame(); 
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    f.getContentPane().add(new TableHeaderHeightTest().makeUI()); 
    f.setSize(320, 320); 
    f.setLocationRelativeTo(null); 
    f.setVisible(true); 
    } 
} 
+5

+1 ejemplo maravilloso para _No_ usando setXXSize :-) – kleopatra

+3

mKorbel THX :), kleopatra "no usar setXXSize "eso es seguro. – aterai

+3

@aterai Esa es una buena, muy agradable. Utilicé el método "malo" antes y me enfrenté con el problema que has mostrado anteriormente. En realidad no pude entender cuál fue el motivo ... Muchas gracias, ¡aprecia tu esfuerzo! – Anubis

-1

También puede utilizar una anchura muy grande al establecer la dimensión de cabeza preferido, que hacen pivotar truncar como por los anchos requeridos en el modelo de columna.

tableHeader.setPreferredSize(new Dimension(10000, HEADER_HEIGHT)); 
+0

por favor, lea las respuestas a [esta pregunta] (http://stackoverflow.com/questions/7229226/should-i-avoid-the-use-of-setpreferredmaximumminimumsize-methods-in-java-swi/): – bobndrew

1

probar este .....

if jtable attached to scrollpane 
    then 
table.getTableHeader().setPreferredSize(
    new Dimension(scrollpane.getwidth(),height) 
); 

else 
    table.getTableHeader().setPreferredSize(
    new Dimension(width,height) 
); 
0

Prueba este

JTableHeader th = table.getTableHeader(); 
th.setPreferredSize(new Dimension(100, 100)); 
Cuestiones relacionadas