0

作業バージョンで解決および編集され、他の誰かを助けることができる場合に備えて残されました

この jTable の行は、2D 文字列配列から取り込まれています。配列は動的になります。10 行を 3 秒間表示するだけで、別の 10 行を 3 秒間表示し、配列の終わりまでこのサイクルを繰り返してから、配列を補充してサイクルを再開する必要があります。

ボタンやデータ変更などの代わりに時間遅延を使用してテーブルを更新する jTables の例を見つけることができません。
編集- Timer ActionListener で表示する行を修正しました

表示する行も jSpinner から選択されますが、すべての行を表示するのではなく、セットの行を実装するにはどうすればよいですか? jScrollPane では、垂直および水平スクロールが無効になっています。

編集- 配列内のすべてのレコードを初めて表示した後、新しいレコードを「補充」して表示する方法にまだこだわっています..別のTimer/ActionListenerと新しいDefaultTableModelで解決

import java.awt.Dimension;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;

public class DataTable2 {

String [][] data;       //2D Array (MultiDimensional) for Records.
String [] titles;       //Array for ColumnTitles
JTable table;           
DefaultTableModel model;
JScrollPane pane;       
JFrame frame;           
JPanel panel;  


public DataTable2(int rows, int radio){
    //Fill Arrays.
    titles = setTitles2(radio);
    data = fill2();
    //Timer Variables.
    final int SPEED = 4000;//3.5 sec delay for displaying number of rows on screen.
    int pause = 1000;
    //Row Variable
    final int R=rows;//For Timer ActionListener.

    //Components
    frame = new JFrame("Live Table");
    panel = new JPanel();
    model = new DefaultTableModel(data, titles);
    table = new JTable(model){
                @Override
                public boolean isCellEditable(int rowIndex, int colIndex){
                    return false;
                }};
    pane = new JScrollPane(table, ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER,
    ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

    //Table Formatting...More Done but not shown in example to keep shorter.
    table.setRowHeight(100);
    table.setFont(new Font("Arial", Font.BOLD,24));
    table.getTableHeader().setFont(new Font("Arial", Font.BOLD, 24));

    //Modified Code derived from FixedRowsTable  <http://stackoverflow.com/questions/6175139/jtable-row-limitation> by @Andrew Thompson
    //To show set number of rows of the table at a time. eg. 10 rows, timer, 10 rows,  timer etc......
    Dimension d = table.getPreferredSize();
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    pane.setPreferredSize(new Dimension(screenSize.width-50, table.getRowHeight()*rows));

    //Set as constants to be accessed by both ActionListeners.
    final int HEIGHT = table.getRowHeight()*(R);
    final JScrollBar BAR = pane.getVerticalScrollBar();
    //Listener for Timer. 
    ActionListener perform = new ActionListener(){
    @Override
    public void actionPerformed(ActionEvent ae) {
        BAR.setValue(BAR.getValue()+HEIGHT);
        }
    };
    //Listener for Timer 2.
    ActionListener update = new ActionListener(){
        @Override
        public void actionPerformed(ActionEvent ae){
            BAR.setValue(0);//Reset Row Height.
            DefaultTableModel model = new DefaultTableModel(data, titles);             
            table.setModel(model);
            }
    };

    //Timer.
    Timer timer = new Timer(SPEED, perform);
    timer.setRepeats(true);
    timer.start();

    //Timer 2.
    double val = table.getRowCount();///R;
    int time = 0;
    //Formula to compensate for SwingTimer accepting only Integer Values.
    if(val%R!=0){
      time=SPEED;  
    }
    time+= (table.getRowCount()/R)*SPEED;

    //Timer 2
    Timer timer2 = new Timer(time, update);
    timer2.setRepeats(true);
    timer2.start();

    //Debug
    System.out.println(time);
    System.out.println(val);
    System.out.println(val%R);

    //Set Panel to Full Screen
    panel.setPreferredSize(new Dimension (screenSize.width,screenSize.height));
    //Add Components.
    frame.add(panel);
    panel.add(pane);
//Frame Close Operation.
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    //Table Constraints.
    table.getTableHeader().setReorderingAllowed(false);
    table.getTableHeader().setResizingAllowed(true);
    table.setShowVerticalLines(false);
    table.setShowHorizontalLines(true);
//Apply Model to Table
    table.setModel(model);
    //Add table to scroll pane.
    pane.setViewportView(table);
    //Finish Frame
    frame.pack();
    frame.setLocationByPlatform(false);
    frame.setVisible(true); 
}   
/**
 * Method to fill table with String values for testing outside of network.
 * @return String array of Records.
 */
private String[][] fill2(){
        String[][] temp = {{"Record1", "Record2", "Record3", "Record4", "Record5", "Record6"},
                        {"Record7", "Record8", "Record9", "Record10", "Record11", "Record12"},
                        {"Record13", "Record14", "Record15", "Record16", "Record17", "Record18"},
                        {"Record19", "Record20", "Record21", "Record22", "Record23", "Record24"},
                        {"Record25", "Record26", "Record27", "Record28", "Record29", "Record30"},
                        {"Record31", "Record32", "Record33", "Record34", "Record35", "Record36"},
                        {"Record37", "Record38", "Record39", "Record40", "Record41", "Record42"},
                        {"Record43", "Record44", "Record45", "Record46", "Record47", "Record48"},
                        {"Record49", "Record50", "Record51", "Record52", "Record53", "Record54"},
                        {"Record55", "Record56", "Record57", "Record58", "Record59", "Record60"},
                        {"Record61", "Record62", "Record63", "Record64", "Record65", "Record66"},
                        {"Record67", "Record68", "Record69", "Record70", "Record71", "Record72"},
                        {"Record73", "Record74", "Record75", "Record76", "Record77", "Record78"},
        };
        return temp;
}

/**
 * Method to fill String array of column titles.
 * @param rad jRadioButton value from buttonGroup sent from main settings frame.
 * @return Column Titles
 */
private String[] setTitles2(int rad){
        String[] t;

        if(rad==2){
                t = new String[]{"TITLE1", "TITLE2"};
        }else if(rad==5||rad==10){
                t = new String[]{"TITLE1", "TITLE2", "TITLE3", "TITLE4", "TITLE5", "TITLE6", "TITLE7", "TITLE8"};
        }else if(rad==6){
                t = new String[]{"TITLE1", "TITLE2"};
        }else if(rad==7){
                t = new String[]{"TITLE1"};
        }else if(rad==8||rad==9){
                t = new String[]{"TITLE1", "TITLE2", "TITLE3", "TITLE4", "TITLE5"};
        }else{
                t=new String []{"TITLE1", "TITLE2", "TITLE3", "TITLE4", "TITLE5", "TITLE6"};
        }
return t;
}

//Main sample just to show table.
public static void main(String[] args) {
    //Sample Value for Example.
    int x = 10;  //Any Value from 1-10 will be used. 5 or 10 will be used most reguarly.
    int y = 1;  //Any Value from 1-9 will be used.  1 will be used most reguarly.
    //Call Table.
    DataTable2 table = new DataTable2(x,y);
}
}
4

2 に答える 2

2

javax.swing.Timerを使用し、そのactionPerformed()メソッドで次の 10 行を取得して表示し、テーブルのモデル内の行を次の 10 行に置き換えます。

于 2013-07-05T15:49:29.837 に答える
0

別の Timer と ActionListener、すべての行を表示するのにかかる時間の式を追加し、両方の ActionListeners が高さとバーの最終値にアクセスできるようにしながら ScrollBar の高さをリセットし、新しい DefaultTableModel を作成して setModel( ) 方法。

//Section Edited to Fix.
final int HEIGHT = table.getRowHeight()*(R);
    final JScrollBar BAR = pane.getVerticalScrollBar();
    //Listener for Timer. 
    ActionListener perform = new ActionListener(){
    @Override
    public void actionPerformed(ActionEvent ae) {
        BAR.setValue(BAR.getValue()+HEIGHT);
        }
    };
    //Listener for Timer 2.
    ActionListener update = new ActionListener(){
        @Override
        public void actionPerformed(ActionEvent ae){
            BAR.setValue(0);
            DefaultTableModel model = new DefaultTableModel(data, titles);             
            table.setModel(model);
            }
    };

    //Timer.
    Timer timer = new Timer(SPEED, perform);
    timer.setRepeats(true);
    timer.start();
    //Timer 2.
    double val = table.getRowCount();///R;
    int time = 0;
    if(val%R!=0){
      time=SPEED;  
    }
    time+= (table.getRowCount()/R)*SPEED;
    Timer timer2 = new Timer(time, update);
    timer2.setInitialDelay(time);
    timer2.setRepeats(true);
    timer2.start();

標準の TableListeners の代わりにタイマーを使用して JTable を更新するのに役立つことを期待して、この質問を残しておきたいと思います。また、質問を編集して最終的なコードを表示しています。

PS> JTable が行とタイミングで少し更新されていることは理解していますが、それは私が現在取り組んでいる別の問題です。修正されたら編集を投稿します。

Timer ActionListener の推奨事項について、JB Nizet に感謝します (何らかの理由でタグを付けることはできません)。

于 2013-07-25T16:16:12.133 に答える