java /对象的表模型/更新对象”

发布于 2024-11-16 22:27:36 字数 1914 浏览 2 评论 0原文

我有一个 Stock 对象集合,我正在实时更新大约 10/15 个变量。我通过集合中的 ID 访问每只股票。我还尝试在 JTable 中显示它并实现了 AbstractTablemodel。效果不太好。

我有一个 RowMap,当股票添加到 TableModel 时,我将每个 ID 添加到其中。为了更新 TableModel 中所有股票的价格和变量,我想将 Stock 对象发送到 updateModel(Stock s) 方法。我可以通过搜索地图找到相关行,但是如何很好地处理这个问题,这样我就不必开始迭代表列并将单元格的值与对象的变量进行比较以查看是否有任何差异??

基本上,我想将 Stock 对象发送到 TableModel 并在发生更改时更新单元格,如果没有更改则不执行任何操作。

关于如何实现可以做到这一点的 TableModel 有什么想法吗?任何指针都将不胜感激。

谢谢。

编辑:

'导入 javax.swing.table.AbstractTableModel; 导入 ppwebsitemonitor.views.OrderTableModel.*;

公共最终类 QuoteTableModel 扩展 AbstractTableModel {

// Attributes
String[] columnName = new String[]{"Stock", "Quantity", "Price", "Side", "Status"};
Class[] columnClass =
        new Class[]{String.class, Integer.class, Double.class, String.class, String.class};
Object[][] rows = null;

public QuoteTableModel() {
}

public QuoteTableModel(Object[][] orders) {
    this.rows = orders;
}

public int getColumnCount() {
    return columnName.length;
}

public boolean isNew(int row) {
    return rows[row][4].equals(OrderStatus.NEW);
}

public boolean isFilled(int row) {
    return rows[row][4].equals(OrderStatus.FULLY_FILLED);
}

public boolean isCancelled(int row) {
    return rows[row][4].equals(OrderStatus.CANCELLED);
}

public void updateOrderPrice(int row, Double newPrice) {

    Object[] order = rows[row];
    order[2] = newPrice;
    super.fireTableRowsUpdated(row, row);
}

public void updateOrderStatus(int row, int status) {

    Object[] order = rows[row];
    order[4] = OrderStatus.States[status];
    super.fireTableRowsUpdated(row, row);
}

public Object getValueAt(int row, int col) {
    return rows[row][col];
}

public int getRowCount() {
    return rows.length;
}

public String getColumnName(int col) {
    return columnName[col];
}

public Class getColumnClass(int col) {
    return columnClass[col];
}

}'

I've a collection of Stock objects that I'm updating about 10/15 variables for in real-time. I'm accessing each Stock by its ID in the collection. I'm also trying to display this in a JTable and have implemented an AbstractTablemodel. It's not working too well.

I've a RowMap that I add each ID to as Stocks are added to the TableModel. To update the prices and variables of all the stocks in the TableModel, I want to send a Stock object to an updateModel(Stock s) method. I can find the relevant row by searching the map, but how do I handle this nicely, so I don't have to start iterating through table columns and comparing the values of the cells to the variables of the object to see whether there are any differences??

Basically, i want to send a Stock object to the TableModel and update cells if there are changes and do nothing if there aren't.

Any ideas about how to implement a TableModel that might do this? Any pointeres at all would be appreciated.

Thanks.

Edit:

'import javax.swing.table.AbstractTableModel;
import ppwebsitemonitor.views.OrderTableModel.*;

public final class QuoteTableModel extends AbstractTableModel {

// Attributes
String[] columnName = new String[]{"Stock", "Quantity", "Price", "Side", "Status"};
Class[] columnClass =
        new Class[]{String.class, Integer.class, Double.class, String.class, String.class};
Object[][] rows = null;

public QuoteTableModel() {
}

public QuoteTableModel(Object[][] orders) {
    this.rows = orders;
}

public int getColumnCount() {
    return columnName.length;
}

public boolean isNew(int row) {
    return rows[row][4].equals(OrderStatus.NEW);
}

public boolean isFilled(int row) {
    return rows[row][4].equals(OrderStatus.FULLY_FILLED);
}

public boolean isCancelled(int row) {
    return rows[row][4].equals(OrderStatus.CANCELLED);
}

public void updateOrderPrice(int row, Double newPrice) {

    Object[] order = rows[row];
    order[2] = newPrice;
    super.fireTableRowsUpdated(row, row);
}

public void updateOrderStatus(int row, int status) {

    Object[] order = rows[row];
    order[4] = OrderStatus.States[status];
    super.fireTableRowsUpdated(row, row);
}

public Object getValueAt(int row, int col) {
    return rows[row][col];
}

public int getRowCount() {
    return rows.length;
}

public String getColumnName(int col) {
    return columnName[col];
}

public Class getColumnClass(int col) {
    return columnClass[col];
}

}'

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

明媚如初 2024-11-23 22:27:36

您可以存储 Stock 对象本身,而不是将股票 ID 存储在表模型中。与您在大师收藏中保留的相同。然后,每次更新股票值时,都会向表 UI 发送刷新(或将其置于定时刷新或程序所需的任何位置)。

编辑

我添加了一些代码来说明我的意思。它仅高于伪代码,您必须根据您的情况进行调整。

这是为了模拟您的股票订单对象:

import java.io.Serializable;

public class StockOrder implements Serializable{
    public final class OrderStatus {
        public static final String NEW = "NEW";
        public static final String FULLY_FILLED = "FULLY_FILLED";
        public static final String SHIPPED = "SHIPPED";
        public static final String CANCELLED = "CANCELLED";
    }

    private static final long serialVersionUID = -3627357348101499053L;

    private String ticker;
    private Integer quantity;
    private Double price;
    private String side;
    private String status;

    public StockOrder() {
        super();
    }

    public StockOrder(String ticker, Integer quantity, Double price, String side, String status) {
        this();
        setTicker(ticker);
        setQuantity(quantity);
        setPrice(price);
        setSide(side);
        setStatus(status);
    }

    public Double getPrice() {
        return price;
    }

    public Integer getQuantity() {
        return quantity;
    }

    public String getSide() {
        return side;
    }

    public String getStatus() {
        return status;
    }

    public String getTicker() {
        return ticker;
    }

    public void setPrice(Double price) {
        this.price = price;
    }

    public void setQuantity(Integer quantity) {
        this.quantity = quantity;
    }

    public void setSide(String side) {
        this.side = side;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public void setTicker(String ticker) {
        this.ticker = ticker;
    }
}

您的自定义模型看起来像这样:

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.swing.table.AbstractTableModel;

import misc.test.StockOrder.OrderStatus;

public class QuoteTableModel extends AbstractTableModel {

    private static final long serialVersionUID = -8683294701374710538L;

    // Attributes
    String[] columnName = new String[] { "Stock", "Quantity", "Price", "Side",
            "Status" };
    Class<?>[] columnClass = new Class[] { String.class, Integer.class,
            Double.class, String.class, String.class };
    private List<StockOrder> rows = null;
    private Map<String, Integer> orderMap = null;

    public QuoteTableModel() {
        super();
        setRows(new ArrayList<StockOrder>(8));
    }

    public QuoteTableModel(Collection<StockOrder> orders) {
        super();
        if(orders != null) {
            setRows(new ArrayList<StockOrder>(orders));
        } else {
            setRows(new ArrayList<StockOrder>(8));
        }
    }

    public int getColumnCount() {
        return columnName.length;
    }

    public boolean isNew(int row) {
        StockOrder order = getRows().get(row);
        return OrderStatus.NEW.equals(order.getStatus());
    }

    protected List<StockOrder> getRows() {
        return rows;
    }

    protected void setRows(List<StockOrder> rows) {
        this.rows = rows;
        this.orderMap = new HashMap<String, Integer>((rows != null) ? rows.size() : 8);

        if(rows != null) {
            int i = 0;
            for(StockOrder order: rows) {
                orderMap.put(order.getTicker(), new Integer(i++));
            }
        }
    }

    public boolean isFilled(int row) {
        StockOrder order = getRows().get(row);
        return OrderStatus.FULLY_FILLED.equals(order.getStatus());
    }

    public boolean isCancelled(int row) {
        StockOrder order = getRows().get(row);
        return OrderStatus.CANCELLED.equals(order.getStatus());
    }

    public void updateOrderPrice(int row, Double newPrice) {
        StockOrder order = getRows().get(row);
        if( order != null ) {
            order.setPrice(newPrice);
            super.fireTableRowsUpdated(row, row);
        }
    }

    public void updateOrderPrice(String ticker, Double newPrice) {
        Integer idx = getOrderMap().get(ticker);
        if(idx != null) {
            updateOrderPrice(idx, newPrice);
        }
    }

    public void updateOrderPrice(String ticker, String newStatus) {
        Integer idx = getOrderMap().get(ticker);
        if(idx != null) {
            updateOrderStatus(idx, newStatus);
        }
    }

    public void updateOrderStatus(int row, String newStatus) {
        StockOrder order = getRows().get(row);
        if( order != null ) {
            order.setStatus(newStatus);
            super.fireTableRowsUpdated(row, row);
        }

    }

    public Object getValueAt(int row, int col) {
        StockOrder order = getRows().get(row);
        if(order != null) {

            switch(col) {
                case 0: return order.getTicker() ;
                case 1: return order.getQuantity() ;
                case 2: return order.getPrice() ;
                case 3: return order.getSide() ;
                case 4: return order.getStatus() ;
                default: return "";
            }
        }

        return "";
    }

    public int getRowCount() {
        return getRows().size();
    }

    public String getColumnName(int col) {
        return columnName[col];
    }

    public Class<?> getColumnClass(int col) {
        return columnClass[col];
    }

    protected Map<String, Integer> getOrderMap() {
        return orderMap;
    }

    protected void setOrderMap(Map<String, Integer> orderMap) {
        this.orderMap = orderMap;
    }

}

您可以使用它来测试:

import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.table.TableModel;

import misc.test.StockOrder.OrderStatus;

public class QuoteTableApp {
    public static void main(String[] args) {
        QuoteTableApp app = new QuoteTableApp();
        System.out.println(app);
    }

    private JFrame frame = null;

    public QuoteTableApp() {
        super();
        setFrame(new JFrame("Quotes"));
        getFrame().setLocation(500, 300);
        getFrame().setSize(500, 400);

        List<StockOrder> orders = new ArrayList<StockOrder>(4);
        orders.add(new StockOrder("YHOO", 20, 73.50, "UP", OrderStatus.NEW));
        orders.add(new StockOrder("MSFT", 40, 42.00, "UP", OrderStatus.NEW));
        orders.add(new StockOrder("IBM", 100, 126.75, "UP", OrderStatus.NEW));
        orders.add(new StockOrder("CSCO", 5, 29.32, "UP", OrderStatus.NEW));

        TableModel model = new QuoteTableModel(orders);
        JTable table = new JTable(model);

        getFrame().getContentPane().add(table);
        getFrame().setVisible(Boolean.TRUE);

        ((QuoteTableModel) model).updateOrderPrice("CSCO", 31.20);
    }

    protected void setFrame(JFrame frame) {
        this.frame = frame;
    }

    protected JFrame getFrame() {
        return frame;
    }
}

此代码不考虑您的任何排序可能需要做。但基本概念已经有了。希望这有帮助。

Instead of storing the stock ID's in your table model you can store the Stock objects themselves. The same ones that you are holding onto in your master collection. Then send a refresh to the table UI every time you do an update to a stock value (or put it on a timed refresh or whatever your program requires).

Edit

I am including some code to illustrate what I meant. It's barely above pseudo-code, you will have to adapt it to your situation.

This is to emulate your stock order object:

import java.io.Serializable;

public class StockOrder implements Serializable{
    public final class OrderStatus {
        public static final String NEW = "NEW";
        public static final String FULLY_FILLED = "FULLY_FILLED";
        public static final String SHIPPED = "SHIPPED";
        public static final String CANCELLED = "CANCELLED";
    }

    private static final long serialVersionUID = -3627357348101499053L;

    private String ticker;
    private Integer quantity;
    private Double price;
    private String side;
    private String status;

    public StockOrder() {
        super();
    }

    public StockOrder(String ticker, Integer quantity, Double price, String side, String status) {
        this();
        setTicker(ticker);
        setQuantity(quantity);
        setPrice(price);
        setSide(side);
        setStatus(status);
    }

    public Double getPrice() {
        return price;
    }

    public Integer getQuantity() {
        return quantity;
    }

    public String getSide() {
        return side;
    }

    public String getStatus() {
        return status;
    }

    public String getTicker() {
        return ticker;
    }

    public void setPrice(Double price) {
        this.price = price;
    }

    public void setQuantity(Integer quantity) {
        this.quantity = quantity;
    }

    public void setSide(String side) {
        this.side = side;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public void setTicker(String ticker) {
        this.ticker = ticker;
    }
}

Your custom model would look something like this:

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.swing.table.AbstractTableModel;

import misc.test.StockOrder.OrderStatus;

public class QuoteTableModel extends AbstractTableModel {

    private static final long serialVersionUID = -8683294701374710538L;

    // Attributes
    String[] columnName = new String[] { "Stock", "Quantity", "Price", "Side",
            "Status" };
    Class<?>[] columnClass = new Class[] { String.class, Integer.class,
            Double.class, String.class, String.class };
    private List<StockOrder> rows = null;
    private Map<String, Integer> orderMap = null;

    public QuoteTableModel() {
        super();
        setRows(new ArrayList<StockOrder>(8));
    }

    public QuoteTableModel(Collection<StockOrder> orders) {
        super();
        if(orders != null) {
            setRows(new ArrayList<StockOrder>(orders));
        } else {
            setRows(new ArrayList<StockOrder>(8));
        }
    }

    public int getColumnCount() {
        return columnName.length;
    }

    public boolean isNew(int row) {
        StockOrder order = getRows().get(row);
        return OrderStatus.NEW.equals(order.getStatus());
    }

    protected List<StockOrder> getRows() {
        return rows;
    }

    protected void setRows(List<StockOrder> rows) {
        this.rows = rows;
        this.orderMap = new HashMap<String, Integer>((rows != null) ? rows.size() : 8);

        if(rows != null) {
            int i = 0;
            for(StockOrder order: rows) {
                orderMap.put(order.getTicker(), new Integer(i++));
            }
        }
    }

    public boolean isFilled(int row) {
        StockOrder order = getRows().get(row);
        return OrderStatus.FULLY_FILLED.equals(order.getStatus());
    }

    public boolean isCancelled(int row) {
        StockOrder order = getRows().get(row);
        return OrderStatus.CANCELLED.equals(order.getStatus());
    }

    public void updateOrderPrice(int row, Double newPrice) {
        StockOrder order = getRows().get(row);
        if( order != null ) {
            order.setPrice(newPrice);
            super.fireTableRowsUpdated(row, row);
        }
    }

    public void updateOrderPrice(String ticker, Double newPrice) {
        Integer idx = getOrderMap().get(ticker);
        if(idx != null) {
            updateOrderPrice(idx, newPrice);
        }
    }

    public void updateOrderPrice(String ticker, String newStatus) {
        Integer idx = getOrderMap().get(ticker);
        if(idx != null) {
            updateOrderStatus(idx, newStatus);
        }
    }

    public void updateOrderStatus(int row, String newStatus) {
        StockOrder order = getRows().get(row);
        if( order != null ) {
            order.setStatus(newStatus);
            super.fireTableRowsUpdated(row, row);
        }

    }

    public Object getValueAt(int row, int col) {
        StockOrder order = getRows().get(row);
        if(order != null) {

            switch(col) {
                case 0: return order.getTicker() ;
                case 1: return order.getQuantity() ;
                case 2: return order.getPrice() ;
                case 3: return order.getSide() ;
                case 4: return order.getStatus() ;
                default: return "";
            }
        }

        return "";
    }

    public int getRowCount() {
        return getRows().size();
    }

    public String getColumnName(int col) {
        return columnName[col];
    }

    public Class<?> getColumnClass(int col) {
        return columnClass[col];
    }

    protected Map<String, Integer> getOrderMap() {
        return orderMap;
    }

    protected void setOrderMap(Map<String, Integer> orderMap) {
        this.orderMap = orderMap;
    }

}

You can use this to test:

import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.table.TableModel;

import misc.test.StockOrder.OrderStatus;

public class QuoteTableApp {
    public static void main(String[] args) {
        QuoteTableApp app = new QuoteTableApp();
        System.out.println(app);
    }

    private JFrame frame = null;

    public QuoteTableApp() {
        super();
        setFrame(new JFrame("Quotes"));
        getFrame().setLocation(500, 300);
        getFrame().setSize(500, 400);

        List<StockOrder> orders = new ArrayList<StockOrder>(4);
        orders.add(new StockOrder("YHOO", 20, 73.50, "UP", OrderStatus.NEW));
        orders.add(new StockOrder("MSFT", 40, 42.00, "UP", OrderStatus.NEW));
        orders.add(new StockOrder("IBM", 100, 126.75, "UP", OrderStatus.NEW));
        orders.add(new StockOrder("CSCO", 5, 29.32, "UP", OrderStatus.NEW));

        TableModel model = new QuoteTableModel(orders);
        JTable table = new JTable(model);

        getFrame().getContentPane().add(table);
        getFrame().setVisible(Boolean.TRUE);

        ((QuoteTableModel) model).updateOrderPrice("CSCO", 31.20);
    }

    protected void setFrame(JFrame frame) {
        this.frame = frame;
    }

    protected JFrame getFrame() {
        return frame;
    }
}

This code doesn't take into account any sorting you might need to do. But the basic concepts are there. Hopefully this helps.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文