0

ベクターを使用して JList に表示される情報を格納しています。選択したインデックスのインデックスを使用して、その行のデータを JTextField と JTextArea にコピーしたいと考えています。選択した項目が JTextField/Area に表示されず、以前に選択したインデックスのデータが表示されるという問題が発生しています。2 つおきのインデックスには、2、4、6、8、10、11 という間違ったデータが表示されるという問題があります。プログラムが実行された直後に最初に選択した場合、それぞれのインデックスは正しいデータのみを表示します。ListSelectionEvent リスナーに追加した印刷行は、選択したインデックスの正しいデータを表示しますが、それを JTextArea/JTextField に正しくコピーしません。

プログラム実行直後に選択。 プログラム実行直後に選択。

他のいくつかのインデックスを選択してから、もう一度選択しようとしました 他のいくつかのインデックスを選択してから、もう一度選択しようとしました

コード:

public class EditFlashcardGui implements ListSelectionListener {

private JFrame frame;
private JPanel listPanel;
private Vector<Vector> flashcardMasterVector = new Vector<Vector>();
private JList list;
private JPanel tablePanel, dataPanel, textFieldPanel;
private JButton submitButton, cancelButton;
private JTextField frontTextField;
private JTextArea reverseTextArea;
private GridBagLayout gridBagLayout;
private GridBagConstraints constraints;
private JLabel frontTextLabel, reverseTextLabel;
Vector<Vector> masterVector = new Vector<Vector>();

public EditFlashcardGui() {

    frame = new JFrame("Edit / Delete Flashcards");
    frame.setSize(500, 200);

    Container con = frame.getContentPane();
    con.setLayout(new BorderLayout());

    listPanel = new JPanel(new BorderLayout());

    Vector<String> columnNames = new Vector<String>();

    columnNames.add("id");
    columnNames.add("front text");
    columnNames.add("reverse text");

    list = new JList(populateList());
    list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    list.addListSelectionListener(this);

    Font font1 = new Font("SansSerif", Font.BOLD, 20);
    list.setFont(font1);

    tablePanel = new JPanel();
    tablePanel.add(list);

    JScrollPane scrollPane = new JScrollPane(list);

    con.add(scrollPane, BorderLayout.NORTH);

    // south panel

    gridBagLayout = new GridBagLayout();
    constraints = new GridBagConstraints();
    textFieldPanel = new JPanel(gridBagLayout);

    // cancelButton = new JButton("Cancel");
    // dataPanel.add(cancelButton, BorderLayout.SOUTH);

    frontTextLabel = new JLabel("Front Text");
    constraints.ipadx = 1;
    constraints.ipady = 1;
    constraints.gridx = 0;
    constraints.gridy = 0;
    gridBagLayout.setConstraints(frontTextLabel, constraints);
    textFieldPanel.add(frontTextLabel);

    frontTextField = new JTextField();
    frontTextField.setColumns(30);
    constraints.ipadx = 1;
    constraints.ipady = 1;
    constraints.gridx = 0;
    constraints.gridy = 1;
    gridBagLayout.setConstraints(frontTextField, constraints);
    textFieldPanel.add(frontTextField);

    reverseTextLabel = new JLabel("Reverse Text");
    constraints.ipadx = 1;
    constraints.ipady = 1;
    constraints.gridx = 0;
    constraints.gridy = 2;
    gridBagLayout.setConstraints(reverseTextLabel, constraints);
    textFieldPanel.add(reverseTextLabel);

    reverseTextArea = new JTextArea(3, 30);
    constraints.ipadx = 1;
    constraints.ipady = 1;
    constraints.gridx = 0;
    constraints.gridy = 3;
    gridBagLayout.setConstraints(reverseTextArea, constraints);
    textFieldPanel.add(reverseTextArea);

    submitButton = new JButton("Submit");
    constraints.ipadx = 1;
    constraints.ipady = 1;
    constraints.gridx = 0;
    constraints.gridy = 4;
    gridBagLayout.setConstraints(submitButton, constraints);
    textFieldPanel.add(submitButton);

    con.add(textFieldPanel, BorderLayout.CENTER);

    frame.setResizable(false);
    frame.pack();
    frame.setVisible(true);

}

public Vector<Vector> populateList() {
    //flashcardMasterVector = flashcardDB.getList();
    //Vector<String> flashcardVector = new Vector<String>();

    Integer temp = 0;

    for(int i = 0; i <= 20; i++) {
        Vector<String> flashcardVector = new Vector<String>();
        flashcardVector.add(temp.toString());
        flashcardVector.add(temp.toString());
        flashcardVector.add(temp.toString());
        masterVector.add(i, flashcardVector);
        temp++;
    }



    return masterVector;
}

public static void main(String[] args) {
    EditFlashcardGui gui = new EditFlashcardGui();
}

@Override
public void valueChanged(ListSelectionEvent e) {
    if (! e.getValueIsAdjusting())
    {
        System.out.print("id : " );
        System.out.println(masterVector.get(list.getSelectedIndex()).get(0));
        System.out.print("front text : ");
        System.out.println(masterVector.get(list.getSelectedIndex()).get(1));
        frontTextField.setText(masterVector.get(e.getFirstIndex())
                .get(1).toString());
        System.out.print("reverse text : ");
        System.out.println(masterVector.get(list.getSelectedIndex()).get(2));
        reverseTextArea.setText(masterVector.get(e.getFirstIndex())
                .get(2).toString());
    }
}
}
4

2 に答える 2

2
  • JListの使用方法に関するオラクルのチュートリアルを読む必要があります

  • Vector<Vector>JList直接置くことはできません。

  • 値を入れてXxxListModelのみ使用しますが、この場合、 のクレイジーな回避策を作成する必要がありAbstractListModel、代わりに単純な配列を使用します

  • JList使用する必要がある1次元配列に基づいていますVector<Object (or String or Double...)>


  • この配列をJTable( XxxTableModel に) 配置し、すべての同期列を削除しJTableHeader、必要に応じて削除すると、GUI への出力は次のようになります。JList

  • JTable.removeColumnビューから列のみを削除すると、すべてのデータは表示されXxxTableModel、変更なしで保存されます

  • 次に、選択された (テストする必要がある-1 == none of row is selected) 行 (並べ替えまたはフィルター処理さconvertViewToModelれている場合はテストする必要があります) から必要なすべてのデータを返しますJTableXxxTableModel

于 2013-02-20T13:34:48.163 に答える
1

e.getFirstIndex()メソッドの代わりにlist.getSelectedIndex()を使用します。

コード:

        frontTextField.setText( masterVector.get(list.getSelectedIndex() ).get(1).toString() );
        reverseTextArea.setText(masterVector.get( list.getSelectedIndex()).get(2).toString() );

クリーンコード:

public void valueChanged(ListSelectionEvent e) {

    if (!e.getValueIsAdjusting()) {
        Vector masterVec = masterVector.get( list.getSelectedIndex() );

        System.out.print("id : ");
        System.out.println(masterVec.get(0));

        System.out.print("front text : ");
        System.out.println(masterVec.get(1));

        System.out.print("reverse text : ");
        System.out.println(masterVec.get(2));

        frontTextField.setText(masterVec.get(1).toString());
        reverseTextArea.setText(masterVec.get(2).toString());;
    }
}
于 2013-02-20T14:24:07.727 に答える