- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想根据我使用 AbstractTableModel 指定的列从数据库的表中提取数据。表中有 8 列,但只想显示 8 列中的 3 列。
例如:
数据库具有以下列:ID、First_Name、Last_Name、....、Phone_Number。如果我指定要在表中显示 First_Name、Last_Name、Phone_Number,它会显示我的 ID、First_Name 和 Last_Name。我认为我应该指定数据库中列名的索引以显示正确的列,但不知道如何在我的自定义 AbstractTableModel 类中实现它。
public class PhysicianModelController extends AbstractTableModel
{
PhysicianBroker pb = PhysicianBroker.getPhysicianBroker();
private String[] columnNames = {"First Name", "Last Name", "Phone Number"};
private ArrayList<Physician> ph = pb.getAllPhysicians();
@Override
public int getRowCount() {
return ph.size();
}
@Override
public int getColumnCount() {
return columnNames.length;
}
@Override
public String getColumnName(int col)
{
System.out.println(col);
return columnNames[col];
}
@Override
public String getValueAt(int rowIndex, int columnIndex) {
System.out.println(rowIndex + " : " + columnIndex);
Physician p = ph.get(rowIndex);
switch (columnIndex)
{
case 0:
return Integer.toString(p.getEmployeeId());
case 1:
return p.getFirstName();
case 2:
return p.getLastName();
case 3:
return p.getBirthDate();
case 4:
return p.getStartDate();
case 5:
return p.getEndDate();
case 6:
return p.getAddress();
case 7:
return p.getPhoneNumber();
default:
return "Incorrect input";
}
}
public void addRow(Physician p)
{
ph.add(p);
int row = ph.size();
fireTableRowsInserted(row,row);
fireTableDataChanged();
}
@Override
public Class getColumnClass(int c)
{
return getValueAt(0,c).getClass();
}
}
我已经用我的实现重写了 getRowCount()、getColumnCount()、getColumnName()、getValueAt() 和 getColumnClass() 方法。一旦我提供了数据库表中的所有列,一切都会正常工作。
有人可以帮我解决这个问题吗?
谢谢
最佳答案
观察您的 getValueAt
方法。您只有三列。所以你应该根据这个返回值。发生了什么事,对于第 0 列,您获得的是员工 ID,而您想要的是名字……所以……
@Override
public String getValueAt(int rowIndex, int columnIndex) {
System.out.println(rowIndex + " : " + columnIndex);
Physician p = ph.get(rowIndex);
switch (columnIndex)
{
case 0:
return p.getFirstName();
case 1:
return p.getLastName();
case 2:
return p.getPhoneNumber();
default:
return "Incorrect input";
}
}
更新
这是在 JTable 中添加行的代码演示。看看它:
import javax.swing.*;
import javax.swing.border.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.table.*;
import java.util.*;
class Person
{
String name;
String roll;
String subject;
public Person(String name,String roll,String subject)
{
this.name = name;
this.roll = roll;
this.subject = subject;
}
public String getName()
{
return name;
}
public String getRoll()
{
return roll;
}
public String getSubject()
{
return subject;
}
public void setName(String name)
{
this.name = name;
}
public void setRoll(String roll)
{
this.roll = roll;
}
public void setSubject(String subject)
{
this.subject = subject;
}
}
class TableRowAdd extends JFrame
{
private JTable table;
private JScrollPane jsPane;
private MyModel myModel;
private JPanel dialogPanel;
private JTextField tf[];
private JLabel lbl[];
private JButton button;
JDialog dialog;
public void prepareAndShowGUI()
{
myModel = new MyModel();
table = new JTable(myModel);
jsPane = new JScrollPane(table);
button = new JButton("Add");
button.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
dialog.setVisible(true);
}
});
getContentPane().add(button,BorderLayout.SOUTH);
getContentPane().add(jsPane);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
prepareDialogPanel();
pack();
setVisible(true);
}
private void prepareDialogPanel()
{
dialogPanel = new JPanel();
int col = table.getColumnCount();
dialogPanel.setLayout(new GridLayout(col,2));
tf = new JTextField[col];
lbl = new JLabel[col];
for (int i = 0; i < col; i++)
{
lbl[i] = new JLabel(table.getColumnName(i));
tf[i] = new JTextField(10);
dialogPanel.add(lbl[i]);
dialogPanel.add(tf[i]);
}
dialog = new JDialog(this,"Enter details",true);
dialog.getContentPane().add(dialogPanel);
JButton okButton = new JButton("OK");
dialog.getContentPane().add(okButton,BorderLayout.SOUTH);
okButton.addActionListener( new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
dialog.dispose();
myModel.addRow(new Person(tf[0].getText(),tf[1].getText(),tf[2].getText()));
}
});
dialog.pack();
}
private class MyModel extends AbstractTableModel
{
String[] columns = {
"Roll No.",
"Name",
"Subject"
};
ArrayList<Person> inData = new ArrayList<Person>()
{
{
add(new Person("1","Anthony Hopkins","CS01"));
add(new Person("2","James William","CS02"));
add(new Person("3","Mc. Donald","CS03"));
}
};
@Override
public void setValueAt(Object value, int row, int col)
{
Person person = inData.get(row);
switch(col)
{
case 0:
person.setRoll((String)value);
break;
case 1:
person.setName((String)value);
break;
case 2:
person.setSubject((String)value);
break;
default:
System.out.println("Invalid col");
}
fireTableCellUpdated(row,col);
}
@Override
public Object getValueAt(int row, int col)
{
Person person = inData.get(row);
switch(col)
{
case 0:
return person.getRoll();
case 1:
return person.getName();
case 2:
return person.getSubject();
default:
return null;
}
}
@Override
public int getColumnCount()
{
return columns.length;
}
@Override
public int getRowCount()
{
return inData.size();
}
@Override
public String getColumnName(int col)
{
return columns[col];
}
@Override
public boolean isCellEditable(int row ,int col)
{
return true;
}
//This method adds a row to the table
public void addRow(Person person)
{
inData.add(person);
fireTableRowsInserted(inData.size() - 1 ,inData.size() - 1);
}
}
public static void main(String st[])
{
SwingUtilities.invokeLater( new Runnable()
{
@Override
public void run()
{
TableRowAdd td = new TableRowAdd();
td.prepareAndShowGUI();
}
});
}
}
关于java - 自定义 AbstractTableModel 无法正确显示数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15723834/
添加一行并调用 fireTableRowInserted() 还是添加所有行然后调用 fireTableDataChanged() 是个好主意? 最佳答案 如果您所做的只是添加新行,最好添加所有行,然
我正在尝试用 VCID 和 VCIDBACKUP 的空值替换“Dont Have”。这是我的代码: if (controladorExcel == false) { Writa
我有这个表模型,并且我插入以这种方式调用的值: lista.setModel(new SimpleTableModel(dados, colunas)); lista 是 JTable 型号:
我的表格模型在更新其中打印的数据时遇到问题。 我有作为表模型的 AgendaTableModel 类和作为主 UI 的 Screen 类,当我按下“Listar Contatos”按钮时,表模型应该出
我正在开发一个小程序,它应该在 JTable 中显示食谱。一切似乎都工作正常,我遇到的唯一问题是我无法初始化应该正确保存数据的对象。这是让我头疼的类(class): class RecipeTable
我有一个类,它实际上是一些数据的列表,它扩展了AbstractTableModel。此类中的数据存储在线程安全的数组列表中。 但是,如果我想添加一些数据,可以说我在扩展 AbstractTableMo
我引用了很多方法。即fireTableCellUpdated 的有效方法。但其实我还是不申请。 DETA值更新后如何使表内容更新。 方法我调用GJJ方法实现。虽然更新了但是出现了很多新的窗口。这不是我
我找到的例子: http://www.java2s.com/Code/Java/Swing-Components/ButtonTableExample.htm显示如何创建具有指定列(按钮)的 JTab
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我有两个类。第一个类mainWindow扩展了JFrame,其中我有一个JTable table1。在我的第二堂课中,我需要拿到这张 table 。当我在 mainWindow 中生成 getter
在设置特定外观后序列化扩展 AbstractTableModel 的类会导致 java.io.NotSerializedException: com.sun.java.swing.plaf.windo
我有一个扩展 JTable 的类,我想将其设置为 AbstractTableModel,但我了解其可能性的唯一方法是调用 使用 super 的 JTable 构造函数。 但是,我需要在调用构造函数之前
我设法潜伏并找到一个可以替代的好类(class) JTable(Object[][] data, Object[] columnNames)与 RowTableModel(List modelData
嘿。我正在尝试使用 AbstractTableModel 构建一个简单的 JTable,但即使我使用了 JScrollPane,列名称也不会出现。 public class TableModel ex
我有一些数据从我的数据库加载并作为公共(public)静态列表存储在另一个类中,我无法访问 MyTableModel 类中的数据以在 jtable 中存储和查看它们...还有许多其他方法可以用我的数据
是否可以动态更改 AbstractTableModel 列名称? 我正在尝试实现setColumnName(0, "Speed rpm")方法。 public class MyModel extend
我想根据我使用 AbstractTableModel 指定的列从数据库的表中提取数据。表中有 8 列,但只想显示 8 列中的 3 列。 例如: 数据库具有以下列:ID、First_Name、Last_
我已经实现了一个 AbstractTableModel 对象,它是一种时间表。我想将当时将通过使用方法教授的主题写入单元格(因此我不想将行声明为已编译)。我能怎么做?这是我的 AbstractTabl
我正在尝试将 JTable(类型 AbstractTableModel)中编辑的行保存到文件中。我不知道该怎么做;或者可以使用 ObjectOutput 和 InputStream。 此外,我想在保存
我正在制作一个 Swing 项目。可能太大了,无法粘贴到这里。我什至尝试记录 table.getSelectedRow() 并且它显示了正确的索引。但不知何故,当我按下删除按钮时,这会导致在此类中调用
我是一名优秀的程序员,十分优秀!