如何声明枚举有jtable标题列

时间:2016-01-21 11:45:43

标签: java swing jtableheader

嗨我有一些列的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);
    }

2 个答案:

答案 0 :(得分:1)

枚举是该枚举类型的静态实例的集合。因此ColumNames.FIRSTNAME的类型为ColumNames,而您需要一个String for header。您可以使用实例的值,但这可能无法满足您的需求:

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

然而,如果国际化是一个问题,第一种方法是更好的方法,因为它使用独立于本地的常量字符串,可以在用户界面中替换。

答案 1 :(得分: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));

    }