java - 如何对包含图标的 JTable 列进行排序?

标签 java swing jtable awt imageicon

我有一个 JTable,第一列包含图标。我已阅读有关排序的教程,但不知道如何对图标进行排序。

当用户单击列标题时,我需要按颜色对图标进行排序。图标是绿色、红色或黄色的圆圈。

如何对 JTable 中包含图标的列进行排序?

最佳答案

The order doesn't matter, just as long as the rows are ordered in the sort.

这就是简单性本身。使用table.setAutoCreateRowSorter(true);

I already have that in my code

它对我来说效果很好。第三列按升序排序。

enter image description here

import java.awt.*;
import java.awt.image.BufferedImage;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import javax.swing.table.*;

import java.net.*;
import java.util.*;
import javax.imageio.ImageIO;

public class HueSort {

    private JComponent ui = null;
    BufferedImage[] images;

    HueSort() throws Exception {
        initUI();
    }

    public void initUI() throws Exception {
        if (ui != null) {
            return;
        }

        ui = new JPanel(new BorderLayout(4, 4));
        ui.setBorder(new EmptyBorder(4, 4, 4, 4));

        String[] paths = {
            "/image/wCF8S.png",
            "/image/T5uTa.png",
            "/image/IHARa.png"
        };
        BufferedImage[] images = new BufferedImage[3];
        for (int i = 0; i < paths.length; i++) {
            images[i] = ImageIO.read(new URL(paths[i]));
        }
        Random rand = new Random();
        String[] headers = {
            "Image", "Image", "Image", "Image", "Image", "Image", "Image"
        };
        BufferedImage[][] tableImages = new BufferedImage[11][headers.length];
        for (int r = 0; r < tableImages.length; r++) {
            for (int c = 0; c < tableImages[0].length; c++) {
                int index = rand.nextInt(images.length);
                tableImages[r][c] = images[index];
            }
        }
        TableCellRenderer tcr = new DefaultTableCellRenderer() {
            @Override
            public Component getTableCellRendererComponent(
                    JTable table,
                    Object value,
                    boolean isSelected,
                    boolean hasFocus,
                    int row,
                    int column) {
                Component c = super.getTableCellRendererComponent(
                        table, value, isSelected, hasFocus, row, column);
                if (c instanceof JLabel) {
                    Image image = (Image) value;
                    JLabel l = (JLabel) c;
                    l.setText("");
                    l.setIcon(new ImageIcon(image));
                }
                return c;
            }
        };
        JTable table = new JTable(tableImages, headers) {
            @Override
            public Class getColumnClass(int column) {
                return Image.class;
            }
        };
        table.setAutoCreateRowSorter(true);
        table.setDefaultRenderer(Image.class, tcr);
        table.setRowHeight(34);
        ui.add(new JScrollPane(table));
    }

    public JComponent getUI() {
        return ui;
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(
                            UIManager.getSystemLookAndFeelClassName());
                } catch (Exception useDefault) {
                }
                HueSort o;
                try {
                    o = new HueSort();
                    JFrame f = new JFrame("Hue Sort");
                    f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                    f.setLocationByPlatform(true);

                    f.setContentPane(o.getUI());
                    f.pack();
                    f.setMinimumSize(f.getSize());

                    f.setVisible(true);
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

关于java - 如何对包含图标的 JTable 列进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28126416/

相关文章:

java - 如何转换java字符串(Sat, 11 Apr 2015 17 :48:17 +0430) to Date

java - 如何从另一个类更改 Java 框架的背景颜色?

Java JTable 更改单元格中的图标

java - 调整垂直刻度标签高度 (XYStepChart)

java - 为什么 getSession() 在随后的请求中没有在短时间内返回相同的 session ?

java - 如何在JPanel上布局这些组件?

java - 如何从两个 JFrame 上的 2 个按钮数组中判断按下了哪个按钮

java重绘多个区域

Java - JTable - 将单元格设置为不允许编辑

java - 将数据库数据输出到 JTable