创建可由另一个类调用的JTable呈现方法

时间:2016-02-04 06:31:24

标签: java swing jtable

我有一个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;
 }

这是我写的代码。现在我想定义一个方法来完成上面提到的所有工作,并且它将被另一个类调用。

1 个答案:

答案 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不会对模型进行排序或重新排列模型中的列,而是将其映射更改为模型。

如果您拥有的是视图索引,并且您想查找单元格值,则

  1. 使用convertXXXIndexToModel,其中包含视图索引
  2. 首先在模型(JTable.getValueAt)中建立索引之前,使用JTable.convertRowIndexToModelJTable.convertColumnIndexToModel将视图索引转换为模型索引。
  3. 您的鼠标监听器应为:

    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
        }
    }