Нужно jTable показать 10 строк после задержки, а затем загружать новые записи после отображения всех

Вопрос:

SOLVED и EDITED с рабочей версией и оставлено на случай, если это может помочь кому-то еще

Строки этого jTable заполняются из двумерного строкового массива. Массив будет динамическим. Мне нужно отображать только 10 строк в течение 3 секунд, затем отображать еще 10 строк в течение 3 секунд, повторять этот цикл до конца массива, а затем заполнять массив и снова запускать цикл.

Я не могу найти примеры jTables, использующих временную задержку, для обновления таблицы вместо кнопок, изменения данных и т.д.
EDIT — Исправлены строки для отображения с помощью Timer ActionListener

Строки для отображения будут также выбраны из jSpinner, но как я могу реализовать заданные строки вместо отображения всех строк? Вертикальная и горизонтальная прокрутка отключена в jScrollPane.

EDIT — я все еще зациклился на том, как «пополнить» и отобразить новые записи после отображения всех записей в моем массиве 1 в первый раз через. SOLVED с другим таймером /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);
}
}

Лучший ответ:

Просто используйте javax.swing.Timer и в actionPerformed(), получите следующие 10 строк для отображения и замените строки в модели таблицы на следующие 10 строк.

Ответ №1

Решенный путем добавления еще одного таймера и ActionListener, формулы для времени, которое потребуется для отображения всех строк, сбросит высоту ScrollBar, когда вы получите доступ к финалу высоты и бара, как для ActionListeners, так и для создания новой модели 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();

Я хочу оставить этот вопрос в надежде, что он поможет кому-то еще с обновлением JTable, используя таймер вместо стандартных TableListeners. Я также редактирую вопрос, чтобы показать окончательный код.

PS> Я понимаю, что JTable немного освежает строки и сроки, но это отдельная проблема, над которой я сейчас работаю. Я поправлю редактирование, когда оно будет исправлено.

Спасибо JB Nizet (по какой-то причине он не позволит мне пометить вас) для рекомендации Timer ActionListener.

Оцените статью
TechArks.Ru
Добавить комментарий