这是我的jTable
private JTable getJTable() {
String[] colName = { "Name", "Email", "Contact No. 1", "Contact No. 2",
"Group", "" };
if (jTable == null) {
jTable = new JTable() {
public boolean isCellEditable(int nRow, int nCol) {
return false;
}
};
}
DefaultTableModel contactTableModel = (DefaultTableModel) jTable
.getModel();
contactTableModel.setColumnIdentifiers(colName);
jTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
return jTable;
}
Run Code Online (Sandbox Code Playgroud)
我将调用此方法从数据库中检索数据并将其放入表模型中
public void setUpTableData() {
DefaultTableModel tableModel = (DefaultTableModel) jTable.getModel();
ArrayList<Contact> list = new ArrayList<Contact>();
if (!con.equals(""))
list = sql.getContactListsByGroup(con);
else
list = sql.getContactLists();
for (int i …
Run Code Online (Sandbox Code Playgroud) JTable
当我们做一个fireTableDataChanged()
或fireTableRowsUpdated()
来自时,我们看到选择被清除TableModel
.
这是预期的,还是我们做错了什么?我没有看到JTable
关于清除/保留模型更新选择的(或其他相关类)的任何属性.
如果这是默认行为,是否有一种防止这种情况的好方法?也许某种方式在更新之前"锁定"选择并在之后解锁?
开发人员一直在尝试在更新之前保存选择并重新应用它.这有点慢.
这是Windows XP上的Java 1.4.2,如果这很重要的话.我们仅限于基于我们使用的某些供应商代码的版本.
首先,抱歉发布一些可能有点过于具体的内容,但我对Swing不是很有经验,似乎无法找到符合我需求的好例子.
所以我试图找出实现动态GUI的最佳方法,以便在Swing中选择过滤条件:
底层模型是一个类,其中包含可以否定的标准列表(即应用NOT前缀),以及指示这些标准是否应与AND或OR组合的属性.
GUI将允许用户添加,更改或删除标准,并选择组合运算符(和/或).第一个标准自然没有组合选择器,第三个和后续标准将简单地使用与第二个标准相同的组合运算符.
右侧的X按钮将用于删除标准.按下"添加"按钮后,将在底部添加一个新的组件行.随着更改,这些将反映在基础模型中.
当然,我可以通过简单地将组件添加到JPanel然后相应地更新模型来实现"原始",但我更喜欢更简洁的解决方案,例如TableModel提供的解决方案.
所以我想知道一个带有自定义TableModel和TableCellRenderer/Editor的表是否是最好的方法,或者是否有更好的方法来实现这样的东西.如果table确实是最好的方法,我会很感激指出如何使用TableCellRenderers或-Editors来实现这一目标.
提前致谢.
在Java中,我使用DefaultTableModel动态地向JTable添加列.
//create DefaultTableModel with columns and no rows
DefaultTableModel tableModel = new DefaultTableModel(columnNames, 0);
JTable table = new JTable(tableModel);
Run Code Online (Sandbox Code Playgroud)
columnNames变量是一个包含列名的字符串数组.因此,在程序启动并运行后,用户可以选择添加其他列.我是这样做的
tableModel.addColumn("New column name");
Run Code Online (Sandbox Code Playgroud)
根据需要动态地将列添加到表中.用户还可以删除添加的列.为此,我使用以下代码:
TableColumn tcol = table.getColumnModel().getColumn(0);
table.getColumnModel().removeColumn(tcol);
Run Code Online (Sandbox Code Playgroud)
应该删除指定索引处的列,我也尝试过:
table.removeColumn(sheet.getColumn(assessmentName));
Run Code Online (Sandbox Code Playgroud)
它们都可以(视觉上)工作,但这就是问题所在.删除添加的列后,如果添加了另一列并且表刷新,则先前删除的列再次出现.因此,虽然它在视觉上删除了列,但最后两个代码片段实际上都没有从模型中删除它.我在这里假设,因为列已添加到需要从中移除的模型中?是否需要调用特定方法或需要实现的一些逻辑来删除列?
我正在使用多个构建和应用程序,JTables
我需要检测何时发生单元格值更改,以便我可以在数据库中更新它.我尝试TableModelListener
并覆盖tableChanged
,但只有在我编辑完单元格后单击(单击另一行)时才会触发.
还有其他办法吗?
如何移动一行,jTable
以便row1进入row2的位置,row2进入row1的位置?
我知道我们必须使用AWT线程进行所有表模型更新操作.在单个AWT线程下,任何表模型都是线程安全的.为什么DefaultTableModel选择线程安全的Vector作为其数据结构,这比其他数据结构如ArrayList慢?
是否有任何方法用于获取所选行的数据?我只想简单地单击包含数据的特定行,然后单击将在控制台中打印数据的按钮.
我想将读取lucene索引的结果存储到jTable中,以便我可以通过不同的列对其进行排序.从索引我正在阅读具有不同频率度量的术语.
表列是这些:[string term] [int absFrequency] [int docFrequency] [double invFrequency]
所以我在AbstractTableModel中我可以定义列名,但我不知道如何使用以下方法得到Object [] []数据:
public static void FrequencyMap(Directory indexDir) throws Exception
{
List<ArrayList>redoviLista = new ArrayList<ArrayList>();
//final Map<String,TermRow> map = new TreeMap<String,TermRow>();
List<String>termList = new ArrayList<String>();
IndexReader iReader = IndexReader.open(indexDir);
FilterIndexReader fReader = new FilterIndexReader(iReader);
int numOfDocs = fReader.numDocs();
TermEnum terms = fReader.terms();
while (terms.next()){
Term term = terms.term();
String termText = term.text();
termList.add(termText);
//Calculating the frequencies
int df = iReader.docFreq(term);
double idf = 0.0F;
idf = Math.log10((double) numOfDocs / df);
double …
Run Code Online (Sandbox Code Playgroud) 是否可以替换现有JTable中的整个TableModel,还是必须重新创建JTable?