1

私は次のコードを持っています:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.plaf.nimbus.NimbusLookAndFeel;
import javax.swing.table.DefaultTableModel;

public class NewClass1 extends JFrame {
    private JTable table;
    private JScrollPane scrollPane;
    private DefaultTableModel defaultTableModel;

    public NewClass1() {
        setLocationByPlatform(true);
        setLayout(new BorderLayout());
        setPreferredSize(new Dimension(600, 400));
        setTitle("Table Issues");
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        createTableModel();
        table = new JTable(defaultTableModel);

        scrollPane = new JScrollPane(table);

        getContentPane().add(scrollPane, BorderLayout.CENTER);

        pack();
    }

    private void createTableModel() {
        Vector cols = new Vector();
        cols.add("A");

        Vector rows = new Vector();
        for (int i = 0; i < 50; i++) {
            Vector row = new Vector();
            row.add((i + 1) + "");
            rows.add(row);
        }

        defaultTableModel = new DefaultTableModel(rows, cols) {
            Class[] types = new Class[]{
                String.class
            };

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

            @Override
            public boolean isCellEditable(int row, int column) {
                return false;
            }
        };
    }

    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(new NimbusLookAndFeel());
        } catch (Exception e) {
        }

        final NewClass1 nc = new NewClass1();
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                nc.setVisible(true);
            }
        });

        while (true) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    int row = (int) (Math.random() * 50);
                    int move = (int) (Math.random() * 50);

                    nc.defaultTableModel.moveRow(row, row, move);
                }
            });
            try{
                Thread.sleep(1000);
            }catch(Exception e){
            }
        }
    }
}

上記のコードを実行して行を選択してください。

私の問題は行の移動にあり、行の選択は移動していません。定位置に留まっています。列の値が 25 の行を選択したとします。選択した行は、行の移動後に列の値が 25 である必要があります。

これについて私を助けてください。

私の本当の問題は、ユーザーが行を選択してメニューをクリックしてアクションを実行する一方で、他のスレッドが行を移動し、実行されたアクションが実際の行とは別の行になることです。

4

1 に答える 1