Я делаю простое приложение, которое отображает текущее время и дату в JTable, но с фиксированным цветным фоном для каждой строки (вставлено в верхнюю часть таблицы). У меня проблемы с установкой фиксированного цвета фона для строки, когда он изменяется или назначенный цвет не сливается с данными. Когда были вставлены новые данные, фон был оставлен в первой строке, в то время как данные предположительно были перемещены вниз. Как я могу это исправить?
package testJava;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.SystemColor;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumnModel;
import javax.swing.JTable;
import javax.swing.JScrollPane;
public class tableApp extends JFrame {
private JPanel contentPane;
private JTable table;
DefaultTableModel model;
int counter;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
tableApp frame = new tableApp();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public tableApp() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
counter = 0;
JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(21, 24, 392, 227);
contentPane.add(scrollPane);
table = new JTable();
scrollPane.setViewportView(table);
setActiveTable();
startTmer();
}
public void startTmer(){
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
Random r = new Random();
int a = r.nextInt();
if ((a%2) == 0){
table.setBackground(Color.red);
}
else{
table.setBackground(Color.blue);
}
model.insertRow(0, new String[]{"Test : " + getDateandTime()});
counter++;
}
}, 2000, 2000);
}
private void setActiveTable(){
model = new DefaultTableModel() {
@Override
public boolean isCellEditable(int row, int column) {
//all cells false
return false;
}
};
String[] columns = new String[]{"test"};
model.setColumnIdentifiers(columns);
table.setModel(model);
TableColumnModel colModel=table.getColumnModel();
colModel.getColumn(0).setPreferredWidth(300);
Font font = new Font("",1,14);
table.setFont(font);
table.setRowHeight(16);
}
public String getDateandTime(){
String res = "";
LocalDateTime myDateObj = LocalDateTime.now();
DateTimeFormatter myFormatObj = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formattedDate = myDateObj.format(myFormatObj);
res = formattedDate.toString();
return res;
}
}