2014-08-27 126 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代码中那样添加渲染器即可。

我希望有帮助。

相关问题