@SuppressWarnings("unchecked") public JPanel view(String src_n, String dst_n) { List<JPanel> panels = new LinkedList<>(); LinkedList<String> sorted = new LinkedList<>(data.keySet()); sorted.sort(String::compareTo); for (String k : sorted) { Set<Pair<Object, Object>> xxx = data.get(k); List<Pair<Object, Object>> table = new LinkedList<>(xxx); Object[][] arr = new Object[table.size()][2]; int i = 0; for (Pair<Object, Object> p : table) { arr[i][0] = p.first; arr[i][1] = p.second; i++; } @SuppressWarnings("serial") JTable t = new JTable(arr, new Object[] {src_n, dst_n}) { @Override public Dimension getPreferredScrollableViewportSize() { Dimension d = getPreferredSize(); return new Dimension(d.width, d.height); } }; // //t.setRowSelectionAllowed(false); // t.setColumnSelectionAllowed(false); // MouseListener[] listeners = t.getMouseListeners(); // for (MouseListener l : listeners) { // t.removeMouseListener(l); // } TableRowSorter<?> sorter = new MyTableRowSorter(t.getModel()); t.setRowSorter(sorter); sorter.allRowsChanged(); sorter.toggleSortOrder(0); t.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2)); JPanel p = new JPanel(new GridLayout(1, 1)); p.add(new JScrollPane(t)); p.setBorder( BorderFactory.createTitledBorder( BorderFactory.createEmptyBorder(2, 2, 2, 2), k + " (" + xxx.size() + " rows)")); panels.add(p); // p.setPreferredSize(new Dimension(60, 60)); } /*int x = (int) Math.ceil(Math.sqrt(panels.size())); if (x == 0) { return new JPanel(); } JPanel panel = new JPanel(new GridLayout(x, x)); for (JPanel p : panels) { panel.add(p); } panel.setBorder(BorderFactory.createEtchedBorder()); */ return FqlUtil.makeGrid(((List<JComponent>) ((Object) panels))); }