2013-11-21 5 views
-1

jtable 셀의 텍스트를 강조 표시하려고합니다. 내 코드 : testingHighlighter 메서드에서 지정된 셀의 편집기를 가져올 때 해당 편집기 구성 요소의 텍스트를 강조 표시하려고 할 때. 내가 잘못한 곳에서 나를 도와주세요. 다음에있는 당신의 문제jtable 셀의 텍스트 강조 표시

public class test extends JFrame 
{ 
    DefaultTableModel model; 
    JTable table; 
    String col[] = {"Name","Address","Phone","test"}; 

    public static void main(String args[]) 
    { 
     test t = new test(); 
     t.start(); 
     t.testingHightligher(); 

    } 

    public void start() 
    { 

     model = new DefaultTableModel(col,2); 
     table=new JTable(model){@Override 
     public boolean isCellEditable(int arg0, int arg1) { 

       return true; 
      }}; 

     JScrollPane pane = new JScrollPane(table); 

     setColumnEditor(table.getColumnModel().getColumn(0), new Object[] { "AND", 
      "OR" }, "Logical Operator"); 


     Object[] objs = new Object[] { "==", "=" }; 
     setColumnEditor(table.getColumnModel().getColumn(2), objs, "Logical Operator"); 

     JTextField field = new JTextField(); 
     DefaultCellEditor editor = new DefaultCellEditor(field); 

     editor.setClickCountToStart(1); 
     TableColumn col = table.getColumnModel().getColumn(3); 

     col.setCellEditor(editor); 

     DefaultTableCellRenderer renderer = new DefaultTableCellRenderer(); 
     renderer.setToolTipText("click to edit"); 
     col.setCellRenderer(renderer); 

     table.getColumnModel().getColumn(0).setPreferredWidth(25); 
     table.getColumnModel().getColumn(1).setPreferredWidth(120); 
     table.getColumnModel().getColumn(2).setPreferredWidth(25); 
     table.getColumnModel().getColumn(3).setPreferredWidth(100); 

     table.getTableHeader().setReorderingAllowed(false); 

     table.setValueAt("csanuragjain",0,3); 

     add(pane); 
     setVisible(true); 
     setSize(500,400); 
     setLayout(new FlowLayout()); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
    } 

    private void setColumnEditor(TableColumn col, Object[] editValues, String renderTip) 
    { 
     JComboBox comboBox = null; 
     if(editValues != null) 
     { 
      comboBox = new JComboBox(editValues); 
     } 
     else 
     { 
      comboBox = new JComboBox(); 
     } 

     comboBox.setMaximumRowCount(6); 

     DefaultCellEditor editor = new DefaultCellEditor(comboBox); 
     editor.setClickCountToStart(2); 
     col.setCellEditor(editor); 

     DefaultTableCellRenderer renderer = new DefaultTableCellRenderer(); 

     renderer.setToolTipText(renderTip); 
     col.setCellRenderer(renderer); 


     TableCellRenderer headerRenderer = col.getHeaderRenderer(); 
     if(headerRenderer instanceof DefaultTableCellRenderer) 
     { 
      ((DefaultTableCellRenderer) headerRenderer).setToolTipText("test"); 
     } 
    } 

    void testingHightligher() 
    { 
     Object value = table.getValueAt(0, 3); 
     JTextField field = (JTextField) table.getColumnModel().getColumn(3).getCellEditor().getTableCellEditorComponent(table, value, true, 0, 3); 

     try 
     { 

      field.getHighlighter().addHighlight(0, 3, new javax.swing.text.DefaultHighlighter.DefaultHighlightPainter(Color.RED)); 

     } 
     catch(BadLocationException ex) 
     { 
      ex.printStackTrace(); 
     } 
    } 
} 



Please help me where i am wrong.. 

답변

2

, 당신은 JTable의 셀을 편집 할 때 참조하는 TableCellEditor에서 텍스트를 강조하려고 노력하지만, 당신은 단지 CellRenderer를 참조 그 순간, 당신의 시작 table.editCellAt(0, 3);를 추가하여 코드를 수정할 수 있습니다 testingHightligher() 방법. 또한 main()에 다음 코드와 같은 테스트를 호출

SwingUtilities.invokeLater(new Runnable() { 

     @Override 
     public void run() { 
       t.testingHightligher(); 
     } 
}); 

을 당신이 편집되지 않은 상태에서 JTable에 텍스트를 강조 할 경우, 당신은 TableCellRenderer를 사용해야합니다. Here은이를위한 자습서입니다.

예 :

여기

당신을 위해 전체 예제입니다 :이 같은 somthin 필요

TableCellRenderer r = new TableCellRenderer() { 
     JTextField f = new JTextField(); 

     @Override 
     public Component getTableCellRendererComponent(JTable arg0, Object arg1, boolean arg2, boolean arg3, int arg4, int arg5) { 
      if(arg1 != null){ 
       f.setText(arg1.toString()); 
       try { 
        f.getHighlighter().addHighlight(0,3,new javax.swing.text.DefaultHighlighter.DefaultHighlightPainter(Color.RED)); 
       } catch (BadLocationException e) { 
        e.printStackTrace(); 
       } 
      } else { 
       f.setText(""); 
       f.getHighlighter().removeAllHighlights(); 
      } 
      return f; 
     } 
    }; 

은 또한 당신이 JLabel에 의해 여기 JTextField를 교체하고 written here

EDIT처럼 hightligh 추천 그것을 작동,보고 그것을 검사 :

public class Form extends JFrame { 

    private String textForSearch = ""; 
    private JTable t; 

    public Form() { 
     DefaultTableModel model; 
     t = new JTable(model = new DefaultTableModel(new Object[][]{},new Object[]{1})); 
     for(int i =0;i<10;i++){ 
      model.addRow(new Object[]{i}); 
     } 
     for(int i =0;i<t.getColumnCount();i++){ 
      t.getColumnModel().getColumn(i).setCellRenderer(getRenderer()); 
     } 

     JScrollPane jsp = new JScrollPane(t); 
     final RightPanel right = new RightPanel(); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     add(jsp, BorderLayout.CENTER); 
     add(right, BorderLayout.EAST); 
     pack(); 
     setLocationRelativeTo(null); 
    } 

    private TableCellRenderer getRenderer() { 
     return new TableCellRenderer() { 
      JTextField f = new JTextField(); 

      @Override 
      public Component getTableCellRendererComponent(JTable arg0, Object arg1, boolean arg2, boolean arg3, int arg4, int arg5) { 
       if(arg1 != null){ 
        f.setText(arg1.toString()); 
        String string = arg1.toString(); 
        if(string.contains(textForSearch)){ 
         int indexOf = string.indexOf(textForSearch); 
         try { 
          f.getHighlighter().addHighlight(indexOf,indexOf+textForSearch.length(),new javax.swing.text.DefaultHighlighter.DefaultHighlightPainter(Color.RED)); 
         } catch (BadLocationException e) { 
          e.printStackTrace(); 
         } 
        } 
       } else { 
        f.setText(""); 
        f.getHighlighter().removeAllHighlights(); 
       } 
       return f; 
      } 
     }; 
    } 

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

      public void run() { 
       new Form().setVisible(true); 
      } 
     }); 
    } 

    class RightPanel extends JPanel{ 


     public RightPanel(){ 
      setLayout(new GridBagLayout()); 
      GridBagConstraints c = new GridBagConstraints(); 
      c.insets = new Insets(5, 5, 5, 5); 
      c.gridy = 0; 
      final JTextField f = new JTextField(5); 
      add(f,c); 
      JButton b = new JButton("search"); 
      b.addActionListener(new ActionListener() { 

       @Override 
       public void actionPerformed(ActionEvent arg0) { 
        textForSearch = f.getText(); 
        t.repaint(); 
       } 
      }); 
      c.gridy++; 
      add(b,c); 
     } 
    } 

} 

enter image description here

+0

tableCellRendererComponent를 가져온 후에 형식을 변경할 수 있습니까? JTextField field = (JTextField) table.getColumnModel(). getColumn (3) .getCellRenderer(). getTableCellRendererComponent (table, value, true, true, 0, 3); 그 후 JTextField 형광펜을 사용하여 셀 텍스트를 강조 표시합니다. 나는 이것을 시도했지만 성공할 수 없었다. – Akki

+0

나는 내 생각을 왜 사용할 수 없는가? – alex2410

+0

제 경우에는 렌더러가 이미 테이블 열에 정의되어 있고이 테이블에 대한 검색을 구현하고 싶습니다. 내 요구 사항은 특정 셀에서 검색된 텍스트를 강조 표시하는 것입니다. 어떻게하면이 문제를 해결할 수 있을까요? – Akki