我有一个JFrame,它有一个JTable,它可以代表数据库中的数据。一切都很好,但我想在删除操作后从另一个类加载或刷新它。
我已经完成了删除操作,但我无法从另一个类加载JTable。我的代码如下:
scrollPane = new JScrollPane();
add(scrollPane, BorderLayout.CENTER);
DefaultTableModel model=null;
try {
model = makeTableModel();
} catch (SQLException | IOException e) {
e.printStackTrace();
}
table = new JTable(model);
table.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent arg0) {
int row = table.getSelectedRow();
String getvalue = (table.getModel().getValueAt(row, 4).toString());
PopulatePhotographerClass pp=new PopulatePhotographerClass(getvalue);
}
});
table.setRowHeight(200);
scrollPane.setViewportView(table);
这是我的makeTableModel
方法:
public static DefaultTableModel makeTableModel() throws SQLException, IOException {
DefaultTableModel model = new DefaultTableModel(new String[]{"Image", "Name","Address","mobile-Number","NID"}, 0) {
@Override
public Class<?> getColumnClass(int columnIndex) {
return columnIndex == 0 ? Icon.class : super.getColumnClass(columnIndex);
}
};
String cmd = "select * from photographer_lookup";
try (Connection con =database.DbConnect.getconnection()) {
try (PreparedStatement stmt = con.prepareStatement(cmd)) {
try (ResultSet rs = stmt.executeQuery()) {
while (rs.next()) {
String name = rs.getString(3);
Blob blob = rs.getBlob(1);
String address=rs.getString("address");
String mobile=rs.getString("mobile_number");
String nid=rs.getString("Nid");
ImageIcon icon = null;
try (InputStream is = blob.getBinaryStream()) {
BufferedImage img = ImageIO.read(is);
icon = new ImageIcon(img);
}
model.addRow(new Object[]{icon,name,address,mobile,nid});
}
}}}
return model;
}
这是我写的代码。现在我想定义一个方法来完成上面提到的所有工作,并且它将被另一个类调用。
答案 0 :(得分:1)
首先,您使用视图索引来索引模型时出错。 JTable中返回行或列索引的监听器和所有方法将报告 view 索引(xyPlot.setDomainAxis(0, xAxis1);
xyPlot.setDomainAxis(1, xAxis2);
xyPlot.setDomainAxis(2, xAxis3);
xyPlot.setRangeAxis(0, yAxis);
xyPlot.mapDatasetToDomainAxis(0, 0);
xyPlot.mapDatasetToRangeAxis(0, 0);
xyPlot.setDomainAxisLocation(1, AxisLocation.BOTTOM_OR_LEFT);
xyPlot.setDomainAxisLocation(2, AxisLocation.BOTTOM_OR_LEFT);
方法除外)。
当表格被排序或列移动时,视图索引将与模型索引不同。 JTable不会对模型进行排序或重新排列模型中的列,而是将其映射更改为模型。
如果您拥有的是视图索引,并且您想查找单元格值,则
convertXXXIndexToModel
,其中包含视图索引JTable.getValueAt
)中建立索引之前,使用JTable.convertRowIndexToModel
和JTable.convertColumnIndexToModel
将视图索引转换为模型索引。您的鼠标监听器应为:
JTable.getModel()
更好的做法是实现table.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent arg0) {
int row = table.getSelectedRow();
if( row < 0 ) return; // check if a row is selected first!
String getvalue = table.getValueAt(row, table.convertColumnIndexToView( 4 ) ).toString(); // use table.getValueAt, this getter takes view indices! Use convertColumnIndexToView to get a view index from a model index!
PopulatePhotographerClass pp=new PopulatePhotographerClass(getvalue);
}
});
来监听选择事件,而不是使用ListSelectionListener
来处理选择事件(感谢MouseListener
指出这一点)。这样,您将直接通知列表选择更改。
如果您希望从另一个类完成操作,请在您的类中编写一个扩展JFrame的公共方法来执行此操作。如果你在另一个类中有这个类的实例,只需调用这个新创建的公共方法。
假设您的JFrame类名为MyFrameWithJTable
@mKorbel
然后在另一个类中,如果你有一个MyFrameWithJTable类的实例,你可以做
public class MyFrameWithJTable extends JFrame {
public void doSomeWork( /*parameters required in the operation*/ ) {
// Does the work you want to call from another class
// Eg the updates you want done in the JTable's model
}
}