2012-04-11 29 views
5

En mi JTable, quiero renombrar el encabezado de la tabla con la opción de clic derecho. Al hacer clic derecho en cualquier encabezado, da la opción de cambiar el nombre del encabezado. Pero cuando lo haga renombrará el encabezado de la columna seleccionada . Así que primero tengo que hacer clic en esa columna y luego puedo procesarla. ¿Hay alguna manera de que cuando hago clic con el botón derecho en cualquier columna, también se selecciona para que después de renombrar su valor se renombre?Cambie el nombre del encabezado de tabla

Mi oyente de action es la siguiente:

int column = jTable1.getSelectedColumn(); 
         if (column == -1) { 
          return; 
         } 
         if (column == 0) { 
          JOptionPane.showMessageDialog(jTable1, "You can not rename this column."); 
          return; 
         } 
         boolean blag = true; 
         String sColumnName = null; 
         while (blag) { 

         sColumnName = (String) JOptionPane.showInputDialog(jTable1, "Enter Column Name", "Add Column", JOptionPane.INFORMATION_MESSAGE, null, null, null); 
         if (sColumnName == null) { 
          return; 
         } 
         if (sColumnName.trim().equalsIgnoreCase("")) { 
          JOptionPane.showMessageDialog(jTable1, "Column name can not be blank."); 
          blag = true; 
         } else { 
          blag = false; 
         } 
         Vector vColumns = new Vector(); 
         for (int i = 0; i < defaultTableModel.getColumnCount(); i++) { 
          vColumns.add(defaultTableModel.getColumnName(i)); 
         } 
         if (vColumns.contains(sColumnName)) { 
          JOptionPane.showMessageDialog(jTable1, "Column name " + sColumnName + " already exist."); 
          return; 
         } 
        } 
        int viewColumn = jTable1.convertColumnIndexToView(column); 
        int totalColumn = defaultTableModel.getColumnCount(); 
        Object[] headers = new Object[totalColumn]; 
        for (int i = 0; i < totalColumn; i++) { 
         if (i == column) { 
          headers[i] = sColumnName; 
         } else { 
          headers[i] = defaultTableModel.getColumnName(i); 
         } 
        } 
        defaultTableModel.setColumnIdentifiers(headers); 

Respuesta

5

echo de menos no

1) MouseListener y determinar seleccionados Column con valor Retuns

header.addMouseListener(new MouseAdapter() { 

     @Override 
     public void mouseClicked(MouseEvent e) { 
      JTableHeader h = (JTableHeader) e.getSource(); 
      int i = h.columnAtPoint(e.getPoint()); 
      Object o = h.getColumnModel().getColumn(i).getHeaderValue(); 
      if (i < 0 || o == selectedColumn) { 
       selectedColumn = null; 
       return; 
      } 
      selectedColumn = o; 
      h.requestFocusInWindow(); 
     } 
    }); 

2) código para el cambio header.getColumnModel().getColumn(i).setHeaderValue("Clicked");

ejemplo sencillo

enter image description hereenter image description here

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.table.*; 

public class SelectedTableHeader { 

    private JFrame frame = new JFrame("Table Demo"); 
    private JTableHeader header; 
    private Object selectedColumn = null; 
    private String[] columnNames = {"String", "Integer", "Float", "Double", "Locale & Double", "Boolean"}; 
    private Object[][] data = { 
     {"aaa", new Integer(12), new Float(12.15), new Double(100.05), new Double(12.05), true}, 
     {"bbb", new Integer(5), new Float(7.154), new Double(6.1555), new Double(417.55), false}, 
     {"CCC", new Integer(92), new Float(0.1135), new Double(3.1455), new Double(11.05), true}, 
     {"ddd", new Integer(12), new Float(31.15), new Double(10.05), new Double(23.05), true}, 
     {"eee", new Integer(5), new Float(5.154), new Double(16.1555), new Double(17.55), false}, 
     {"fff", new Integer(92), new Float(4.1135), new Double(31.1455), new Double(3.05), true}}; 
    private TableModel model = new DefaultTableModel(data, columnNames) { 

     private static final long serialVersionUID = 1L; 

     @Override 
     public Class<?> getColumnClass(int column) { 
      return getValueAt(0, column).getClass(); 
     } 
    }; 
    private JTable table = new JTable(model); 

    public SelectedTableHeader() { 
     header = table.getTableHeader(); 
     header.addMouseListener(new MouseAdapter() { 

      @Override 
      public void mouseClicked(MouseEvent e) { 
       JTableHeader h = (JTableHeader) e.getSource(); 
       int i = h.columnAtPoint(e.getPoint()); 
       Object o = h.getColumnModel().getColumn(i).getHeaderValue(); 
       if (i < 0) { 
        selectedColumn = null; 
        return; 
       } 
       selectedColumn = o; 
       header.getColumnModel().getColumn(i).setHeaderValue("Clicked"); 
       h.requestFocusInWindow(); 
      } 
     }); 
     final TableCellRenderer hr = table.getTableHeader().getDefaultRenderer(); 
     header.setDefaultRenderer(new TableCellRenderer() { 

      private JLabel lbl; 

      @Override 
      public Component getTableCellRendererComponent(
        JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
       if (selectedColumn == value) { 
        lbl = (JLabel) hr.getTableCellRendererComponent(table, value, true, true, row, column); 
        lbl.setBorder(BorderFactory.createCompoundBorder(lbl.getBorder(), BorderFactory.createLineBorder(Color.red, 1))); 
        lbl.setHorizontalAlignment(SwingConstants.LEFT); 
       } else { 
        lbl = (JLabel) hr.getTableCellRendererComponent(table, value, false, false, row, column); 
        lbl.setBorder(BorderFactory.createCompoundBorder(lbl.getBorder(), BorderFactory.createEmptyBorder(0, 5, 0, 0))); 
        lbl.setHorizontalAlignment(SwingConstants.CENTER); 
       } 
       if (column == 0) { 
        lbl.setForeground(Color.red); 
       } else { 
        lbl.setForeground(header.getForeground()); 
       } 
       /*return (value == selectedColumn) ? hr.getTableCellRendererComponent(
       table, value, true, true, row, column) : hr.getTableCellRendererComponent(
       table, value, false, false, row, column);*/ 
       return lbl; 
      } 
     }); 

     table.setRowHeight(20); 
     table.setPreferredScrollableViewportSize(table.getPreferredSize()); 
     JScrollPane scroll = new JScrollPane(table); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(scroll); 
     frame.pack(); 
     frame.setLocation(150, 150); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       SelectedTableHeader selectedTableHeader = new SelectedTableHeader(); 
      } 
     }); 
    } 
} 

3) Otra forma es añadir CellEditor to the JTableHeader (aviso nunca ha intentado, y no está seguro si trabaja como editor de espera, único ejemplo, estoy seguro de que requiere algunas modificaciones)

+0

Gracias @mKorbel por la respuesta. – Ronak

+0

@Ronak encantado de ayudarte – mKorbel

Cuestiones relacionadas