如何在Jtable中动态添加列名?
How to add column Name dynamically in Jtable?
我在我的项目中使用 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();
}
}
这是我向 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);
}
希望你有办法添加专栏。
I want that when I have written something in that column after that column should be generated...otherwise not.....
好的,基本上,当您确定您位于最后一列并且按下 Tab 键时,您想要确定当前列是否有任何值,如果它包含任何 "empty" 个单元格,那么它将简单地移动到下一个 row/first 列,否则它将添加一个新列。
以下测试假定空单元格是具有 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);
}
}
}
when we double click on that column
我假设您希望能够在双击最后一列时添加一个新列。基本思想与上面的键绑定中介绍的相同,计算列,如果它是最后一列,则确定它是否包含任何 "empty" 值并根据需要添加列
table.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (SwingUtilities.isLeftMouseButton(e) && e.getClickCount() == 2) {
int viewCol = table.columnAtPoint(e.getPoint());
if (viewCol == table.getColumnCount()) {
// You know, check there are values
// make new column as needed
}
}
}
});
我已经通过这种方式完成了它的工作......希望我的回答对任何人都有帮助......
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);
}
}
我在我的项目中使用 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();
}
}
这是我向 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);
}
希望你有办法添加专栏。
I want that when I have written something in that column after that column should be generated...otherwise not.....
好的,基本上,当您确定您位于最后一列并且按下 Tab 键时,您想要确定当前列是否有任何值,如果它包含任何 "empty" 个单元格,那么它将简单地移动到下一个 row/first 列,否则它将添加一个新列。
以下测试假定空单元格是具有 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);
}
}
}
when we double click on that column
我假设您希望能够在双击最后一列时添加一个新列。基本思想与上面的键绑定中介绍的相同,计算列,如果它是最后一列,则确定它是否包含任何 "empty" 值并根据需要添加列
table.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (SwingUtilities.isLeftMouseButton(e) && e.getClickCount() == 2) {
int viewCol = table.columnAtPoint(e.getPoint());
if (viewCol == table.getColumnCount()) {
// You know, check there are values
// make new column as needed
}
}
}
});
我已经通过这种方式完成了它的工作......希望我的回答对任何人都有帮助......
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);
}
}