import java.util.*; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextArea; import javax.swing.JComponent; import javax.swing.BoxLayout; import javax.swing.ListSelectionModel; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.TableColumn; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.Insets; public class DebugTable extends JPanel { private static int ITEMS_PER_ROW = 3; private boolean ALLOW_COLUMN_SELECTION = false; private boolean ALLOW_ROW_SELECTION = true; static String[] columnNames = null; static String[][] data = null; static String[] sortedVtable = null; static DebugTable contentPane; static JFrame frame; public DebugTable() { super(new GridLayout(0, 1)); columnNames = new String[ITEMS_PER_ROW]; columnNames[0] = "Variable"; columnNames[1] = "Value"; columnNames[2] = "User Set"; data = new String[variable.Vtable.size()][ITEMS_PER_ROW]; sortedVtable = new String[variable.Vtable.size()]; Iterator vars = (variable.Vtable.values()).iterator(); for(int i = 0; i < sortedVtable.length; i++) { variable v = (variable) (vars.next()); sortedVtable[i] = v.name; } Arrays.sort(sortedVtable); int row = 0; for(int i = 0; i < sortedVtable.length; i++) { variable v = (variable) (variable.Vtable.get(sortedVtable[i])); data[row][0] = v.name; if(v.value == variable.T) { DebugTable.data[row][1] = "True"; } else if(v.value == variable.F) { DebugTable.data[row][1] = "False"; } else // v.value == variable.U { DebugTable.data[row][1] = "Unknown"; } if(v.userSet) { data[row][2] = "True"; } else { data[row][2] = "False"; } row++; } final JTable table = new JTable(data, columnNames); // Adjust widths of Value and User Set columns TableColumn column = table.getColumnModel().getColumn(1); column.setPreferredWidth(30); column = table.getColumnModel().getColumn(2); column.setPreferredWidth(30); table.setPreferredScrollableViewportSize(new Dimension(500, 250)); table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); if (ALLOW_ROW_SELECTION) // true by default { ListSelectionModel rowSM = table.getSelectionModel(); rowSM.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { } }); } else { table.setRowSelectionAllowed(false); } if (ALLOW_COLUMN_SELECTION) // false by default { table.setColumnSelectionAllowed(true); ListSelectionModel colSM = table.getColumnModel().getSelectionModel(); colSM.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { } }); } // Display explanation when user clicks a row final JTextArea expl = new JTextArea(); expl.setRows(3); expl.setMargin(new Insets(5, 5, 5, 5)); expl.setEditable(false); expl.setLineWrap(true); expl.setWrapStyleWord(true); ListSelectionModel rowSM = table.getSelectionModel(); rowSM.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { ListSelectionModel lsm = (ListSelectionModel) e.getSource(); if(!lsm.isSelectionEmpty()) { int r = lsm.getMinSelectionIndex(); variable v = (variable) (variable.Vtable.get(sortedVtable[r])); expl.setText(v.explanation); } } }); // Create the scroll panes and add the table and explanation to it JScrollPane scrollPane = new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); JScrollPane scrollPane2 = new JScrollPane(expl, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); // Add the scroll panes to this panel add(scrollPane); add(scrollPane2); } public static void update() { contentPane.updateUI(); } public static void createAndShowGUI() { // Create and set up the window frame = new JFrame("Variable Table"); frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); // Create and set up the content pane contentPane = new DebugTable(); contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS)); contentPane.setOpaque(true); // content panes must be opaque frame.setContentPane(contentPane); // Display the window frame.pack(); frame.setVisible(true); } }