2016-01-21 6 views
0

Привет У меня есть Jtable с некоторыми столбцами, первые два сортируются, вегетарианский столбец - это combobox, и теперь я хочу изменить колонку заголовка на перечисление. Поэтому я хочу, чтобы изменить код таким образом, что перечисление должен быть мой заголовок столбца ... пожалуйста, дайте мне ответ Я пытаюсь эту программу, так как прошлой ночьюКак объявить enum имеет столбец заголовка jtable

class MyTable extends JFrame { 

    /*public enum ColumNames { 
     FIRSTNAME, LASTNAME, DEPARTMENT, SALARY, 
     YEARS, VEGETARIAN, GENDER,AGE; 


    }*/ 




    private JPanel topPanel; 
    private JTable table; 
    private JScrollPane scrollPane; 
    private String[] columnNames; 
    private Object[][] dataValues; 
    JTextField textBox = new JTextField(); 

    public MyTable() { 
     setTitle("MyTable"); 
     setSize(300, 300); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     topPanel = new JPanel(); 
     topPanel.setLayout(new BorderLayout()); 
     getContentPane().add(topPanel); 
     columnNames = new String[] { "FirstName", "LastName", "Department", "Salary", "Years", "Vegetarian", "Gender", 
       "Age" }; 
     dataValues = new Object[][] { 
       { "Kathy", "Smith", "Networking", new Integer(50000), new Integer(5), new Boolean(false), "Male", 
         new Integer(35) }, 
       { "John", "Doe", "Testing", new Integer(65000), new Integer(3), new Boolean(true), "Male", 
         new Integer(45) }, 
       { "Sue", "Black", "Testing", new Integer(60000), new Integer(2), new Boolean(false), "Male", 
         new Integer(40) }, 
       { "Jane", "White", "Developer", new Integer(70000), new Integer(20), new Boolean(true), "Male", 
         new Integer(35) }, 
       { "Joe", "Brown", "Networking", new Integer(60000), new Integer(10), new Boolean(false), "Male", 
         new Integer(30) } }; 

     myTableModel model = new myTableModel(); 


     table = new JTable(); 
     table.setRowHeight(50); 
     table.setModel(model); 
     TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(table.getModel()){ 


      @Override 
      public boolean isSortable(int ColumnNames) { 
       if(ColumnNames < (2)) 
        return true; 
       else 
        return false; 
      }}; 


     table.setRowSorter(sorter); 


     setUpVegColumn(table,table.getColumnModel().getColumn(5)); 
     setUpSalColumn(table, table.getColumnModel().getColumn(3)); 


     table.setCellSelectionEnabled(true); 
     scrollPane = new JScrollPane(table); 
     topPanel.add(scrollPane, BorderLayout.CENTER); 

    } 





    private void setUpSalColumn(JTable table, TableColumn column) { 
     TableColumn salary = table.getColumnModel().getColumn(3); 
     salary.setCellEditor(new DefaultCellEditor(textBox)); 
     String s =textBox.getText(); 
     Pattern pattern = Pattern.compile("^[0-9]*$"); 
     Matcher m = pattern.matcher(s); 
     if((!m.matches())){ 

      textBox.setEditable(false); 

     JOptionPane.showMessageDialog(null, "enter numbers only"); 
      } 
      else 
      { 
      textBox.setEditable(true); 
      } 
      } 





    private void setUpVegColumn(JTable table, TableColumn column) { 
     JComboBox comboBox = new JComboBox(); 
     DefaultComboBoxModel model = new DefaultComboBoxModel(); 
     model.addElement("True"); 
     model.addElement("False"); 
     model.addElement("Both"); 

     model.addElement("None of the above"); 
     comboBox.setModel(model); 
     column.setCellEditor(new DefaultCellEditor(comboBox)); 

     model = new DefaultComboBoxModel(); 
     model.addElement("True"); 
     model.addElement("False"); 

     model.addElement("Both"); 
     model.addElement("None of the above"); 
     // Set up tool tips for the sport cells. 
     ComboBoxTableCellRenderer renderer = new ComboBoxTableCellRenderer(); 
     renderer.setModel(model); 
     column.setCellRenderer(renderer); 

    } 


    class ComboBoxTableCellRenderer extends JComboBox implements TableCellRenderer { 

     @Override 
     public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, 
       int row, int column) { 
      setSelectedItem(value); 
      return this; 
     } 

    } 

    public class myTableModel extends DefaultTableModel { 
     myTableModel() { 
      super(dataValues, columnNames); 
     } 

     @Override 
     public boolean isCellEditable(int row, int cols) { 
      if(cols==3 || cols==5){ 

       return true; 
      } 
      else{ 
       return false; 
      } 
     } 
    } 

    public static void main(String args[]) { 
     MyTable x = new MyTable(); 
     x.setVisible(true); 
    } 
+0

Вы можете использовать ColumNames.values ​​(). Публикация DefaultTableModel (Object [] [] data, Object [] columnNames) { setDataVector (data, columnNames); }, принять массив объектов. – hasnae

+0

Для проверки валидации вы можете использовать CellEditor, здесь вы можете найти пример http://stackoverflow.com/questions/7531513/how-to-mark-jtable-cell-input-as-invalid/7539298#7539298 – hasnae

ответ

1

перечисление представляет собой набор статических экземпляров этого типа перечислений , Поэтому ColumNames.FIRSTNAME имеет тип ColumNames, тогда как для заголовка требуется строка. Вы можете использовать либо значение экземпляра, однако это не может дать вам то, что вы хотите:

public enum ColumNames { 
    FIRSTNAME, LASTNAME, DEPARTMENT, SALARY, 
    YEARS, VEGETARIAN, GENDER,AGE; 
} 
final int numberOfColumns = ColumNames.values().length; 
columnNames = new String[numberOfColumns ]; 
for (int i = 0; < numberOfColumns; i++) { 
    columnNames[i] = ColumNames.values()[i].name(); 
} 

Это даст вам эквивалентный массив:

columnNames = new String[] { "FIRSTNAME", "LASTNAME", "DEPARTMENT", "SALARY", "YEARS", "VEGETARIAN", "GENDER", "AGE" }; 

Или вы можете определить отображение метод вашего enum и использования, что вместо name():

public enum ColumNames { 
    FIRSTNAME("FirstName"), 
    LASTNAME("LastName"), 
    DEPARTMENT("Department"), 
    SALARY("Salary", 
    YEARS("Years"), 
    VEGETARIAN("Vegetarian"), 
    GENDER("Gender"), 
    AGE("Age"); 
    private final displayName; 
    private ColumNames(String displayName){ 
     this.displayName = displayName; 
    } 
    public String getDisplayName() { 
     return displayName; 
    } 
} 

Однако если интернационализация является проблемой, то первый подход является более один, так как он использует константная строка, не зависящая от локальной, может быть заменена в пользовательском интерфейсе.

0

Вы должны использовать слушатель действия, в противном случае приложение не будет знать, если это действие было выполнено, вот пример метода setUpSalColumn:

private void setUpSalColumn(JTable table, TableColumn column) { 
     TableColumn salary = table.getColumnModel().getColumn(3); 
     textBox.getDocument().addDocumentListener(new DocumentListener() { 
      public void changedUpdate(DocumentEvent e) { 
       validateSal(); 
      } 

      public void removeUpdate(DocumentEvent e) { 
       validateSal(); 
      } 

      public void insertUpdate(DocumentEvent e) { 
       validateSal(); 
      } 

      public void validateSal() { 
       Pattern pattern = Pattern.compile("^[0-9]*$"); 
       String s = textBox.getText(); 
       Matcher m = pattern.matcher(s); 
       if ((!m.matches())) { 
        JOptionPane.showMessageDialog(null, "enter numbers only"); 
       } else { 
        textBox.setEditable(true); 
       } 
      } 
     }); 
     salary.setCellEditor(new DefaultCellEditor(textBox)); 

    } 
Смежные вопросы