2010-03-23 5 views
2

간단히 말하자면 기본적으로 사용자 정의 스윙 구성 요소를 만들고 있습니다.이 구성 요소는 기본적으로 패널이있는 JTable입니다. 테이블은 물론 스크롤 가능해야하며 테이블 헤더가 있어야합니다.하지만 헤더가 실제 JTable 위에 있고 사이드 패널 위에 있지 않기 때문에 작동하도록 몇 가지 트릭을 가져야했습니다. 그러나 그 부분은 잘 작동합니다.JTable 열의 크기를 조절할 수 없습니다.

그러나 프로세스에서 나는 어떻게 든 JTableHeader의 마우스 끌기 열 크기 조정 기능을 깨뜨릴 수있었습니다. 나는 왜 그런 일을 할 수 있는지에 대해 완전히 단서 있습니다.

다음은 내 문제를 설명하기위한 최소 작업 샘플입니다.

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

} 

답변

2

난 당신이 또한 JTableHeader에 대한 JTable을 말하고 무엇을 놓치고 있는지 생각합니다. 방법 createScrollView에서 시도는 다음 바로 돌아 오기 전에 추가 :

table.setTableHeader(th); 
+0

그것을 않았다! 고맙습니다! – perp

관련 문제