Java 如何在Jtable中动态添加列名?

Java 如何在Jtable中动态添加列名?,java,jtable,Java,Jtable,我在我的项目中使用Jtable,当按下tab键时,会添加新列,但该列的名称不在其中。它在那个地方显示一个空白,我希望列名应该是excel格式的,比如excel列名应该是a、B、C等等。那么我应该检查什么呢 private void datatypetableKeyPressed(java.awt.event.KeyEvent evt) { if (evt.getKeyCode() == KeyEv

我在我的项目中使用Jtable,当按下tab键时,会添加新列,但该列的名称不在其中。它在那个地方显示一个空白,我希望列名应该是excel格式的,比如excel列名应该是a、B、C等等。那么我应该检查什么呢

private void datatypetableKeyPressed(java.awt.event.KeyEvent evt) {                                         

        if (evt.getKeyCode() == KeyEvent.VK_TAB) {
            addColumn();
        }
    } 

private void addColumn() {
        DefaultTableModel model = (DefaultTableModel) datatypetable.getModel();
        JTableHeader th = datatypetable.getTableHeader();
        TableColumnModel tcm = th.getColumnModel();
        TableColumn tc = tcm.getColumn(0);

        if (model != null) {
            Vector v = new Vector(1);
            for (int j = 0; j < datatypetable.getRowCount(); j++) {
                tc.setHeaderValue("???");
                v.add("");


            }
            model.addColumn(v);
            th.repaint();
        }
    }
private void datatypetableKeyPressed(java.awt.event.KeyEvent evt){
if(evt.getKeyCode()==KeyEvent.VK_选项卡){
addColumn();
}
} 
私有void addColumn(){
DefaultTableModel=(DefaultTableModel)datatypetable.getModel();
JTableHeader th=datatypetable.getTableHeader();
TableColumnModel tcm=th.getColumnModel();
TableColumn tc=tcm.getColumn(0);
如果(型号!=null){
向量v=新向量(1);
对于(int j=0;j

这是我为jtable添加新列的代码。

您可以这样添加列

DefaultTableModel model = new DefaultTableModel();

JTable table = new JTable(model);
//add you dynamic column name logic. ex, I am adding with i loop variable.
for( int i=1; i<5;i++){
model.addColumn("Col"+i);
}
DefaultTableModel=新的DefaultTableModel();
JTable table=新的JTable(模型);
//添加动态列名逻辑。例如,我正在添加一个循环变量。
对于(int i=1;i
我希望当我在该列中写了一些东西后,应该生成该列…否则不会

好的,基本上,当你确定你在最后一列并且按下Tab键时,你想确定当前列是否有任何值,如果它包含任何“空”单元格,那么它将只移动到下一行/第一列,否则它将添加一个新列

以下测试假设空单元格是具有
null
值的单元格,因此如果您的需求不同,则需要更新代码以支持它

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.util.Vector;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableModel;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JTable table = new JTable();
                table.setGridColor(Color.GRAY);
                table.setShowGrid(true);
                DefaultTableModel model = new DefaultTableModel();
                for (int col = 0; col < 10; col++) {
                    Vector<String> colData = new Vector<String>(10);
                    for (int row = 0; row < 10; row++) {
                        colData.add(row + "x" + col);
                    }
                    model.addColumn(Character.toString((char)('A' + col)), colData);
                }
                table.setModel(model);

                InputMap im = table.getInputMap();
                im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "Action.NextCell");
                im.put(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0), "Action.NextCell");

                ActionMap am = table.getActionMap();
                am.put("Action.NextCell", new NextCellActioin(table, model));

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new JScrollPane(table));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class NextCellActioin extends AbstractAction {

        private JTable table;
        private DefaultTableModel model;

        public NextCellActioin(JTable table, DefaultTableModel model) {
            this.table = table;
            this.model = model;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            int col = table.getSelectedColumn();
            int row = table.getSelectedRow();

            int colCount = table.getColumnCount();
            int rowCount = table.getRowCount();

            col++;
            boolean newColumn = true;
            if (col >= colCount) {
                int lastColumn = colCount - 1;
                for (int index = 0; index < table.getRowCount(); index++) {
                    if (table.getValueAt(index, lastColumn) == null) {
                        newColumn = false;
                        break;
                    }
                }
                if (!newColumn) {
                    col = 0;
                    row++;
                }
            }

            if (newColumn) {
                String name = Character.toString((char) ('A' + model.getColumnCount() + 1));
                model.addColumn(name);
                col++;
            } else {
                if (row >= rowCount) {
                    row = 0;
                }
            }
            table.getSelectionModel().setSelectionInterval(row, row);
            table.getColumnModel().getSelectionModel().setSelectionInterval(col, col);
        }

    }

}

我已经这样做了,它的工作…希望我的回答能帮助任何人

private void datatypetableKeyPressed(java.awt.event.KeyEvent evt) {                                         
            if (evt.getKeyCode() == KeyEvent.VK_ENTER) {
                int col = datatypetable.getSelectedColumn();
                int row = datatypetable.getSelectedRow();
                int colCount = datatypetable.getColumnCount();
                int rowCount = datatypetable.getRowCount();
                col++;
                if (col >= colCount) {
                    col = 0;
                    row++;
                }
                if (row >= rowCount) {
                    row = 0;
                }
    //            datatypetable.getSelectionModel().setSelectionInterval(row, row);
    //            datatypetable.getColumnModel().getSelectionModel().setSelectionInterval(col, col);
    //            datatypetable.editCellAt(row, col);
                if (row == rowCount - 1) {
                    addRow();
                    datatypetable.scrollRectToVisible(datatypetable.getCellRect(rowCount, 0, true));
                }
            }

            if (evt.getKeyCode() == KeyEvent.VK_TAB) {
                int col = datatypetable.getSelectedColumn();
                int row = datatypetable.getSelectedRow();
                int colCount = datatypetable.getColumnCount();
                int rowCount = datatypetable.getRowCount();
                col++;
                if (col >= colCount) {
                    col = 0;
                    row++;
                }
                if (row >= rowCount) {
                    row = 0;
                }
    //            datatypetable.getSelectionModel().setSelectionInterval(row, row);
    //            datatypetable.getColumnModel().getSelectionModel().setSelectionInterval(col, col);
    //            datatypetable.editCellAt(row, col);
                if (col == colCount - 1) {
                    addColumn();
                    int selectedRow = 0;
                    datatypetable.editCellAt(selectedRow, 0);
                    datatypetable.setSurrendersFocusOnKeystroke(true);
                    datatypetable.getEditorComponent().requestFocus();
                    datatypetable.scrollRectToVisible(datatypetable.getCellRect(colCount, 0, true));
                }
            }

        }  


    private void addRow() {
            DefaultTableModel model = (DefaultTableModel) datatypetable.getModel();

            if (model != null) {
                Vector v = new Vector(1);
    //            for (int j = 0; j <= datatypetable.getColumnCount(); j++) {
    //                v.add("");
    //            }
                v.add("");
                model.addRow(v);
            }
        }

        private void addColumn() {
            DefaultTableModel model = (DefaultTableModel) datatypetable.getModel();

            if (model != null) {
                Vector v = new Vector(1);
    //            for (int j = 0; j < datatypetable.getRowCount(); j++) {
    //                v.add("");
    //            }
                v.add("");
                model.addColumn(Character.toString((char) ('A' + datatypetable.getColumnCount())), v);
            }
        }
private void datatypetableKeyPressed(java.awt.event.KeyEvent evt){
if(evt.getKeyCode()==KeyEvent.VK_ENTER){
int col=datatypetable.getSelectedColumn();
int row=datatypetable.getSelectedRow();
int colCount=datatypetable.getColumnCount();
int rowCount=datatypetable.getRowCount();
col++;
如果(列>=列计数){
col=0;
行++;
}
如果(行>=行计数){
行=0;
}
//datatypetable.getSelectionModel().setSelectionInterval(行,行);
//datatypetable.getColumnModel().getSelectionModel().setSelectionInterval(列,列);
//datatypetable.editCellAt(行、列);
如果(行==行计数-1){
addRow();
scrollRectToVisible(datatypetable.getCellRect(rowCount,0,true));
}
}
if(evt.getKeyCode()==KeyEvent.VK_选项卡){
int col=datatypetable.getSelectedColumn();
int row=datatypetable.getSelectedRow();
int colCount=datatypetable.getColumnCount();
int rowCount=datatypetable.getRowCount();
col++;
如果(列>=列计数){
col=0;
行++;
}
如果(行>=行计数){
行=0;
}
//datatypetable.getSelectionModel().setSelectionInterval(行,行);
//datatypetable.getColumnModel().getSelectionModel().setSelectionInterval(列,列);
//datatypetable.editCellAt(行、列);
if(col==colCount-1){
addColumn();
int selectedRow=0;
datatypetable.editCellAt(selectedRow,0);
datatypetable.SetUrrendersFocusOnKeystroke(真);
datatypetable.getEditorComponent().requestFocus();
scrollRectToVisible(datatypetable.getCellRect(colCount,0,true));
}
}
}  
私有void addRow(){
DefaultTableModel=(DefaultTableModel)datatypetable.getModel();
如果(型号!=null){
向量v=新向量(1);

//对于(int j=0;j,您应该使用,其中第一个参数是列的名称。您可以使用类似于
Character.toString('A'+tcm.getColumnCount()+1)的内容
要在添加它之前获得名称,谢谢,它现在起作用了,我希望只有在最后一列之后才能生成该列,并且双击该列时应按tab键。那么我该怎么做呢???等等-您的要求似乎有些奇怪。您希望在从最后一列进行tab时添加新列,还是在双击该列时添加新列(或两者都作为单独的操作)?是否希望能够双击列本身或标题?
private void datatypetableKeyPressed(java.awt.event.KeyEvent evt) {                                         
            if (evt.getKeyCode() == KeyEvent.VK_ENTER) {
                int col = datatypetable.getSelectedColumn();
                int row = datatypetable.getSelectedRow();
                int colCount = datatypetable.getColumnCount();
                int rowCount = datatypetable.getRowCount();
                col++;
                if (col >= colCount) {
                    col = 0;
                    row++;
                }
                if (row >= rowCount) {
                    row = 0;
                }
    //            datatypetable.getSelectionModel().setSelectionInterval(row, row);
    //            datatypetable.getColumnModel().getSelectionModel().setSelectionInterval(col, col);
    //            datatypetable.editCellAt(row, col);
                if (row == rowCount - 1) {
                    addRow();
                    datatypetable.scrollRectToVisible(datatypetable.getCellRect(rowCount, 0, true));
                }
            }

            if (evt.getKeyCode() == KeyEvent.VK_TAB) {
                int col = datatypetable.getSelectedColumn();
                int row = datatypetable.getSelectedRow();
                int colCount = datatypetable.getColumnCount();
                int rowCount = datatypetable.getRowCount();
                col++;
                if (col >= colCount) {
                    col = 0;
                    row++;
                }
                if (row >= rowCount) {
                    row = 0;
                }
    //            datatypetable.getSelectionModel().setSelectionInterval(row, row);
    //            datatypetable.getColumnModel().getSelectionModel().setSelectionInterval(col, col);
    //            datatypetable.editCellAt(row, col);
                if (col == colCount - 1) {
                    addColumn();
                    int selectedRow = 0;
                    datatypetable.editCellAt(selectedRow, 0);
                    datatypetable.setSurrendersFocusOnKeystroke(true);
                    datatypetable.getEditorComponent().requestFocus();
                    datatypetable.scrollRectToVisible(datatypetable.getCellRect(colCount, 0, true));
                }
            }

        }  


    private void addRow() {
            DefaultTableModel model = (DefaultTableModel) datatypetable.getModel();

            if (model != null) {
                Vector v = new Vector(1);
    //            for (int j = 0; j <= datatypetable.getColumnCount(); j++) {
    //                v.add("");
    //            }
                v.add("");
                model.addRow(v);
            }
        }

        private void addColumn() {
            DefaultTableModel model = (DefaultTableModel) datatypetable.getModel();

            if (model != null) {
                Vector v = new Vector(1);
    //            for (int j = 0; j < datatypetable.getRowCount(); j++) {
    //                v.add("");
    //            }
                v.add("");
                model.addColumn(Character.toString((char) ('A' + datatypetable.getColumnCount())), v);
            }
        }