3

JTextField の検索値を変更した後、JTable の蛍光ペンを更新するにはどうすればよいですか? JTextfield の下の JTextArea では問題なく動作しますが、JTable はハイライターを更新しません。助言がありますか??

これは私のコードです:

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.table.*;
import javax.swing.text.*;
import javax.swing.text.DefaultHighlighter.DefaultHighlightPainter;

public class BeispielTabelle {
JTextField field;
JTextArea textFeld = new JTextArea("Hello World!");
String input="Stefan";

//Titel der Tabelle
String[] title = {"EINS", "ZWEI", "DREI"}; 

//Tabellendaten
Object[][] playerdata = {       
{"34", "Stefan", "Mein Name ist Stefan"},
{"32", "Dirk", "Ich bin der Dirk"},
{"99", "Patrick", "Ich heisse Patrick"},
{"100", "Anna", "Ich bin die Anna"},};

//TableModel
DefaultTableModel model = new DefaultTableModel(playerdata,title);

//Tabelle erstellen
JTable textTable = new JTable(model);    

public JPanel erstelleTabelle() {               
    JPanel totalGUI = new JPanel();    
    //CellRenderer
    SearchRenderer cellRenderer = new SearchRenderer();


    //Spaltenbreiten festlegen
    textTable.setDefaultRenderer(String.class, cellRenderer);
    textTable.getColumnModel().getColumn(0).setCellRenderer(cellRenderer);
    textTable.getColumnModel().getColumn(1).setCellRenderer(cellRenderer);    
    textTable.getColumnModel().getColumn(2).setCellRenderer(cellRenderer);

    textTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); // Autoresizing abschalten, sonst sind alle Spalten gleich breit:
    textTable.getColumnModel().getColumn(0).setPreferredWidth(60);
    textTable.getColumnModel().getColumn(1).setPreferredWidth(60);
    textTable.getColumnModel().getColumn(2).setPreferredWidth(180);       

    //das Ganze scrollbar machen
    JScrollPane scrollPane = new JScrollPane(textTable);

    //TextFeld erstellen
    field = new JTextField();
    field.addActionListener(new ActionListener () {
        @Override
        public void actionPerformed(ActionEvent e) {
            input = field.getText();
            System.out.println(input);
            //updateRowHeights();
            highlightText();
        }
    });        

    totalGUI.add(scrollPane);  
    totalGUI.add(field);
    totalGUI.add(textFeld);        
    return totalGUI;
}

void highlightText() {
    DefaultHighlightPainter yellowPainter = new DefaultHighlighter.DefaultHighlightPainter(Color.YELLOW);
    Highlighter highlighter = textFeld.getHighlighter();
    highlighter.removeAllHighlights();      
    String text = textFeld.getText();
    String pattern = input;
    int index = text.indexOf(pattern);      
    while ( index >= 0 ) {
        int len = pattern.length();
        try {
            highlighter.addHighlight(index, index+len, yellowPainter);
        } catch (BadLocationException e) {
            e.printStackTrace();
        }
        index = text.indexOf(pattern, index+len);
    }
}

private static void createAndShowGUI() {

    //create main frame
    JFrame mainFrame = new JFrame("");
    BeispielTabelle test = new BeispielTabelle();

    JPanel totalGUI = new JPanel();
    totalGUI = test.erstelleTabelle();
    totalGUI.setLayout(new BoxLayout(totalGUI, BoxLayout.Y_AXIS));

    //visible mode
    mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    mainFrame.add(totalGUI); //integrate main panel to main frame
    mainFrame.pack();
    mainFrame.setVisible(true);     
}


public static void main (String[] args) {               

    createAndShowGUI();     

}//main
}//GUI_main

そして、これは私のSearchRendererです

import javax.swing.*;
import javax.swing.table.*;
import javax.swing.text.BadLocationException;

import java.awt.*;

public class SearchRenderer extends JTextArea implements TableCellRenderer {

/**
 * 
 */
private static final long serialVersionUID = 1L;
public SearchRenderer() {}//constructor
BeispielTabelle tabelle = new BeispielTabelle();
String textForSearch=tabelle.input;

@Override
public Component getTableCellRendererComponent (JTable table,
                                                Object value,
                                                boolean isSelected,
                                                boolean hasFocus,
                                                int row,                    
                                                int column ) {  
    this.setText((String) value);
    if(value != null) {
        String string = value.toString();
        if(string.contains(textForSearch)){
            int indexOf = string.indexOf(textForSearch);
            while(indexOf >=0) {
            try {
                      this.getHighlighter().addHighlight(indexOf,indexOf+textForSearch.length(),new javax.swing.text.DefaultHighlighter.DefaultHighlightPainter(Color.GREEN));
            } catch (BadLocationException e) {
                e.printStackTrace();
            }
            indexOf = string.indexOf(textForSearch, indexOf+textForSearch.length());
        }
    }
    } else {
        this.setText("");
        this.getHighlighter().removeAllHighlights();
    }
    return this;
}
}
4

1 に答える 1