2014-08-27 95 views
3

我有一張包含一些數據的表格。當我搜索textField中的文本時,表格的外觀,更改和textFields消失。我不知道爲什麼,我不知道如果我這樣做是正確如何突出顯示jtable單元格的文字?

enter image description here

enter image description here

這裏是我的全部代碼..

package test; 

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Component; 
import java.awt.EventQueue; 

import javax.swing.*; 
import javax.swing.border.EmptyBorder; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableCellRenderer; 
import javax.swing.table.TableModel; 
import javax.swing.table.TableRowSorter; 
import javax.swing.text.BadLocationException; 
import javax.swing.JTextField; 
import javax.swing.JButton; 
import javax.swing.JLabel; 
import javax.swing.JTable; 
import javax.swing.JScrollPane; 
import javax.swing.RowFilter; 

import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 

public class test3 extends JFrame { 

private JPanel contentPane; 
private JTable table; 

private TableModel tableModel; 
private JTextField textField; 
private String textForSearch; 
private TableRowSorter<TableModel> sorter; 
/** 
* Launch the application. 
*/ 
public static void main(String[] args) { 

/** 
* Create the frame. 
*/ 
public test3() { 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setBounds(100, 100, 450, 346); 
    contentPane = new JPanel(); 
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
    setContentPane(contentPane); 
    contentPane.setLayout(null); 

    JScrollPane scrollPane = new JScrollPane(); 
    scrollPane.setBounds(63, 52, 305, 191); 
    contentPane.add(scrollPane); 

    String columns [] = { 
      "First Name", "Last Name", "Middle Name" 
     }; 
    String data[][] = new String [3][3]; 
    data [0][0] = "denise"; 
    data [0][1] = "alyson"; 
    data [0][2] = "berania"; 
    data [1][0] = "denden"; 
    data [1][1] = "pelesco"; 
    data [1][2] = "pogi"; 
    data [2][0] = "ryan"; 
    data [2][1] = "ewan"; 
    data [2][2] = "santos"; 

    tableModel = new DefaultTableModel(data, columns); 

    table = new JTable(tableModel); 
    scrollPane.setViewportView(table); 

    sorter = new TableRowSorter<TableModel>(tableModel); 
    table.setRowSorter(sorter); 
    textField = new JTextField(); 
    textField.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent arg0) { 
      textForSearch = textField.getText(); 
      if(textForSearch.length()==0){ 
       sorter.setRowFilter(null); 
      }else{ 
       sorter.setRowFilter(RowFilter.regexFilter("(?i)" + textForSearch)); 
      } 

      for(int i =0;i<table.getColumnCount();i++){ 
       table.getColumnModel().getColumn(i).setCellRenderer(getRenderer()); 
      } 
     } 
    }); 
    textField.setBounds(262, 21, 86, 20); 
    contentPane.add(textField); 
    textField.setColumns(10); 
} 

    private TableCellRenderer getRenderer() { 
     return new TableCellRenderer() { 


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

有兩種方法重寫[TableModel](http://stackoverflow.com/questions/16814512/tablecellrenderer-and-how-to-refresh-cell-background-without-using-jtable-repain)或構建[在運行時HTML語法](http://stackoverflow.com/a/16740520/714968),:-)你可以稱之爲重繪錯誤 – mKorbel 2014-08-28 06:11:25

+0

[看到我的specisics問題](http://stackoverflow.com/questions/6410839/highlight-substring-in-the-tablecells-which-is-using-for-jtable-filetering) – mKorbel 2014-08-28 06:13:03

回答

2
  1. 您正在使用您搜索文本字段作爲表格單元格渲染器。這會使所有單元格看起來像文本字段,並且您的搜索文本字段會從其原始位置消失。
  2. 您正在設置ActionListener中的單元格渲染器ActionListener。這使#1發生在您嘗試搜索某些內容之後。
+1

+1,對於第1點)組件只能有一個父親,所以你需要創建一個新的JTextField用作表格的渲染器。你也應該在這個文本字段上使用setBorder(null),這樣看起來更好。 2)渲染器應該在創建表時分配給表格,而不是在ActionListener中。 – camickr 2014-08-28 00:17:51

2

我會強烈建議稍微differrent方法:

相反getRender()的返回匿名TableCellRender(),延長你的代碼一點,以延長JLable到如此送回你可以隨意改變諸如setBackground(),setForeground()等屬性具有更多的自由度。

在這裏,你會發現更多的信息:http://docs.oracle.com/javase/7/docs/api/javax/swing/table/TableCellRenderer.html

public class DefaultTableCellRenderer extends JLabel implements TableCellRenderer { 

} 

這裏是一個JList,一個完整的例子,它通過將中選取適當的接口適用於JTable中相同的:(專注於過去兩年,如果 - 否則)

public class ThumbnailCellRenderer extends JLabel implements ListCellRenderer { 

    private static final Color HIGHLIGHT_COLOR = new Color(0,0,128); 

    public ThumbnailCellRenderer() { 
     this.setOpaque(true); 
     this.setIconTextGap(12); 
    } 
    @Override 
    public Component getListCellRendererComponent(JList list, Object value, 
      int index, boolean isSelected, boolean cellHasFocus) { 
     // COMPLETE BODY 
     Photo photo = (Photo)value; 
     ImageIcon thumbnail = photo.getThumbnail(); 
     if(thumbnail != null) { 
      this.setToolTipText("Double Click for Slideshow - "+photo.getName()); 
      this.setIcon(thumbnail); 
      this.setText(photo.getCaption()+" - "+Utilities.getReadableDateAndTime(photo.getTime())); 
     } else { 
      this.setIcon(Icons.IMAGEREMOVED_ICON.get()); 
      this.setText(photo.getCaption()+" - "+Utilities.getReadableDateAndTime(photo.getTime())+" - Physical Image Removed"); 
     } 
     if(isSelected) { 
      setBackground(HIGHLIGHT_COLOR); 
      setForeground(Color.WHITE); 
     } else { 
      setBackground(Color.WHITE); 
      setForeground(Color.black); 
     } 
     return this; 
    } 

} 

最後,您只需像在MainFrame代碼中那樣添加渲染器即可。

我希望有幫助。

相關問題