JAVA NETBEANS
// resultsTable, myModel
JTable resultsTable;
DefaultTableModel myModel; //javax.swing.table.DefaultTableModel
myModel = (DefaultTableModel) resultsTable.getModel();
// event of clicking on item of table
String value = (String) myModel.getValueAt(resultsTable.getSelectedRow(), columnIndex)
Run Code Online (Sandbox Code Playgroud)
我使用JTable和DefaultTableModel来查看各种信息的表,我想获得表的所选索引的某个列的值.
我上面编写的代码工作正常,除非:我使用GUI的类型(单击我要在表上排序的字段名称)表格已正确排序但在此之后,当我选择一行时,它获取的值排序前的那一行.这意味着在排序(使用JTable的GUI)之后,'myModel'和'resultsTable'对象具有不同的行索引.
我如何同步这两个?
我正在为我的客户开发一个服务器JTable.
当我开始使用表模型时,我刚刚完成了列模型.与表模型中的列相关的大多数函数实际上是列模型中函数的别名.
无论如何,发生了一些奇怪的事情.我希望有人可以帮助我:
JTable正确显示列.这意味着getColumnCount和getColumnName正常工作.
行数正确显示.这意味着getRowCount正常工作.
正确显示每行的单元格数,因为表模型中的"getColumnCount"会返回列模型中getColumnCount的值.
现在,出现了奇怪的事情:
每行的第一个单元格的值是正确的.但对同一行中的所有其他单元格保持不变.
我假设,就像你们大多数人已经做过的那样,getValueAt中有一些错误.因此,我决定在呈现表格后对其进行硬编码.并猜测:价值回归正确.
经过一些调试后,我发现它的JTable调用'getValueAt(rowIndex,0)',而不是'getValueAt(rowIndex,columnIndex)'.
谁能帮我这个?最好的祝福...
表模型
/**
* Returns the value to be displayed for this column at this row index.
* @param rowIndex
* @param columnIndex
* @return
*/
public Object getValueAt(int rowIndex, int columnIndex) {
System.out.println(String.format("LOS_TableModel: getValueAt(%d, %d)", rowIndex, columnIndex));
LOS_TableCell cell = this.getCell(columnIndex, rowIndex);
if(cell == null) return null;
else return cell.value;
}
/**
* Returns the LOS_TableCell at the specified JTable indexes
* @param index
* @return
*/
public LOS_TableCell …
Run Code Online (Sandbox Code Playgroud) 当用户双击时,我试图使JTable的所有单元格都不可编辑.我已经阅读了很多论坛帖子,一般的共识是创建一个新的表模型类,扩展DefaultTableModel然后重写方法isCellEditable(int row,int column).我做了所有这些,现在当我运行我的程序(小程序)时,没有任何东西出现在单元格中.注意我这个学期有一个教授不认为applet已经过时了...
表模型的代码:
public class MyTableModel extends DefaultTableModel
{
public boolean isCellEditable(int row, int column) //override isCellEditable
//PRE: row > 0, column > 0
//POST: FCTVAL == false always
{
return false;
}
}
Code in my class: **NOTE** this class extends JPanel
private JScrollPane storesPane;
private JTable storesTable;
Code in the Constructor:
storesTable = new JTable(tableData, COL_NAMES); //tableData and COL_NAMES are passed in
storesTable.setModel(new MyTableModel());
storesPane = new JScrollPane(storesTable);
storesTable.setFillsViewportHeight(true);
add(storesPane, BorderLayout.CENTER);
Run Code Online (Sandbox Code Playgroud)
希望你们中的一些Java大师可以找到我的错误:)
我想设计这个JTable.
目标是用户能够通过双击来编辑单元格.任何更改都应该能够保存并稍后存储在数据库中.
我的代码如下:
public class BirthGUI extends JFrame implements TableModelListener {
//..//
//-------------------- BIRTH TABLE --------------------
table = new JTable();
table.setModel(myModel);
myModel.reloadBirthJTable();
table.getColumnModel().getColumn(0).setPreferredWidth(100);
table.getColumnModel().getColumn(1).setPreferredWidth(80);
table.getColumnModel().getColumn(2).setPreferredWidth(115);
table.setRowHeight(20);
JScrollPane scroller = new JScrollPane(table );
table.setBounds(49, 85, 295, 374);
table.getModel().addTableModelListener(this);
panel.add(scroller,BorderLayout.CENTER);
@Override
public void tableChanged(TableModelEvent e) {
System.out.println("TableModelEvent triggered!");
int row = e.getFirstRow();
int column = e.getColumn();
Object test = myModel.getValueAt(row, column);
System.out.println("row: " + row + " column: " + column);
System.out.println(test.toString());
}
Run Code Online (Sandbox Code Playgroud)
和我的TableModel:
public class BirthTableModel extends DefaultTableModel {
private String[] …
Run Code Online (Sandbox Code Playgroud) 这是我的场景:我对一个应用程序有3个视图,其中2个是相同的,除了1个东西 - 一个有额外的过滤.所有视图都使用相同的模型,因为它们以(有些)不同的方式显示相同的数据.两个相似的视图都是JTable,如下所示:
我可以为第二个视图创建过滤器,但由于两个视图都使用相同的模型(实现了TableModel),因此它们在数据模型中调用相同的函数getValueAt(int rowIndex, int columnIndex)
- 目前只在基本级别上进行过滤.
在不影响第一个视图的情况下,另外过滤第二个视图的最简单方法是什么?我将如何实现这一目标?
提前致谢.
我在jtable排序机制中找不到问题,当我在搜索代码中实现排序时,它给出了数组索引超出范围,填充表代码在初始阶段工作正常,但在搜索发生后它也被卡住了.
我的应用程序有一个文本字段区域,它接受从数据库搜索的关键字.现在搜索后,它会在jtable上显示它,我想为它提供表格分类器.任何帮助表示赞赏.thks.我还提供了下面的堆栈跟踪.
//问题代码
// for searching data from data base and display it in table
// according to the keyword typed.
private void jTextField1KeyPressed(java.awt.event.KeyEvent evt) {
System.out.println(evt.getKeyCode());
if(evt.getKeyCode() == KeyEvent.VK_ENTER){
jTable1.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
{null, null, null}
},
new String [] {
"cust_ID", "Title 2", "Title 3"
}
) {
boolean[] canEdit = new boolean [] {
false, false, false
};
public boolean isCellEditable(int rowIndex, int columnIndex) {
return canEdit [columnIndex];
}
});
jTable1.removeColumn(jTable1.getColumnModel().getColumn(0));
String query = "SELECT …
Run Code Online (Sandbox Code Playgroud) 下面是我的照片JTable
.我的问题是第4列中没有每隔一行的蓝色背景.我的表格模型和单元格渲染器也在下面.
表型号:
public class MyTableModel extends DefaultTableModel {
public int getColumnCount() {
return columnNames.length;
}
public String getColumnName(int column) {
return columnNames[column];
}
public int getRowCount() {
return data.length;
}
public Object getValueAt(int row, int column) {
return data[row][column];
}
public Class getColumnClass(int column) {
return (getValueAt(0, column).getClass());
}
public void setValueAt(Object value, int row, int column) {
data[row][column] = value;
}
public boolean isCellEditable(int row, int column) {
return (column == 3);
}
}
Run Code Online (Sandbox Code Playgroud)
细胞渲染器:
private class …
Run Code Online (Sandbox Code Playgroud) 如何在JTable中显示"Click"对象?
ArrayList<Click> myClicks = new ArrayList<Click>();
Click click = new Click(620, 1028);
Click click2 = new Click(480, 230);
myClicks.add(click);
myClicks.add(click2);
Run Code Online (Sandbox Code Playgroud)
它应该看起来像这样:
|---Mouse X---|---Mouse Y---|
| 620 | 1028 |
| 480 | 230 |
Run Code Online (Sandbox Code Playgroud)
哪个真的......
| |
v v
click.getX() click.getY()
click2.getX() click2.getY()
Run Code Online (Sandbox Code Playgroud)
我不想使用2D Object [] [],因为尽可能将它们保持为Click对象更有意义.
我知道我可能需要扩展TableModel接口,但我不确定如何.
我想请一个快速而简单的例子(java文档有点令人困惑).
我有一个JTable
被调用的transactionList
,每一行代表一个Transaction
,其中第一列保存实际Transaction
对象,随后的每个列显示有关 的一些数据Transaction
。
我不希望该Transaction
对象向用户显示,因此我将其从以下位置中删除ColumnModel
:
TableColumnModel cm = transactionList.getColumnModel();
cm.removeColumn(cm.getColumn(0));
transactionList.setColumnModel(cm);
Run Code Online (Sandbox Code Playgroud)
这非常有效,然后我可以Transaction
使用以下方法检索所选内容:
(Transaction) transactionList.getModel().getValueAt(transactionList.getSelectedRow(), 0))
Run Code Online (Sandbox Code Playgroud)
当用户对表中的列进行排序时,问题就出现了,然后所选的行无法正确匹配。我通过更改上面的行来解决这个问题,以便我们直接从表中而不是从模型中获取所选行:
(Transaction) transactionList.getValueAt(transactionList.getSelectedRow(), 0));
Run Code Online (Sandbox Code Playgroud)
但现在 0 列不是我的隐藏Transaction
对象,而只是它的第一个字段。
我也会尝试用另一种方式来解释。
在不允许对 JTable 列进行排序的情况下,这两个示例都有效:
1) 在第一列中显示 Transaction 对象(不要从 ColumnModel 中删除)
可以通过以下方式检索 Transaction 对象:
transactionList.getValueAt(transactionList.getSelectedRow(), 0));
Run Code Online (Sandbox Code Playgroud)
2) 在第一列中显示 Transaction 对象(从 ColumnModel 中删除)
可以通过以下方式检索 Transaction 对象:
transactionList.getModel().getValueAt(transactionList.getSelectedRow(), 0))
Run Code Online (Sandbox Code Playgroud)
如果我现在允许对列进行排序,#1 仍然有效。然而,方法 #2 现在将 JTable.getSelectedRow() 传递给 TableModel.getValueAt()。但这些索引不再相等,问题是 JTable 和 ColumnModel 不包含 Transaction 对象(只有 TableModel 包含)。
transactionList.getColumnCount(); …
Run Code Online (Sandbox Code Playgroud) 在java swing tablemodel中,我们可以触发表更改,添加,删除等.我想知道如果组件不可见,这些方法调用是否很昂贵?
例如,另一个窗口覆盖它.或者它处于非活动选项卡中.