0

質問をする前に、私が何を必要とし、何をしようとしているのかを説明しようと思います。図に示すように、コンボボックスを表示する列がいくつかあるテーブルを設定しました。

写真 http://www.freeimagehosting.net/newuploads/4ks9s.png

これは、ジョブの「順序」を作成することになっています。つまり、ジョブ 1 は最初にステーション 1 に移動します。ステーション 2 の列にステーション 4 を追加すると、ステーション 4 に移動します。以下同様です。さらに処理するための注文を作成することを目的としています。だから、私はしたい:

  • テーブルを作成し、レンダリングされたコンボボックスを表示します。
  • 前の列の値が「なし」の場合、列 (3 ~ 6) のセルを編集不可にします (したがって、正しい順序が維持されるようにします)。
  • その行ですでに選択されているステーションを表示しないでください。

しかし、まず、コンボボックスから選択するときに設定されている値を取得することも、それらの値を取得することもできません!

これまでのところ、私のコードは次のとおりです。

コンボボックスの作成:

public class SimGui extends JFrame {
                          //implements ActionListener {
    String Stations[] = new String[] {"Station 1","Station 2","Station 3","Station 4","Station 5","None"};
    JComboBox stationscombo = new JComboBox(Stations);
    Object obj = stationscombo.getSelectedItem();

テーブルのマウス クリック イベント:

private void jTable2MouseClicked(java.awt.event.MouseEvent evt) {                                     
    //Object event = evt.getSource();
    obj = stationscombo.getSelectedItem();
    System.out.println("Item: " + obj);
    //ListSelectionModel selectionModel = jTable2.getSelectionModel();
    int tb1columns = jTable2.getColumnCount();
    int selectionrow= jTable2.getSelectedRow();
    int selectioncolumn = jTable2.getSelectedColumn();
    if (selectioncolumn > 1) {
        for (int i=2;i<tb1columns;i++) {
            System.out.println(jTable2.getValueAt(selectionrow,selectioncolumn));
            /*if (jTable2.getValueAt(selectionrow, i) != "None") {
                stationscombo.removeItem(jTable2.getValueAt(selectionrow, i));
            }*/
        }
    }
    else { System.out.println(jTable2.getValueAt(selectionrow,selectioncolumn)); }
}

テーブルの構造:

jTable2.setModel(new javax.swing.table.DefaultTableModel(
    new Object [][] {
        {null, null, null, null, null, null, null},
        {null, null, null, null, null, null, null},
        {null, null, null, null, null, null, null}
    },
    new String [] {
        "Job Type", "Parts", "Station 1", "Station 2", "Station 3", "Station 4", "Station 5"
    }
) {
    Class[] types = new Class [] {
        java.lang.Integer.class, java.lang.Integer.class, java.lang.Object.class, java.lang.Object.class, java.lang.Object.class, java.lang.Object.class, java.lang.Object.class
    };
    boolean[] canEdit = new boolean [] {
        false, true, true, true, true, true, true
    };

    public Class getColumnClass(int columnIndex) {
        return types [columnIndex];
    }

    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return canEdit [columnIndex];
    }
});
jTable2.getTableHeader().setReorderingAllowed(false);
for (int x = 2;x<7;x++) {
    jTable2.getColumnModel().getColumn(x).setCellEditor(new DefaultCellEditor(stationscombo));
}
jTable2.addMouseListener(new java.awt.event.MouseAdapter() {
    public void mouseClicked(java.awt.event.MouseEvent evt) {
        jTable2MouseClicked(evt);
    }
});

私は周りを見回してコンボボックスのリスナーを実装しようとしましたが失敗しました。クラスに ActionListener を実装すると、次のような警告が表示されます。

SimGui is not abstract and does not override abstract method actionPerformed(java.awt.event.ActionEvent) in java.awt.event.ActionListener

動作しているテーブルに既に ActionListener を実装していますが、それが干渉しているかどうかはわかりません。

Action action = new AbstractAction() {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println(e.getSource());
        //TableCellListener tcl = (TableCellListener)e.getSource();
        //JComboBox cb = (JComboBox)e.getSource();
        //String newSelection = (String)cb.getSelectedItem();
        /*JComboBox cb = (JComboBox)e.getSource();
        String teste = (String)cb.getSelectedItem();
        System.out.println("Item: " + teste);*/
        //TableCellListener tcl1 = new TableCellListener(jTable1, action);
        /*if (tcl.getColumn() == 3) {
            if (tcl.getNewValue() == true) {
                int x = tcl.getColumn();
                table1model.setColumnEditable(x, true);
            }
            else { 
                table1model.setColumnEditable(tcl.getColumn(), false);
            }
            /*boolean canEdit[] = {
            false, true, true, true, true, true
            };
            //System.out.println(isCellEditable(tcl1.getRow(),tcl1.getColumn()));
        }*/
        /*System.out.println(newSelection);
        System.out.println("Row   : " + tcl.getRow());
        System.out.println("Column: " + tcl.getColumn());
        System.out.println("Old   : " + tcl.getOldValue());
        System.out.println("New   : " + tcl.getNewValue());*/
    }
};

しかし、結論として、私の質問は、テーブル内のコンボボックスを正しく操作して、値を設定し、選択したときにアイテムの値を取得できるようにするにはどうすればよいですか?

4

1 に答える 1

3

TableModel.setColumnValue(row, col)を見てください。

また、テーブル セル エディターについても調べてみると、何が起こっているのかを正確に理解するのに役立ちます。

于 2012-07-24T03:25:56.430 に答える