且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

JTable排序不显示图像

更新时间:2023-12-04 18:20:17

  • 必须将JTable的视图与其模型

    • have to synchronize JTables view with its model,

      已经看过方法convertXxxIndexToXxx

      int modelRow = convertRowIndexToModel(row);添加到您的RendererprepareRenderer

      示例convertRowIndexToModel

      编辑

      import java.awt.BorderLayout;
      import java.awt.Color;
      import java.awt.Dimension;
      import java.awt.Font;
      import java.util.regex.PatternSyntaxException;
      import javax.swing.*;
      import javax.swing.event.DocumentEvent;
      import javax.swing.event.DocumentListener;
      import javax.swing.table.*;
      
      public class TableIcon extends JFrame implements Runnable {
      
          private static final long serialVersionUID = 1L;
          private JTable table;
          private JLabel myLabel = new JLabel("waiting");
          private int pHeight = 40;
          private boolean runProcess = true;
          private int count = 0;
          private JTextField filterText = new JTextField(15);
      
          public TableIcon() {
              ImageIcon errorIcon = (ImageIcon) UIManager.getIcon("OptionPane.errorIcon");
              ImageIcon infoIcon = (ImageIcon) UIManager.getIcon("OptionPane.informationIcon");
              ImageIcon warnIcon = (ImageIcon) UIManager.getIcon("OptionPane.warningIcon");
              String[] columnNames = {"Picture", "Description"};
              Object[][] data = {{errorIcon, "About"}, {infoIcon, "Add"}, {warnIcon, "Copy"},};
              DefaultTableModel model = new DefaultTableModel(data, columnNames) {
      
                  private static final long serialVersionUID = 1L;
                  //  Returning the Class of each column will allow different
                  //  renderers to be used based on Class
      
                  @Override
                  public Class getColumnClass(int column) {
                      return getValueAt(0, column).getClass();
                  }
              };
              table = new JTable(model);
              table.setRowHeight(pHeight);
              table.setPreferredScrollableViewportSize(table.getPreferredSize());
              final TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model);
              table.setRowSorter(sorter);
              filterText.setMaximumSize(new Dimension(400, 30));
              filterText.setFont(new Font("Serif", Font.BOLD, 20));
              filterText.setForeground(Color.BLUE);
              filterText.getDocument().addDocumentListener(new DocumentListener() {
      
                  private void searchFieldChangedUpdate(DocumentEvent evt) {
                      String text = filterText.getText();
                      if (text.length() == 0) {
                          sorter.setRowFilter(null);
                          table.clearSelection();
                      } else {
                          try {
                              sorter.setRowFilter(RowFilter.regexFilter("(?i)" + text));
                          } catch (PatternSyntaxException pse) {
                              JOptionPane.showMessageDialog(null, "Bad regex pattern", "Bad regex pattern", JOptionPane.ERROR_MESSAGE);
                          }
                      }
                  }
      
                  @Override
                  public void insertUpdate(DocumentEvent evt) {
                      searchFieldChangedUpdate(evt);
                  }
      
                  @Override
                  public void removeUpdate(DocumentEvent evt) {
                      searchFieldChangedUpdate(evt);
                  }
      
                  @Override
                  public void changedUpdate(DocumentEvent evt) {
                      searchFieldChangedUpdate(evt);
                  }
              });
              add(filterText, BorderLayout.NORTH);
              JScrollPane scrollPane = new JScrollPane(table);
              add(scrollPane, BorderLayout.CENTER);
              myLabel.setPreferredSize(new Dimension(200, pHeight));
              myLabel.setHorizontalAlignment(SwingConstants.CENTER);
              add(myLabel, BorderLayout.SOUTH);
              new Thread(this).start();
          }
      
          public void run() {
              while (runProcess) {
                  try {
                      Thread.sleep(1250);
                  } catch (Exception e) {
                      e.printStackTrace();
                  }
                  SwingUtilities.invokeLater(new Runnable() {
      
                      @Override
                      public void run() {
                          ImageIcon myIcon = (ImageIcon) table.getModel().getValueAt(count, 0);
                          String lbl = "JTable Row at :  " + count;
                          myLabel.setIcon(myIcon);
                          myLabel.setText(lbl);
                          count++;
                          if (count > 2) {
                              count = 0;
                          }
                      }
                  });
              }
          }
      
          public static void main(String[] args) {
              SwingUtilities.invokeLater(new Runnable() {
      
                  @Override
                  public void run() {
                      TableIcon frame = new TableIcon();
                      frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
                      frame.setLocation(150, 150);
                      frame.pack();
                      frame.setVisible(true);
                  }
              });
          }
      }