2013-11-21 5 views
-1

Я пытаюсь выделить текст ячейки jtable. Это мой код: , когда я получаю редактор для указанной ячейки в методе testHighlighter и пытаясь выделить текст в этом компоненте редактора. пожалуйста, помогите мне, где я ошибаюсь.Выделение текста ячейки 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, пока он не изменить, вам нужно использовать TableCellRenderer. Here - это учебник для этого.

Пример:

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, как это, и я рекомендую вам заменить JTextField здесь JLabel и hightligh его как written here

EDIT:

Вот полный пример для вас, он работает, следит и изучает:

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 (таблица, значение, true, true, 0, 3); , и после этого я выделяю текст ячейки с помощью ярлыка JTextField. я пробовал это, но не мог добиться успеха. Было бы возможно. ?? – Akki

+0

Думаю, нет, почему вы не можете использовать мой пример? – alex2410

+0

В моем случае средство визуализации уже определено для столбцов таблицы, и я хочу реализовать поиск этой таблицы. мое требование состоит в том, чтобы выделить искомый текст в конкретной ячейке. Как я могу достичь такого поведения? – Akki

Смежные вопросы