2012-08-05 59 views
1

因此,我已成功實現了一個搜索功能到我的小程序,但當我點擊按鈕進行排序,它工作正常,但圖像不顯示。這是我爲分揀機添加的代碼,它工作正常,但每行的圖像都不顯示。當我拿出這段代碼時,圖像顯示出來,但排序不起作用。有沒有可以在排序時顯示圖像?JTable排序不顯示圖像

// 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. 
+0

如果是的RowFilter擊發TableChanged事件,它可能會重置您的單元格渲染。嘗試重新應用單元格渲染,直接在.se​​tRowFilter調用之後或通過SwingUtilities.invokeLater調用 – MadProgrammer 2012-08-05 07:15:41

+0

@MadProgrammer好主意,除了_RowFilter_不能將任何東西發回表,它只是一個啞判斷,它決定應該包含哪些行。聽起來像我們沒有看到的代碼中的錯誤。請展示一個展示問題 – kleopatra 2012-08-05 16:04:24

回答

3
  • 必須與它的模型同步JTable看來,

  • 已經看清楚方法convertXxxIndexToXxx

  • 添加int modelRow = convertRowIndexToModel(row);RendererprepareRenderer

  • example 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); 
      } 
     }); 
    } 
} 
+0

的SSCCE也是一個好主意,但這裏不應該是問題 - 通常,除了設置過濾器外,根本沒有任何事情要做(這是將視圖過濾器視爲領域的一個優點,反對在數據領域 - 表本身做了所有繁重的工作) – kleopatra 2012-08-05 16:07:17

+0

感謝球員們的所有幫助,但我仍然有一個問題解決這個問題。我編輯了我的原始文章,包括我的程序的完整代碼。請查看我的原始帖子,瞭解我的整個代碼。提前致謝。 – 2012-08-05 18:19:51

+0

@mKorbel:謝謝,但我仍然不確定如何去做。自從我開始學習java以來​​,這已經過去了2個月,所以我並不擅長這一點。我已經在原文中發佈了我的整個代碼,請你看看它還是其他人?謝謝! – 2012-08-06 16:50:16