2013-11-21 53 views
-1

我想突出顯示jtable單元格的文本。 這是我的代碼: 當我在testsHighlighter方法中獲取指定單元格的編輯器並試圖突出顯示該編輯器組件中的文本時。請幫助我,我錯了。突出顯示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

你的下一個問題,你試着突出TableCellEditor的,你看編輯的JTable一個單元格時文本,但在那一刻,你只能看到的CellRenderer,您可以通過在開始添加table.editCellAt(0, 3);解決您的代碼testingHightligher()方法。還打電話給你測試像下面的代碼在你的main()

SwingUtilities.invokeLater(new Runnable() { 

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

如果你想突出JTable文本,而它不是編輯,你需要使用TableCellRendererHere就是這個教程。

例子:

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

您需要somthin這個樣子,我也建議你通過JLabel更換JTextField這裏hightligh它像written here

編輯:

這是給你完整的例子,它的工作原理,觀察和檢查它:

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字段=(JTextField)table.getColumnModel()。getColumn(3).getCellRenderer()。getTableCellRendererComponent(table,value,true,true,0,3); 之後,我用JTextField熒光筆突出顯示單元格文本。我試過這個,但不能成功..會是可能的嗎? – Akki

+0

我想不,爲什麼你不能使用我的例子? – alex2410

+0

在我的情況renderer已經定義了表列,我想實現這個表的搜索。我的要求是突出搜索特定單元格中的文本。我如何實現這種行爲? – Akki

相關問題