Вставить строку с фиксированным цветом фона в JTable - PullRequest
1 голос
/ 10 октября 2019

Я делаю простое приложение, которое отображает текущее время и дату в 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;
        }

    }
...