1

別のクラスにあるテーブルに行を追加するのが難しいです。

クラス構造は次のとおりです。

ここに画像の説明を入力 破線の矢印は、私がなんとか持っていない望ましい関係です

クラスにAddPanelは、フィールドと追加ボタンがあります。

addButton をクリックすると、最初に Product のインスタンス (Logic Package にあるクラス) を作成します。次に、テーブルに行を追加する必要があります (TableModel.AddRowメソッドを使用)。

以下は GUI の外観です (フォーカスされたタブは ですAddPannel)。

ここに画像の説明を入力

さまざまなアプローチを試みましたが、どれも成功しませんでした。

私の最後の試みは、Tableクラスで次のメソッドを作成することでした:

public void AddRow(Product p) {
    tbmStock.addRow(new Object[] { p.getExternalId(), p.getName(),
            p.getAmount(), p.getPriceForMe(), p.getPriceForCustomer() });
}

さらに、AddPanelクラスでは、次のメソッドを追加しようとしました。

private void AddButtonAction() {
    btnAddProduct.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
                try {
                Product p = new Product(txtName.getText(), txtExternalID
                        .getText(), Integer.parseInt(txtAmount.getText()),
                        Double.parseDouble(txtPriceForMe.getText()),
                        Double.parseDouble(txtPriceForCustomer.getText()),
                        Integer.parseInt(txtFromYear.getText()), Integer
                                .parseInt(txtToYear.getText()), Integer
                                .parseInt(txtSupplier.getText()), Integer
                                .parseInt(txtCarType.getText()));
                AddRow(p); //This call doesn't compiles 
            }
            catch (Exception e1){
                JOptionPane.showMessageDialog(null,"Error");
            }       
        }
    });

}

助言がありますか ?(実際、私の構造が良いかどうかさえわかりません:S)

4

1 に答える 1

3

カスタム イベントとイベント リスナーを提供します。新しい製品を作成すると、イベントが発生し、すべてのリスナーに通知されます。MainPanel (ここで AddPanel のインスタンスを作成すると仮定) は、リスナーを登録する必要があります。このリスナーでは、MainPanel がテーブルにアクセスできるため、テーブルを更新できます。

これは、メディエーター パターンとも呼ばれます。

いくつかのポインタ:

などのイベント クラスを作成しますProductCreatedEvent extends EventObject。Product を引数としてコンストラクターに渡し、getter でアクセスできるようにします。

イベント リスナー クラスを作成しますinterface ProductCreatedEventListener extends EventListener。などのメソッドを提供しproductCreated(ProductCreatedEvent productCreatedEvent)ます。

AddPanel に次のようなものを追加します。

private final List<ProductCreatedEventListener> productCreatedEventListeners = new ArrayList<>();
...

public void addProductCreatedEventListener(ProductCreatedEventListener productCreatedEventListener){
    productCreatedEventListeners.add(productCreatedEventListener);
}

public void removeProductCreatedEventListener(ProductCreatedEventListener productCreatedEventListener){
    productCreatedEventListeners.remove(productCreatedEventListener);
}

private void fireProductCreatedEvent(ProductCreatedEvent event){
    for (ProductCreatedEventListener productCreatedEventListener : productCreatedEventListeners){
        productCreatedEventListener.productCreated(event);
    }
}

交換:

AddRow(p); //This isn't working

   fireProductCreatedEvent(new ProductCreatedEvent(AddPanel.this, p));
于 2013-02-16T10:28:15.557 に答える