2012-04-11 116 views
5

在我的JTable中,我想使用右鍵單擊選項來重命名錶格標題。右鍵單擊任何標題時,它會給出重命名標題的選項。但是當我這樣做時,它會重命名所選列標題。所以我必須先左鍵單擊那一欄然後我才能進一步處理。 有沒有什麼辦法,當我右鍵點擊任何列時,它也會被選中,以便重命名後它的值被重命名。重命名錶格標題

我的動作偵聽器是如下:

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

回答

5

我錯過有

1)MouseListener和確定選擇的Column與值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)代碼變化header.getColumnModel().getColumn(i).setHeaderValue("Clicked");

簡單的例子

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)另一種方式是添加CellEditor to the JTableHeader(通知沒試過,不知道編輯器工作原理預計,唯纔是舉,我敢肯定,需要進行一些修改)

+0

感謝@mKorbel的回覆。 – Ronak 2012-04-12 07:14:55

+0

@Ronak很樂意幫助你 – mKorbel 2012-04-12 07:20:09