2010-07-08 4 views
0

현재 다소 복잡한 애플리케이션에서 작업 중입니다. 제 직업은 GUI의 일부분을 만드는 것입니다.
주 영역은 JTable에 대해 파생되며 모든 응용 프로그램 관련 데이터를 포함합니다. 테이블 상단에는 데이터가 테이블에 표시되는 방식을 제어 할 수있는 몇 가지 요소가 있습니다. 현재 작업에 관련
옵션 :RowFilter에 대한 JComponents + 체인의 런타임 정렬

자주적 열의 폭의 변경
  • (되지 JTableHeader에 의해) 열 번호
    • 변경 및
    • 열당 하나 개의 필터 용어를 입력 데이터의 특정 행을 선택합니다.

    이 szenario의 주요 목표는 현재 뷰 설정의 모든 열에 대해 Component (아마 JTextField)를 만드는 것입니다. 런타임시 크기가 변경 되더라도 해당 열과 정확하게 정렬됩니다.

    첫 번째 질문 :

    정렬이 작동하지 않습니다. 열 너비와 일치하도록 TextField의 너비를 가져올 수 없습니다.
    어떻게 작동합니까?

    두 번째 문제 :

    개별 필터를 연결하고 싶습니다. 즉, 사용자가 하나 이상의 필터 문자열을 입력하기로 결정하면 모든 필터 문자열을 평가해야하며 모든 필터와 일치하는 행만 표시되어야합니다. 지금까지 두 번째 TextField의 입력은 첫 번째 필터를 제거합니다 (RowFilter.regexFilter를 사용하여 제대로 작동 함).
    어떻게 작동합니까?

    어떤 코드 스 니펫이 유용 할 수 있으며 알려 주시면 기꺼이 알려 드리겠습니다.

    미리 도움을 주셔서 감사합니다.

    안부, DK는

  • 답변

    1
    나는이 예제를 얻어야한다

    컬럼의 폭과 일치하도록 TextField의 폭을 얻을 수

    시작 :

    import java.awt.*; 
    import java.awt.event.*; 
    import javax.swing.*; 
    import javax.swing.event.*; 
    import javax.swing.table.*; 
    
    public class TableFilterRow extends JFrame implements TableColumnModelListener 
    { 
        private JTable table; 
        private JPanel filterRow; 
    
        public TableFilterRow() 
        { 
         table = new JTable(3, 5); 
         table.setPreferredScrollableViewportSize(table.getPreferredSize()); 
         JScrollPane scrollPane = new JScrollPane(table); 
         getContentPane().add(scrollPane); 
         table.getColumnModel().addColumnModelListener(this); 
    
         // Panel for text fields 
    
         filterRow = new JPanel(new FlowLayout(FlowLayout.CENTER, 0 , 0)); 
    
         for (int i = 0; i < table.getColumnCount(); i ++) 
          filterRow.add(new JTextField("" + i)); 
    
         columnMarginChanged(new ChangeEvent(table.getColumnModel())); 
         getContentPane().add(filterRow, BorderLayout.NORTH); 
        } 
    
        // Implement TableColumnModelListener methods 
        // (Note: instead of implementing a listener you should be able to 
        // override the columnMarginChanged and columMoved methods of JTable) 
    
        public void columnMarginChanged(ChangeEvent e) 
        { 
         TableColumnModel tcm = table.getColumnModel(); 
         int columns = tcm.getColumnCount(); 
    
         for (int i = 0; i < columns; i ++) 
         { 
          JTextField textField = (JTextField)filterRow.getComponent(i); 
          Dimension d = textField.getPreferredSize(); 
          d.width = tcm.getColumn(i).getWidth(); 
          textField.setPreferredSize(d); 
         } 
    
         SwingUtilities.invokeLater(new Runnable() 
         { 
          public void run() 
          { 
           filterRow.revalidate(); 
          } 
         }); 
        } 
    
        public void columnMoved(TableColumnModelEvent e) 
        { 
         Component moved = filterRow.getComponent(e.getFromIndex()); 
         filterRow.remove(e.getFromIndex()); 
         filterRow.add(moved, e.getToIndex()); 
         filterRow.validate(); 
        } 
    
        public void columnAdded(TableColumnModelEvent e) {} 
        public void columnRemoved(TableColumnModelEvent e) {} 
        public void columnSelectionChanged(ListSelectionEvent e) {} 
    
        public static void main(String[] args) 
        { 
         JFrame frame = new TableFilterRow(); 
         frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
         frame.pack(); 
         frame.setLocationRelativeTo(null); 
         frame.setVisible(true); 
        } 
    } 
    

    모든 필터와 일치하는 행만 이 표시되어야합니다.

    JTable API를 읽고 TableFilterDemo가있는 "How to Use Tables"에 대한 스윙 튜토리얼의 링크를 따라 가십시오. "및"필터를 사용하도록 코드를 쉽게 수정할 수 있습니다. 코드는 다음과 같습니다.

    // rf = RowFilter.regexFilter(filterText.getText(), 0); 
    List<RowFilter<Object,Object>> filters = new ArrayList<RowFilter<Object,Object>>(2); 
    filters.add(RowFilter.regexFilter(filterText.getText(), 0)); 
    filters.add(RowFilter.regexFilter(filterText.getText(), 1)); 
    rf = RowFilter.andFilter(filters); 
    

    이 예제는 여러 문자열에서 동일한 문자열을 찾는 단일 텍스트 필드를 공유합니다. 분명히 개별 텍스트 필드를 사용합니다.

    +0

    지금까지 도와 주셔서 감사합니다. 나는 곧 해결책을 시험해 보겠습니다. – DeKay

    +0

    우수 사례 +1 – mKorbel