2012-04-11 14 views
5

W moim JTable, chcę zmienić nazwę nagłówka tabeli za pomocą opcji prawym przyciskiem myszy. W Prawym kliknięciem dowolnego nagłówka daje opcję zmiany nazwy nagłówka.Ale robię to zrobi zmianę nazwy nagłówka wybranej kolumny . Muszę więc najpierw kliknąć tę kolumnę, a potem mogę dalej przetwarzać. Czy jest jakiś sposób, że gdy kliknę prawym przyciskiem myszy na dowolną kolumnę, zostanie ona również wybrana, aby po zmianie nazwy została zmieniona jej wartość.Zmień nazwę nagłówka tabeli

Moja akcja słuchacz jest jak poniżej:

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); 

Odpowiedz

5

Tęsknię tam

1) MouseListener i determinują wybrany Column o wartości 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) kod na zmianę header.getColumnModel().getColumn(i).setHeaderValue("Clicked");

prosty przykład

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) Innym sposobem jest dodanie CellEditor to the JTableHeader (zawiadomienie nigdy nie próbował, a nie wiem, czy edytor pracuje jako oczekuje tylko przykład, jestem pewien, że wymaga kilku zmian)

+0

Dzięki @mKorbel za odpowiedź. – Ronak

+0

@Ronak cieszę się, że mogę ci pomóc – mKorbel