Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-4368162

Selecting cells in a JTable using 'control-click' causes erratic highlighting

    XMLWordPrintable

    Details

    • Type: Bug
    • Status: Closed
    • Priority: P4
    • Resolution: Duplicate
    • Affects Version/s: 1.2.2, 1.3.0
    • Fix Version/s: None
    • Component/s: client-libs
    • Subcomponent:
    • CPU:
      generic, x86
    • OS:
      generic, windows_nt

      Description



      Name: md23716 Date: 09/04/2000

      When selecting a cell in a JTable using 'control-click',
      the selected cells are alternately highlighted and reset.
      For example, if 5 cells are already highlighted, and a
      6th is selected with ctrl-click, then the highlighting
      disappears for all 6 cells. If a 7th cell is then selected
      with a further ctrl-click, then all 7 cells become
      highlighted, and so on.

      This behaviour is the same on 1.3 and 1.4beta

      import javax.swing.JTable;
      import javax.swing.table.AbstractTableModel;
      import javax.swing.JScrollPane;
      import javax.swing.JFrame;
      import javax.swing.SwingUtilities;
      import javax.swing.JOptionPane;
      import java.awt.*;
      import java.awt.event.*;
      import java.util.EventObject.*;

      public class TableDemo extends JFrame
      {
         private boolean DEBUG = true;

         public TableDemo()
         {
            super("TableDemo");

            MyTableModel myModel = new MyTableModel();
            JTable table = new JTable(myModel);
            table.setPreferredScrollableViewportSize(new Dimension(500, 500));
            table.setCellSelectionEnabled(true); //<-- causes non-contiguous selectio
      n problem
            table.setRowSelectionAllowed(true);
            table.setColumnSelectionAllowed(false);
            table.setAutoResizeMode(0);
            // table.setShowHorizontalLines(false);
            // System.out.println(table.AccessibleJTable.AccessibleJTableCell.isFocusT
      raversable());

            //Create the scroll pane and add the table to it.
            JScrollPane scrollPane = new JScrollPane(table);
            scrollPane.createHorizontalScrollBar();

            //Add the scroll pane to this window.
            getContentPane().add(scrollPane, BorderLayout.CENTER);

            addWindowListener(new WindowAdapter()
                              {
                                 public void windowClosing(WindowEvent e)
                                 {
                                    System.exit(0);
                                 }
                              });
         }

         class MyTableModel extends AbstractTableModel
         {
            final String[] columnNames = {
               "One",
               "Two",
               "Three",
               "Four",
               "Five",
               "Six",
               "Seven",
               "Eght",
               "Nine",
               "Ten",
               "Eleven",
               "Eleven"

            };
            final Object[][] data = {
               {"Mary", "Campione","Snowboarding", new Integer(5), new Boolean(false),
      new Integer(6), "More", "Stuff", "NINE", "IT", new Boolean(true),"Mary", "Campio
      ne","Snowboarding", new Integer(5), new Boolean(false),new Integer(6), "More", "
      Stuff", "NINE", "IT", new Boolean(true),"Mary", "Campione","Snowboarding", new I
      nteger(5), new Boolean(false),new Integer(6), "More", "Stuff", "NINE", "IT", new
       Boolean(true),"Mary", "Campione","Snowboarding", new Integer(5), new Boolean(fa
      lse),new Integer(6), "More", "Stuff", "NINE", "IT", new Boolean(true)},
               {"Mary", "Campione","Snowboarding", new Integer(5), new Boolean(false),
      new Integer(6), "More", "Stuff", "NINE", "IT", new Boolean(true),"Mary", "Campio
      ne","Snowboarding", new Integer(5), new Boolean(false),new Integer(6), "More", "
      Stuff", "NINE", "IT", new Boolean(true),"Mary", "Campione","Snowboarding", new I
      nteger(5), new Boolean(false),new Integer(6), "More", "Stuff", "NINE", "IT", new
       Boolean(true),"Mary", "Campione","Snowboarding", new Integer(5), new Boolean(fa
      lse),new Integer(6), "More", "Stuff", "NINE", "IT", new Boolean(true)},
               {"Mary", "Campione","Snowboarding", new Integer(5), new Boolean(false),
      new Integer(6), "More", "Stuff", "NINE", "IT", new Boolean(true),"Mary", "Campio
      ne","Snowboarding", new Integer(5), new Boolean(false),new Integer(6), "More", "
      Stuff", "NINE", "IT", new Boolean(true),"Mary", "Campione","Snowboarding", new I
      nteger(5), new Boolean(false),new Integer(6), "More", "Stuff", "NINE", "IT", new
       Boolean(true),"Mary", "Campione","Snowboarding", new Integer(5), new Boolean(fa
      lse),new Integer(6), "More", "Stuff", "NINE", "IT", new Boolean(true)},
               {"Mary", "Campione","Snowboarding", new Integer(5), new Boolean(false),
      new Integer(6), "More", "Stuff", "NINE", "IT", new Boolean(true),"Mary", "Campio
      ne","Snowboarding", new Integer(5), new Boolean(false),new Integer(6), "More", "
      Stuff", "NINE", "IT", new Boolean(true),"Mary", "Campione","Snowboarding", new I
      nteger(5), new Boolean(false),new Integer(6), "More", "Stuff", "NINE", "IT", new
       Boolean(true),"Mary", "Campione","Snowboarding", new Integer(5), new Boolean(fa
      lse),new Integer(6), "More", "Stuff", "NINE", "IT", new Boolean(true)},
               {"Mary", "Campione","Snowboarding", new Integer(5), new Boolean(false),
      new Integer(6), "More", "Stuff", "NINE", "IT", new Boolean(true),"Mary", "Campio
      ne","Snowboarding", new Integer(5), new Boolean(false),new Integer(6), "More", "
      Stuff", "NINE", "IT", new Boolean(true),"Mary", "Campione","Snowboarding", new I
      nteger(5), new Boolean(false),new Integer(6), "More", "Stuff", "NINE", "IT", new
       Boolean(true),"Mary", "Campione","Snowboarding", new Integer(5), new Boolean(fa
      lse),new Integer(6), "More", "Stuff", "NINE", "IT", new Boolean(true)},
      ne","Snowboarding", new Integer(5), new Boolean(false),new Integer(6), "More", "
      Stuff", "NINE", "IT", new Boolean(true),"Mary", "Campione","Snowboarding", new I
      nteger(5), new Boolean(false),new Integer(6), "More", "Stuff", "NINE", "IT", new
       Boolean(true),"Mary", "Campione","Snowboarding", new Integer(5), new Boolean(fa
      lse),new Integer(6), "More", "Stuff", "NINE", "IT", new Boolean(true)},
               {"Mary", "Campione","Snowboarding", new Integer(5), new Boolean(false),
      new Integer(6), "More", "Stuff", "NINE", "IT", new Boolean(true),"Mary", "Campio
      ne","Snowboarding", new Integer(5), new Boolean(false),new Integer(6), "More", "
      Stuff", "NINE", "IT", new Boolean(true),"Mary", "Campione","Snowboarding", new I
      nteger(5), new Boolean(false),new Integer(6), "More", "Stuff", "NINE", "IT", new
       Boolean(true),"Mary", "Campione","Snowboarding", new Integer(5), new Boolean(fa
      lse),new Integer(6), "More", "Stuff", "NINE", "IT", new Boolean(true)},
               {"Mary", "Campione","Snowboarding", new Integer(5), new Boolean(false),
      new Integer(6), "More", "Stuff", "NINE", "IT", new Boolean(true),"Mary", "Campio
      ne","Snowboarding", new Integer(5), new Boolean(false),new Integer(6), "More", "
      Stuff", "NINE", "IT", new Boolean(true),"Mary", "Campione","Snowboarding", new I
      nteger(5), new Boolean(false),new Integer(6), "More", "Stuff", "NINE", "IT", new
       Boolean(true),"Mary", "Campione","Snowboarding", new Integer(5), new Boolean(fa
      lse),new Integer(6), "More", "Stuff", "NINE", "IT", new Boolean(true)}
            };

            public int getColumnCount()
            {
               return columnNames.length;
            }

            public int getRowCount()
            {
               return data.length;
            }

            public String getColumnName(int col)
            {
               return columnNames[col];
            }

            public Object getValueAt(int row, int col)
            {
               return data[row][col];
            }

            /*
             * JTable uses this method to determine the default renderer/
             * editor for each cell. If we didn't implement this method,
             * then the last column would contain text ("true"/"false"),
             * rather than a check box.
             */
            public Class getColumnClass(int c)
            {
               return getValueAt(0, c).getClass();
            }

            /*
             * Don't need to implement this method unless your table's
             * editable.
             */
            public boolean isCellEditable(int row, int col)
            {
               //Note that the data/cell address is constant,
               //no matter where the cell appears onscreen.
               if (col < 2)
               {
                  return false;
               }
               else
               {
                  return true;
               }
            }

            /*
             * Don't need to implement this method unless your table's
             * data can change.
             */
            public void setValueAt(Object value, int row, int col)
            {
               if (DEBUG)
               {
                  System.out.println("Setting value at " + row + "," + col
                                     + " to " + value
                                     + " (an instance of "
                                     + value.getClass() + ")");
               }

               if (data[0][col] instanceof Integer)
               {
                  //If we don't do something like this, the column
                  //switches to contain Strings.
                  //XXX: See TableEditDemo.java for a better solution!!!
                  try
                  {
                     data[row][col] = new Integer((String)value);
                     fireTableCellUpdated(row, col);
                  }
                  catch (NumberFormatException e)
                  {
                     JOptionPane.showMessageDialog(TableDemo.this,
                                                   "The \"" + getColumnName(col)
                                                   + "\" column accepts only integer v
      alues.");
                  }
               }
               else
               {
                  data[row][col] = value;
                  fireTableCellUpdated(row, col);
               }

               if (DEBUG)
               {
                  System.out.println("New value of data:");
               }
            }

            private void printDebugData()
            {
               int numRows = getRowCount();
               int numCols = getColumnCount();

               for (int i=0; i < numRows; i++)
               {
                  System.out.print(" row " + i + ":");
                  for (int j=0; j < numCols; j++)
                  {
                     System.out.print(" " + data[i][j]);
                  }
                  System.out.println();
               }
               System.out.println("--------------------------");
            }
         }

         public static void main(String[] args)
         {
            TableDemo frame = new TableDemo();
            frame.pack();
            frame.setVisible(true);
         }
      }



      ======================================================================

        Attachments

          Issue Links

            Activity

              People

              Assignee:
              pmilnesunw Philip Milne (Inactive)
              Reporter:
              mdevereuorcl Michelle Devereux (Inactive)
              Votes:
              0 Vote for this issue
              Watchers:
              0 Start watching this issue

                Dates

                Created:
                Updated:
                Resolved:
                Imported:
                Indexed: