2

テーブルを更新するタイマークラスがありますが、変更に影響を与えることがわかった唯一の方法は、このコードを使用することです。これは本質的に休憩時間のアプリケーションです。ネットワーク上のiniファイルを読み取るためにini4jを使用しています。それは機能しますが、私がしている他のことで速度の問題を引き起こしています。現在の設定では、時間はほぼ正確に表示されますが、人を追加すると遅れ始めます。あなたが答えるなら、それは役に立たないだろうjTablesを学ぶことです笑。jtablesとfireupdateの変更を使用してこれを機能させることができませんでした。

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.TimeZone;

import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

import main.Break;

import org.ini4j.InvalidFileFormatException;
import org.ini4j.Wini;

public class TableUpdate extends JLabel implements ActionListener {

    /**
     * 
     */
    private static final long serialVersionUID = 4357754555235469274L;
    private volatile static boolean running = true;
    SimpleDateFormat UTC = new SimpleDateFormat("HH:mm:ss");    
    Timer breaktimer = new Timer(1000, this);   
    public static long now = System.currentTimeMillis();

    final static String local = ConfigIni.location();
    final static File FILENAME = new File(local+"\\master.ini");

    @Override
    public void actionPerformed(ActionEvent arg0) {
        Runnable runnable = new Runnable() {
             public void run() {

                    tableupdate();  
             }};
            SwingUtilities.invokeLater(runnable);
        }

    public void tableupdate() {  
        UTC.setTimeZone(TimeZone.getTimeZone("UTC"));          
            Wini ini = null;
            try {
                ini = new Wini(FILENAME);
            } catch (InvalidFileFormatException e1) {               
                e1.printStackTrace();
            } catch (IOException e1) {              
                e1.printStackTrace();
            }
            String number = ini.get("analysts", "number");

            if (number.equals("8")) {
                Break.jTable1.setModel(new javax.swing.table.DefaultTableModel(
                 new Object [][] {
                 {AnalystIni.one(), StartIni.one(), BreakIni.one(), TypeIni.one()},
                 {AnalystIni.two(), StartIni.two(), BreakIni.two(), TypeIni.two()},
                 {AnalystIni.three(), StartIni.three(), BreakIni.three(), TypeIni.three()},
                 {AnalystIni.four(), StartIni.four(), BreakIni.four(), TypeIni.four()},
                 {AnalystIni.five(), StartIni.five(), BreakIni.five(), TypeIni.five()},
                 {AnalystIni.six(), StartIni.six(), BreakIni.six(), TypeIni.six()},
                 {AnalystIni.seven(), StartIni.seven(), BreakIni.seven(), TypeIni.seven()},
                 {AnalystIni.eight(), StartIni.eight(), BreakIni.eight(), TypeIni.eight()},              
                         },
                         new String [] {
                         "Analyst", "Start Time", "Timer", "Status"
                         }
                     ));


            }
    }

    public void start()  {

        running = true;
        breaktimer.start();
    }

    public void stop() {

        running = false;
    }

    public static void main(String[] args) {    

        java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {         
            TableUpdate jtl = new TableUpdate();
            jtl.start();
            }
    });                    
    }
}

これが私のテーブルのコードです

try {
            jTable1.setModel(new javax.swing.table.DefaultTableModel(

                new Object [][] {
                    {AnalystIni.one(), StartIni.one(), BreakIni.one(), TypeIni.one()},
                    {AnalystIni.two(), StartIni.two(), BreakIni.two(), TypeIni.two()},
                    {AnalystIni.three(), StartIni.three(), BreakIni.three(), TypeIni.three()},
                    {AnalystIni.four(), StartIni.four(), BreakIni.four(), TypeIni.four()},
                    {AnalystIni.five(), StartIni.five(), BreakIni.five(), TypeIni.five()},
                    {AnalystIni.six(), StartIni.six(), BreakIni.six(), TypeIni.six()},
                    {AnalystIni.seven(), StartIni.seven(), BreakIni.seven(), TypeIni.seven()},
                    {AnalystIni.eight(), StartIni.eight(), BreakIni.eight(), TypeIni.eight()}
                },
                new String [] {
                    "Analyst", "Time Started", "Timer", "Status"
                }
            ));
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        JTableHeader header = jTable1.getTableHeader();
        header.setBackground(SettingsIni.jtable1h());
        header.setForeground(SettingsIni.jtable1ht());
        jTable1.setBackground(SettingsIni.jtable1());
        jTable1.setForeground(SettingsIni.jtable1t());
        jTable1.setOpaque(false);
        jScrollPane1.setViewportView(jTable1);
        jScrollPane1.setOpaque(false);
        jTable1.setFocusable(false);
        //jScrollPane1.setBorder(BorderFactory.createMatteBorder(0,1,0,0,Color.black));
        jScrollPane1.setBorder(BorderFactory.createEmptyBorder(0,0,0,0));

        jScrollPane1.getViewport().setOpaque(false);
        final Color jcolor1 = new Color(0, true);
        jScrollPane1.getViewport().setBackground(jcolor1);

        getRootPane().setBorder(BorderFactory.createEmptyBorder(0,0,0,0));//removed border

このコードをテーブルのあるクラスに追加しました。

@Override
    public void tableChanged(TableModelEvent e) {
        int row = e.getFirstRow();
        int column = e.getColumn();
        TableModel model = (TableModel)e.getSource();
        String columnName = model.getColumnName(column);
        Object data = model.getValueAt(row, column);        
    }

これをタイマーに追加することを検討していますが、それでも何かが足りないように感じます。

BreakTimev21.jTable1.tableChanged(new TableModelEvent(BreakTimev21.jTable1.getModel()));

camickrから、tableupdateクラスでこれを試しました。それでも役に立たなかった、それは更新しますが、ちょっとグリッチです。私は使用することを覚えていましたjTable1.setAutoCreateColumnsFromModel(false);

Object [][] data = {
                        {a1, StartIni2.one(), BreakIni2.one(), TypeIni2.one()},
                        {a2, StartIni2.two(), BreakIni2.two(), TypeIni2.two()},
                        {a3, StartIni2.three(), BreakIni2.three(), TypeIni2.three()},
                        {a4, StartIni2.four(), BreakIni2.four(), TypeIni2.four()},
                        {a5, StartIni2.five(), BreakIni2.five(), TypeIni2.five()},
                        {a6, StartIni2.six(), BreakIni2.six(), TypeIni2.six()},
                        {a7, StartIni2.seven(), BreakIni2.seven(), TypeIni2.seven()},
                        {a8, StartIni2.eight(), BreakIni2.eight(), TypeIni2.eight()},
                    };
                    String [] columnNames = {
                        "Analyst", "Start Time", "Timer", "Status"
                    };

                    TableModel model = BreakTimev21.jTable1.getModel();
                    ((DefaultTableModel) model).setDataVector(data, columnNames);

tableupdateの読み取り部分にini4jを使用するのをやめ、Javaプロパティを使用しました。これにより、速度が大幅に向上しましたが、それでも解決されませんでした。setDataVectorBreakTimev21.jTable1.setValueAt(StartIni2.one(), 0, 1);は、StartIni2がini4jの代わりにJavaプロパティを使用するのと同じように機能します。

4

3 に答える 3

4

タイマーを更新するたびにテーブルモデルを変更しないでください。むしろ、をサブクラス化することにより、独自のモデルを実装する必要がありますAbstractTableModel。タイマーでデータが更新されるたびに、変更されたモデルの値のみを変更し、のfire *()メソッドを使用してAbstractTableModel、Swingに何をしたかを認識させます。

Javadocチュートリアルを参照してください。

于 2013-02-04T21:45:49.200 に答える
2

まず第一に、TableUpdateクラスを実装するためにJLabelを拡張するべきではありません。

DefaultTableModelを使用できない理由はありません。モデル内の既存のデータを変更する場合は、次を呼び出すだけです。

model.setValueAt(...)

テーブルはセルを自動的に再描画します。

したがって、タイマーが起動し、テーブルを更新する時間になると、新しいデータを使用して2次元配列を作成できます。次に、配列をループして、配列の値をモデルの値と比較します。違いを見つけたら、上記で提案したようにモデルを更新します。

または、既存のモデルを引き続き使用し、DefaultTableModelのsetDataVector()メソッドを使用して、モデル内のすべてのデータを配列内のデータに置き換えることもできます。

この2番目のアプローチを使用する場合は、最初にJTableを作成した後、次の方法を使用します。

table.setAutoCreateColumnsFromModel(false); 

これにより、データが更新されるだけで、すべてのTableColumnsなどが再作成されないため、モデルの更新が高速になります。

ここでいずれかのアプローチを使用すると、tableChanged()メソッドを試す必要はありません。

于 2013-02-05T02:49:15.983 に答える
1

問題は、データをObject [] []配列にコピーし、それをテーブルモデルに使用していることです。ただし、データが変更された場合、どの値が変更されたかをテーブルモデルに伝える方法が明確ではありません。

代わりに、AbstractTableModelをサブクラス化し、以下をオーバーライドします(少なくとも)。

public int getRowCount();
public int getColumnCount();
public Object getValueAt(int row, int column);
isCellEditable(int rowIndex, int columnIndex);
public Object setValueAt(Object aValue, int rowIndex, int columnIndex);

setValueAtが呼び出されたら、変更するバッキングオブジェクト/プロパティを特定し、それを変更します。次に、fireTableCellUpdated(int row、int column)メソッドを呼び出します。

ちなみに、AnalystIniで使用しているメソッド呼び出しは、テーブル内の行が8行に制限されるため、私には怪しいように見えます。名前付きの値の代わりにリストを使用することを検討してください。

于 2013-02-04T23:44:27.363 に答える