JTable排序不显示图像 [英] JTable Sorting not Displaying Images

查看:81
本文介绍了JTable排序不显示图像的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所以我已经成功地在我的小程序中实现了搜索功能,但是当我单击按钮进行排序时,它可以正常工作,但是图像不显示.这是我为分拣器添加的代码,可以正常工作,但没有显示每一行的图像.当我取出此代码时,会显示图像,但排序不起作用.排序时是否可以显示图像?

So I have successfully implemented a search feature into my tiny program but when I click the button to sort, it works fine but the images don't display. This is the code that I added for the sorter which works fine but the images for each row don't show up. When I take out this code, the images show up but the sorting doesn't work. Is there away that I can make the images show when sorting?

    // Sorter Code. Images show up when this code gets taken out.
    table = new JTable(model);
    final TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model);
    table.setRowSorter(sorter);
    search_button.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
          String text = search.getText();
          if (text.length() == 0) {
            sorter.setRowFilter(null);
          } else {
            sorter.setRowFilter(RowFilter.regexFilter(text));
          }
        }
      });
   // sorter code ends here.

推荐答案

  • 必须将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);
                  }
              });
          }
      }
      

      这篇关于JTable排序不显示图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆