1

次のコードはMacOSX 10.6.8では機能しませんが、私がテストする他のすべてのMac OSXLionとWindows7では機能します。明らかな説明はAppleのjavaの違いです。Macでは、テーブルデータが正しく表示されません。これがコードです

package com.dramble.dance;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import java.awt.GridLayout;
import java.util.ArrayList;
import java.util.List;

public class TableDemo extends JPanel {

    public TableDemo() {
        super(new GridLayout(1,0));

        TableModel tableModel = new TableModel();

        JTable table = new JTable(tableModel);

        JScrollPane scrollPane = new JScrollPane(table);
        add(scrollPane);

        for(int i = 0 ; i <= 1900 ; i ++) {
            DataRow row = new DataRow(i,"Firstname"+i,"Lastname"+i);
            tableModel.appendRow(row);
            tableModel.fireTableRowsInserted(i, i);
        }
    }

    private static void createAndShowGUI() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        TableDemo newContentPane = new TableDemo();
        newContentPane.setOpaque(true);
        frame.setContentPane(newContentPane);

        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }

    private class DataRow {
        private String fname, lname;
        private Integer id;
        public String getFname() {
            return fname;
        }
        public String getLname() {
            return lname;
        }
        public Integer getId() {
            return id;
        }
        public DataRow(Integer id, String fname, String lname) {
            super();
            this.fname = fname;
            this.lname = lname;
            this.id = id;
        }
    }

    private class TableModel extends AbstractTableModel {
        List<DataRow> data;
        private String[] columnNames = {"ID #","First Name","Last Name"};
        private Class[] columnTypes = {int.class, String.class, String.class};


        public TableModel() {
            this.data = new ArrayList<DataRow>();
        }

        @Override
        public int getColumnCount() {
            return columnNames.length;
        }

        @Override
        public String getColumnName(int col) {
            return columnNames[col];
        }

        @Override
        public int getRowCount() {
            return this.data.size();
        }

        @Override
        public Object getValueAt(int row, int col) {
            DataRow dataRow = this.data.get(row);
            Object returnValue = null;

            switch (col) {
            case 0:
                returnValue = dataRow.getId();
                break;
            case 1:
                returnValue = dataRow.getFname();
                break;
            case 2:
                returnValue = dataRow.getLname();
                break;
            }
            return returnValue;
        }

        public void appendRow(DataRow row) {
            this.data.add(row);
        }

        @Override
        public boolean isCellEditable(int rowIndex, int vColIndex) {
            return false;
        }

        @Override
        public Class getColumnClass(int col) {
            return columnTypes[col];
        }
    }
}

これは、Windowsで表示される予想される動作の画像です。 Windowsの作業テーブル

これはMacOSX10.6.8の同じコードです MacOSXで壊れた

4

2 に答える 2

2

問題はAbstractTableModelにありますが、これは何らかの理由で私を驚かせました。確かにEDTとスレッドに関連していると思いました。columnTypes問題は、とを使用するための私の配列にありint.classます。これを変更しInteger.classて問題を修正しました。

于 2013-01-25T19:27:59.453 に答える
1

完全な例がなければ、推測するのは難しいです。あなたが持っているものは大丈夫に見えますが、2つのことが際立っています:

  • フレームのコンテンツペインがあなたのframe.setContentPane(newContentPane)置き換えられることに注意してくださいTableDemo。と同様TableDemoJPanel、プラットフォームによって異なるUIデリゲートを継承します。代わりに、コンテンツペインframe.add(newContentPane)転送するを検討してください。

  • あなたのappendRowData()メソッドはDanceTableModelすべきfireTableRowsInserted()です、そうすれば発信者はそうすることを忘れることができません。

于 2013-01-19T02:06:52.307 に答える