1

JTableフレームを最初に作成するときに を作成しますが、AbstractTableModel拡張した空の を作成します。次に、ユーザーはから何かを選択する必要がJComboBoxあり、ユーザーはその指定された選択を処理するメッセージをプレビューできます。

プレビュー ボタンをクリックするAbstractTableModelと、新しいデータで新しいモデルを作成し、そのモデルを新しく作成した JTable オブジェクトに設定します。それが完了したら、AbstractTableModel.fireTableDataChangedJTable.repaint()JTable.validate() JFrame.repaint()を呼び出しますJFrame.validate()

JTableこれらすべての呼び出しで、新しいデータで更新することはまだできません。

JFrameJTable:

public class StudentMessageViewer extends JFrame implements ActionListener {
    final String CMD_DELETE = "CMD_DELETE";
    final String CMD_DUMP = "CMD_DUMP";
    final String CMD_MOVE = "CMD_MOVE";
    final String CMD_PREVIEW = "CMD_PREVIEW";
    private Students students;
    private JComboBox<String> Names;
    private TableModel Model;

    public Selector(Students students) {
        super("Main");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(new Dimension(700, 800));
        setContentPane(getMainPanel());
        setLocationRelativeTo(null);
        setVisible(true);
    }

    private JPanel getMainPanel() {
        JPanel main = new JPanel();
        main.add(getSelectorPanel());
        main.add(getTablePanel());
        main.add(getButtonPanel());

        return main;
    }

    private JPanel getSelectorPanel() {
        JPanel main = new JPanel();
        main.setLayout(new BoxLayout(main, BoxLayout.PAGE_AXIS));

        FlowLayout flowLayout = new FlowLayout(FlowLayout.RIGHT);
        main.setMaximumSize(new Dimension(450, 180));
        Names = new JComboBox<String>(students.getNames());

        JPanel NamesPanel = new JPanel();
        NamesPanel.add(new JLabel("Name: "));
        NamesPanel.add(Names);

        main.add(NamesPanel);

        return main;
    }

    private JPanel getTablePanel() {
        JPanel main = new JPanel();    

        this.Model = new Model(new Object[0][4]);
        this.MessagesTable = new JTable(this.Model);

        TableColumn column = this.MessagesTable.getColumnModel().getColumn(0);
        column.setPreferredWidth(20);
        this.MessagesTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        this.MessagesTable.setSelectionBackground(getBackground());
        this.MessagesTable.setSelectionForeground(getForeground());

        main.add(new JScrollPane(this.MessagesTable));

        return main;
    }

    private JPanel getButtonPanel() {
        JPanel main = new JPanel(new FlowLayout(FlowLayout.RIGHT));

        JButton btnDelete = new JButton("Delete");
        JButton btnDump = new JButton("Dump");
        JButton btnMove = new JButton("Move");
        JButton btnPreview = new JButton("Preview");

        btnDelete.setActionCommand(CMD_DELETE);
        btnDump.setActionCommand(CMD_DUMP);
        btnMove.setActionCommand(CMD_MOVE);
        btnPreview.setActionCommand(CMD_PREVIEW);

        btnDelete.addActionListener(this);
        btnDump.addActionListener(this);
        btnMove.addActionListener(this);
        btnPreview.addActionListener(this);

        main.add(btnDelete);
        main.add(btnDump);
        main.add(btnMove);
        main.add(btnPreview);

        this.getRootPane().setDefaultButton(btnPreview);

        return main;
    }

    private void setTableData() {        
        Object data[][] = students.Select(Names.getSelectedItem().toString());

        this.Model = new Model(data);
        this.MessagesTable = new JTable(this.Model);

        TableColumn column = this.MessagesTable.getColumnModel().getColumn(0);
        column.setPreferredWidth(20);
        this.MessagesTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        this.MessagesTable.setSelectionBackground(getBackground());
        this.MessagesTable.setSelectionForeground(getForeground());

        ((AbstractTableModel) this.MessagesTable.getModel()).fireTableDataChanged();
        this.MessagesTable.repaint();
        this.repaint();
        this.validate();
    }

    @Override
    public void actionPerformed(ActionEvent event) {
        String actionCmd = event.getActionCommand();

        if(actionCmd.equals(CMD_DELETE))
            System.out.println("DELETE");
        else if(actionCmd.equals(CMD_DUMP))
            System.out.println("DUMP");
        else if(actionCmd.equals(CMD_MOVE))
            System.out.println("MOVE");
        else if(actionCmd.equals(CMD_PREVIEW))
            setTableData();
    }
}

TableModelが拡張した私のクラスAbstractTableModel

public class Model extends AbstractTableModel {
    Object data[][];
    String columnNames[] = { "", "Message ID", "Group ID", "DateSent", "Message"};

    public Model(Object[][] data) {
        this.data = new Object[data.length][columnNames.length];
        for (int i = 0; i < data.length; i++) {
            this.data[i][0] = Boolean.TRUE;
            for (int j = 0; j < columnNames.length - 1; j++)
                this.data[i][j + 1] = data[i][j];
        }
    }

    public int getColumnCount() {
        return (columnNames == null ? 0 : columnNames.length);
    }

    public String getColumnName(int column) {
        return (columnNames == null ? "" : columnNames[column]);
    }

    public int getRowCount() {
        return (data == null ? 0 : data.length);
    }

    public Object getValueAt(int row, int column) {
        return (columnNames == null ? new Object() : data[row][column]);
    }

    @SuppressWarnings({ "unchecked", "rawtypes" })
    public Class getColumnClass(int column) {
        return (getValueAt(0, column).getClass());
    }

    public void setValueAt(Object value, int row, int column) {
        data[row][column] = value;
    }

    public boolean isCellEditable(int row, int column) {
        return (column == 0);
    }
}
4

2 に答える 2

0

AbstractTableModelは、コンテンツの変更に対応するためにテーブル自体を登録するリスナーをサポートしています。ただしAbstractTableModel、基になるデータが実際にいつ変更されるかは認識されません。これは、既に完全にコードに組み込まれています。

データが現在異なることがわかっている場合、または制限されたスコープの既知の変更のfireTableDataChangedように、より消極的なものであることがわかっている場合は、モデルから、またはモデルで (より悪いスタイルで)呼び出すようにしてください。fireTableRowsUpdated

于 2013-06-13T19:26:13.707 に答える
0

だから私はそれを理解しました。クラスのsetTableData()メソッドでは、真新しいオブジェクトと真新しいオブジェクトを作成していましたが、これら 2 つの新しいオブジェクトを元の変数に割り当てます。だから私は何かをしなければならなかったかもしれませんが、私はそれを理解できませんでした。StudentMessageViewerTableModelJTablerepaint()validate()

しかし、それを修正するために、私がしたことは、新しいTableModelオブジェクトを作成し、 を使用しJTable.setModel()て古い を置き換えることTableModelでした。

変更された方法は次のとおりです。

private void setTableData() {        
    Object data[][] = students.Select(Names.getSelectedItem().toString());

    this.Model = new Model(data);

    TableColumn column = this.MessagesTable.getColumnModel().getColumn(0);
    column.setPreferredWidth(20);
    this.MessagesTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    this.MessagesTable.setSelectionBackground(getBackground());
    this.MessagesTable.setSelectionForeground(getForeground());

    this.MessagesTable.setModel(this.MyModel);
}

これで、何度でもテーブルを更新できるようになりました。

于 2013-06-13T19:17:21.643 に答える