DefaultTableModel中的data数组值变化了,怎么更新JTable这个视图。
JTable使用了DefaultTableModel,DefaultTableModel,又使用了一个Sting[][]做data,现在Sting[][]的值变化了,JTable的显示似乎没有变化,该怎么办?

解决方案 »

  1.   

    值变化后,加一句JTable.updateUI();
      

  2.   

    不然这样值变化后:
    JTable.getModel().fireTableDataChanged();
    JTable.getModel().fireTableStructureChanged();
      

  3.   

    我是这样试的String[][] rows = {{ "test1", "test2"}, {"test3", "test4"}};
    String[] cols = { "Col1", "Col2" };
    JTable table = new JTable(rows, cols);......
    然后加了个按钮触发事件:public void actionPerformed(ActionEvent ae) {
        if (e.getSource().equals(button)) {
            rows[0][0] = "row1 changed";
            cols[1] = "col1 changed";
            ((AbstractTableModel)table.getModel()).fireTableDataChanged();
            ((AbstractTableModel)table.getModel()).fireTableStructureChanged();
        }
    }点按钮后,表头和内容都变了
      

  4.   

    validate(), 调用这个函数
      

  5.   

    用eclipse的VE自动生成的些代码,
    package com.pass86.mypackage;import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.ItemEvent;
    import java.awt.event.ItemListener;import javax.swing.JFrame;
    import java.awt.Dimension;
    import java.awt.Point;
    import javax.swing.JButton;
    import javax.swing.JPanel;
    import javax.swing.JLabel;
    import java.awt.ComponentOrientation;
    import javax.swing.JTextField;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.table.AbstractTableModel;
    import javax.swing.table.DefaultTableModel;
    import javax.swing.JSpinner;
    import javax.swing.SpinnerNumberModel;
    import java.lang.Integer;
    import java.util.Calendar;
    import java.awt.event.KeyEvent;
    import java.awt.Rectangle;@SuppressWarnings("serial")
    public class LoanFrame extends JFrame implements ActionListener, ItemListener { private String[] Headers = { "期次", "本金金额", "月还金额", "月还利息", "月还本息" }; private String[][] CellData = {{"", "", "", "", ""}}; private DefaultTableModel DataModel; private int Months; private JPanel MainPanel = null; private JButton CalButton = null; private JLabel jLabel = null; private JLabel jLabel1 = null; private JTextField AmountTextField = null; private JLabel jLabel2 = null; /**
     * This method initializes
     * 
     */
    public LoanFrame() {
    super();
    initialize();
    } private JTextField RateTextField = null; private JLabel jLabel3 = null; private JLabel jLabel4 = null; private JLabel jLabel5 = null; private JLabel jLabel6 = null; private JScrollPane jScrollPane = null; private JTable ResultTable = null; private JSpinner YearsSpinner = null; private JSpinner MonthsSpinner = null; private JLabel jLabel51 = null; private JSpinner StartYearSpinner = null; private JSpinner StartMonthSpinner = null; private JLabel jLabel52 = null; private JLabel jLabel53 = null; /**
     * This method initializes this
     * 
     */
    private void initialize() {
    this.setSize(new Dimension(469, 417));
    this.setContentPane(getMainPanel());
    this.setLocation(new Point(300, 110));
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setResizable(false);
    this.setTitle("银行贷款还本付息的计算");
    this.setVisible(true); } /**
     * This method initializes MainPanel
     * 
     * @return javax.swing.JPanel
     */
    private JPanel getMainPanel() {
    if (MainPanel == null) {
    jLabel53 = new JLabel();
    jLabel53.setText("月");
    jLabel53.setBounds(new Rectangle(345, 40, 13, 18));
    jLabel52 = new JLabel();
    jLabel52.setText("\u5e74");
    jLabel52.setBounds(new Rectangle(289, 40, 13, 18));
    jLabel51 = new JLabel();
    jLabel51.setText("月");
    jLabel51.setBounds(new Rectangle(159, 40, 13, 18));
    jLabel6 = new JLabel();
    jLabel6.setText("起始时间");
    jLabel6.setBounds(new Rectangle(177, 40, 52, 18));
    jLabel6.setDisplayedMnemonic(KeyEvent.VK_UNDEFINED);
    jLabel5 = new JLabel();
    jLabel5.setText("年");
    jLabel5.setBounds(new Rectangle(103, 40, 13, 18));
    jLabel4 = new JLabel();
    jLabel4.setText("贷款期限");
    jLabel4.setBounds(new Rectangle(5, 40, 52, 18));
    jLabel3 = new JLabel();
    jLabel3.setText("%/月");
    jLabel3.setBounds(new Rectangle(331, 10, 25, 18));
    jLabel2 = new JLabel();
    jLabel2.setText("贷款利率");
    jLabel2.setBounds(new Rectangle(177, 10, 52, 18));
    jLabel1 = new JLabel();
    jLabel1.setText("元");
    jLabel1.setBounds(new Rectangle(159, 10, 13, 18));
    jLabel = new JLabel();
    jLabel.setText("贷款金额");
    jLabel.setBounds(new Rectangle(5, 10, 52, 18));
    MainPanel = new JPanel();
    MainPanel.setLayout(null);
    MainPanel.setComponentOrientation(ComponentOrientation.UNKNOWN);
    MainPanel.add(jLabel, null);
    MainPanel.add(getAmountTextField(), null);
    MainPanel.add(jLabel1, null);
    MainPanel.add(jLabel2, null);
    MainPanel.add(getRateTextField(), null);
    MainPanel.add(jLabel3, null);
    MainPanel.add(getCalButton(), null);
    MainPanel.add(jLabel4, null);
    MainPanel.add(getYearsSpinner(), null);
    MainPanel.add(jLabel5, null);
    MainPanel.add(getMonthsSpinner(), null);
    MainPanel.add(jLabel51, null);
    MainPanel.add(jLabel6, null);
    MainPanel.add(getStartYearSpinner(), null);
    MainPanel.add(jLabel52, null);
    MainPanel.add(getStartMonthSpinner(), null);
    MainPanel.add(jLabel53, null);
    MainPanel.add(getJScrollPane(), null);
    }
    return MainPanel;
    }
      

  6.   

    //接上 /**
     * This method initializes CalButton
     * 
     * @return javax.swing.JButton
     */
    private JButton getCalButton() {
    if (CalButton == null) {
    CalButton = new JButton();
    CalButton.setText("计算");
    CalButton.setBounds(new Rectangle(373, 7, 78, 28));
    CalButton.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent e) {
    System.out.println("actionPerformed()"); // TODO
    // Auto-generated
    // Event stub
    // actionPerformed()
    Months += Integer.parseInt(getYearsSpinner().getValue()
    .toString()) * 12;
    Months += Integer.parseInt(getMonthsSpinner().getValue()
    .toString());
    CellData = new String[Months][5];
    for (int i = 0; i < Months; i++) {
    for (int j = 0; j < 5; j++) {
    CellData[i][j] = "[";
    CellData[i][j] += new String(String.valueOf(i));
    CellData[i][j] += ", ";
    CellData[i][j] += new String(String.valueOf(j));
    CellData[i][j] += "]";
    CellData[i][j] += "\t";
    System.out.print(CellData[i][j]);
    }
    System.out.println();
    }
    // getResultTable().updateUI();
    // DataModel.fireTableDataChanged();
    ((AbstractTableModel)getResultTable().getModel()).fireTableDataChanged();
    Months = 0;
    }
    });
    }
    return CalButton;
    } /**
     * This method initializes AmountTextField
     * 
     * @return javax.swing.JTextField
     */
    private JTextField getAmountTextField() {
    if (AmountTextField == null) {
    AmountTextField = new JTextField();
    AmountTextField.setColumns(8);
    AmountTextField.setBounds(new Rectangle(62, 8, 92, 22));
    AmountTextField
    .setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
    }
    return AmountTextField;
    } /**
     * This method initializes RateTextField
     * 
     * @return javax.swing.JTextField
     */
    private JTextField getRateTextField() {
    if (RateTextField == null) {
    RateTextField = new JTextField();
    RateTextField.setColumns(8);
    RateTextField.setBounds(new Rectangle(234, 8, 92, 22));
    RateTextField
    .setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
    }
    return RateTextField;
    } /**
     * This method initializes jScrollPane
     * 
     * @return javax.swing.JScrollPane
     */
    private JScrollPane getJScrollPane() {
    if (jScrollPane == null) {
    jScrollPane = new JScrollPane();
    jScrollPane.setPreferredSize(new Dimension(350, 200));
    jScrollPane.setBounds(new Rectangle(5, 65, 350, 300));
    jScrollPane.setViewportView(getResultTable());
    }
    return jScrollPane;
    } /**
     * This method initializes ResultTable
     * 
     * @return javax.swing.JTable
     */
    private JTable getResultTable() {
    if (ResultTable == null) {
    // Months = 5;
    // CellData = new String[Months][5];
    // for (int i = 0; i < 5; i++) {
    // for (int j = 0; j < 5; j++) {
    // CellData[i][j] = "[";
    // CellData[i][j] += new String(String.valueOf(i));
    // CellData[i][j] += ", ";
    // CellData[i][j] += new String(String.valueOf(j));
    // CellData[i][j] += "]";
    // CellData[i][j] += "\t";
    // System.out.print(CellData[i][j]);
    // }
    // System.out.println();
    // }
    DataModel = new DefaultTableModel(CellData, Headers);
    ResultTable = new JTable(DataModel) {
    public boolean isCellEditable(int nRow, int nCol) {
    return false;
    }
    };
    // ResultTable = new JTable(CellData, Headers);
    }
    return ResultTable;
    } /**
     * This method initializes YearsSpinner
     * 
     * @return javax.swing.JSpinner
     */
    private JSpinner getYearsSpinner() {
    if (YearsSpinner == null) {
    SpinnerNumberModel spinnerNumberModel = new SpinnerNumberModel();
    spinnerNumberModel.setStepSize(new Integer(1));
    spinnerNumberModel.setMinimum(new Integer(0));
    spinnerNumberModel.setMaximum(new Integer(99));
    YearsSpinner = new JSpinner();
    YearsSpinner.setPreferredSize(new Dimension(36, 22));
    YearsSpinner.setBounds(new Rectangle(62, 38, 36, 22));
    YearsSpinner.setModel(spinnerNumberModel);
    }
    return YearsSpinner;
    } /**
     * This method initializes MonthsSpinner
     * 
     * @return javax.swing.JSpinner
     */
    private JSpinner getMonthsSpinner() {
    if (MonthsSpinner == null) {
    SpinnerNumberModel spinnerNumberModel = new SpinnerNumberModel();
    spinnerNumberModel.setStepSize(new Integer(1));
    spinnerNumberModel.setMinimum(new Integer(0));
    spinnerNumberModel.setMaximum(new Integer(11));
    MonthsSpinner = new JSpinner();
    MonthsSpinner.setPreferredSize(new Dimension(33, 22));
    MonthsSpinner.setBounds(new Rectangle(121, 38, 33, 22));
    MonthsSpinner.setModel(spinnerNumberModel); }
    return MonthsSpinner;
    } /**
     * This method initializes StartYearSpinner
     * 
     * @return javax.swing.JSpinner
     */
    private JSpinner getStartYearSpinner() {
    if (StartYearSpinner == null) {
    SpinnerNumberModel spinnerNumberModel3 = new SpinnerNumberModel();
    spinnerNumberModel3.setMaximum(new Integer(9999));
    spinnerNumberModel3.setMinimum(new Integer(1000));
    spinnerNumberModel3.setValue(new Integer((Calendar.getInstance()
    .get(Calendar.YEAR))));
    spinnerNumberModel3.setStepSize(new Integer(1));
    StartYearSpinner = new JSpinner();
    StartYearSpinner.setPreferredSize(new Dimension(50, 22));
    StartYearSpinner.setBounds(new Rectangle(234, 38, 50, 22));
    StartYearSpinner.setModel(spinnerNumberModel3);
    }
    return StartYearSpinner;
    } /**
     * This method initializes StartMonthSpinner
     * 
     * @return javax.swing.JSpinner
     */
    private JSpinner getStartMonthSpinner() {
    if (StartMonthSpinner == null) {
    SpinnerNumberModel spinnerNumberModel4 = new SpinnerNumberModel();
    spinnerNumberModel4.setMaximum(new Integer(12));
    spinnerNumberModel4.setStepSize(new Integer(1));
    spinnerNumberModel4.setValue(new Integer((Calendar.getInstance()
    .get(Calendar.MONTH))) + 1);
    spinnerNumberModel4.setMinimum(new Integer(1));
    StartMonthSpinner = new JSpinner();
    StartMonthSpinner.setPreferredSize(new Dimension(33, 22));
    StartMonthSpinner.setBounds(new Rectangle(307, 38, 33, 22));
    StartMonthSpinner.setModel(spinnerNumberModel4);
    }
    return StartMonthSpinner;
    } public static void main(String args[]) {
    new LoanFrame();
    } public void actionPerformed(ActionEvent arg0) {
    // TODO 自动生成方法存根 } public void itemStateChanged(ItemEvent arg0) {
    // TODO 自动生成方法存根 }} // @jve:decl-index=0:visual-constraint="-95,-54"
    getCalButton()中命令事件调用了((AbstractTableModel)getResultTable().getModel()).fireTableDataChanged();
    没有反应。
      

  7.   

    最后用了一个比较笨的方法,用了JTable的void setValueAt(Object aValue, int row, int column)方法,更新了数据。好了不问了,准备结帐。
    我慢慢摸索吧。