package com.bc.ceres.swing; import javax.swing.DefaultListModel; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JTable; import javax.swing.JToolBar; import javax.swing.UIManager; import javax.swing.WindowConstants; import javax.swing.border.EmptyBorder; import javax.swing.table.DefaultTableModel; import java.awt.BorderLayout; import java.util.Arrays; public class ListControlBarTest { public static void main(String[] args) { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception e) { e.printStackTrace(); } JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, true, GridGuiTest.createGridPanel(), createListPanel()); JFrame frame = new JFrame(ListControlBarTest.class.getSimpleName()); frame.getContentPane().add(splitPane, BorderLayout.WEST); frame.getContentPane().add(createTablePanel(), BorderLayout.CENTER); frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); frame.setSize(340, 340); frame.setVisible(true); } private static JPanel createListPanel() { final DefaultListModel<String> listModel = new DefaultListModel<>(); final JList<String> list = new JList<>(listModel); ListControlBar listControlBar = ListControlBar.create(JToolBar.VERTICAL, list, new ListControlBar.AbstractListController() { @Override public boolean addRow(int index) { listModel.addElement(genName()); list.setSelectedIndex(listModel.getSize() - 1); return true; } @Override public boolean removeRows(int[] indices) { int[] clone = indices.clone(); Arrays.sort(clone); list.clearSelection(); for (int i = clone.length - 1; i >= 0; i--) { listModel.remove(indices[i]); } return true; } @Override public boolean moveRowUp(int index) { String element = listModel.remove(index); listModel.insertElementAt(element, index - 1); list.setSelectedIndex(index - 1); return true; } @Override public boolean moveRowDown(int index) { String element = listModel.remove(index); listModel.insertElementAt(element, index + 1); list.setSelectedIndex(index + 1); return false; } }); JPanel panel = new JPanel(new BorderLayout(4, 4)); panel.setBorder(new EmptyBorder(4, 4, 4, 4)); panel.add(new JLabel("List of stuff:"), BorderLayout.NORTH); panel.add(new JScrollPane(list), BorderLayout.CENTER); panel.add(listControlBar, BorderLayout.EAST); return panel; } private static JPanel createTablePanel() { final DefaultTableModel tableModel = new DefaultTableModel(new String[]{"Target name", "Source", "Aggregator", "Parameters"}, 0); final JTable table = new JTable(tableModel); ListControlBar listControlBar = ListControlBar.create(JToolBar.VERTICAL, table, new ListControlBar.AbstractListController() { @Override public boolean addRow(int index) { tableModel.addRow(new Object[]{genName(), genName(), genName(), genName()}); table.getSelectionModel().clearSelection(); table.getSelectionModel().addSelectionInterval(tableModel.getRowCount() - 1, tableModel.getRowCount() - 1); return true; } @Override public boolean removeRows(int[] indices) { int[] clone = indices.clone(); Arrays.sort(clone); table.getSelectionModel().clearSelection(); for (int i = clone.length - 1; i >= 0; i--) { tableModel.removeRow(indices[i]); } return true; } @Override public boolean moveRowUp(int index) { tableModel.moveRow(index, index, index - 1); table.getSelectionModel().clearSelection(); table.getSelectionModel().addSelectionInterval(index - 1, index - 1); return true; } @Override public boolean moveRowDown(int index) { tableModel.moveRow(index, index, index + 1); table.getSelectionModel().clearSelection(); table.getSelectionModel().addSelectionInterval(index + 1, index + 1); return true; } }); JPanel panel = new JPanel(new BorderLayout(4, 4)); panel.setBorder(new EmptyBorder(4, 4, 4, 4)); panel.add(new JLabel("Table of things:"), BorderLayout.NORTH); panel.add(new JScrollPane(table), BorderLayout.CENTER); panel.add(listControlBar, BorderLayout.EAST); return panel; } public static String genName() { int n = 3 + (int) (Math.random() * 8); char[] str = new char[n]; char[] voc = new char[]{'a', 'a', 'a', 'e', 'e', 'e', 'e', 'e', 'i', 'i', 'o', 'o', 'u', 'u', 'y'}; for (int i = 0; i < str.length; i++) { if (i % 2 == 0) { str[i] = voc[(int) (Math.random() * voc.length)]; } else { str[i] = (char) ('a' + (int) (('z' - 'a') * Math.random())); } } str[0] = Character.toUpperCase(str[0]); return new String(str); } }