2012-04-11 6 views
5

내 JTable에서 오른쪽 버튼을 클릭하여 option.on을 사용하여 테이블 헤더의 이름을 바꾸고 싶습니다. 헤더를 마우스 오른쪽 버튼으로 클릭하면 이름을 변경할 수있는 옵션이 나타납니다. 그러나이 작업을 수행 할 때 선택한 열 헤더의 이름을 바꿉니다. . 그래서 먼저 해당 열을 클릭 한 다음 추가 처리 할 수 ​​있습니다. 내가 열을 오른쪽 클릭 할 때 이름이 바뀌었을 때 값의 이름이 바뀌도록 선택할 수도 있습니다.테이블 헤더의 이름 바꾸기

내 액션 청취자은 다음과 같습니다 :

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

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");에 대한

을 retuns 선택하여 파악한

간단한 예

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

+0

@Ronak이 (가) 기꺼이 도와 드리겠습니다. – mKorbel