Java 使用DefaultTableCellRenderer时响应缓慢的滚动条

Java 使用DefaultTableCellRenderer时响应缓慢的滚动条,java,swing,jtable,simpledateformat,tablecellrenderer,Java,Swing,Jtable,Simpledateformat,Tablecellrenderer,我正在开发一个桌面应用程序,它需要比较火车时刻到达和离开的日期,并突出显示不同颜色代码的差异。我目前面临两个问题:- 尽管下面列出的代码在功能方面运行良好,但在导入包含多行的大型文件时,滚动条的响应速度非常慢。 日期格式的格式为dd MMM yy HH.mm.ss,但在从文件中读取日期值时可能会出现这种情况,因为某些日期可能具有空值,这些空值可能由或简单地表示为-。有没有办法将空值转换为上面定义的简单日期格式? 如果有人能帮上忙,我将不胜感激。干杯 import java.awt.Col

我正在开发一个桌面应用程序,它需要比较火车时刻到达和离开的日期,并突出显示不同颜色代码的差异。我目前面临两个问题:-

尽管下面列出的代码在功能方面运行良好,但在导入包含多行的大型文件时,滚动条的响应速度非常慢。 日期格式的格式为dd MMM yy HH.mm.ss,但在从文件中读取日期值时可能会出现这种情况,因为某些日期可能具有空值,这些空值可能由或简单地表示为-。有没有办法将空值转换为上面定义的简单日期格式? 如果有人能帮上忙,我将不胜感激。干杯

    import java.awt.Color;
    import java.awt.Component;
    import java.io.IOException;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;

    import javax.swing.JTable;
    import javax.swing.table.DefaultTableCellRenderer;


    public class CellRenderer extends DefaultTableCellRenderer{


    public CellRenderer(){
        super.setOpaque(true);
    }

    private static final long serialVersionUID = 1L;

    public Component getTableCellRendererComponent(JTable table, Object obj, 
            boolean isSelected, boolean hasFocus, int row, int column) {
        Component cell = super.getTableCellRendererComponent(table, obj, 
                isSelected, hasFocus, row, column);

        /*Define Date format*/

        SimpleDateFormat format = new SimpleDateFormat("dd-MMM-yy HH.mm.ss");  

        /*Date Array Initialisation*/

        Date [][] actDep = new Date[row+1][1];
        Date [][] planDep = new Date[row+1][1];
        Date [][] actArr = new Date[row+1][1];
        Date [][] planArr = new Date[row+1][1];

        String values=(String) table.getValueAt(row, column);

        String actArr1 = (String) table.getValueAt(row, 6);
        String planArr1 = (String) table.getValueAt(row, 3);
        String actDep1 = (String) table.getValueAt(row, 7);
        String planDep1 = (String) table.getValueAt(row, 4);


        long [][] arrDiff = new long[row+1][1];
        long [][] depDiff = new long[row+1][1];

        /*Parse Date Arrays*/

        for (int i = 0; i<=row; i++) {
            if(values.equals("-"))
            {
                table.setValueAt("01-JAN-01 00.00.00", row, column);
            }
            try {
                actDep[i][0] = format.parse(actDep1);
                planDep[i][0] = format.parse(planDep1);
                actArr[i][0] = format.parse(actArr1);
                planArr[i][0] = format.parse(planArr1);  

                /*Calculate differences in actual and planned arrivals in milliseconds*/    
                arrDiff[i][0]=actArr[i][0].getTime() - planArr[i][0].getTime();

                /*Calculate differences in actual and planned departures in milliseconds*/  
                depDiff[i][0]=actDep[i][0].getTime() - planDep[i][0].getTime();
        }
            catch(ParseException e) {
                e.printStackTrace();
            }
        }


        Color lightOrange = new Color(255,215,0);
        Color darkOrange = new Color(255,140,0);
        Color aqua = new Color(0,255,255);
        Color pinky = new Color(255,0,255);


        /**
         * Colours have been highlighed in the table based on the following:
         * Aqua - early arrivals and departures
         * Green - no delay, departures within a minute
         * Yellow - up to five minutes late
         * Light Orange - 5-7 minutes late
         * Dark Orange - 7-10 minutes late
         * Red - later than 10 minutes
         * Pink - unplanned arrivals and departures
         * Gray - missed events
         */

        for(int i=0; i<=row; i++){

        if((column == 6) && (arrDiff[i][0] >= 600000 && arrDiff[i][0] < 21600000) || ((column == 7) && (depDiff[i][0] >= 600000 && depDiff[i][0] < 21600000)))
            cell.setBackground(Color.RED);      

        else if((column == 6) && (arrDiff[i][0] >= 420000 && arrDiff[i][0] < 600000) || ((column == 7) && (depDiff[i][0] >= 420000 && depDiff[i][0] < 600000)))
            cell.setBackground(darkOrange);

        else if((column == 6) && (arrDiff[i][0] >= 300000 && arrDiff[i][0] < 420000) || ((column == 7) && (depDiff[i][0] >= 300000 && depDiff[i][0] < 420000)))
            cell.setBackground(lightOrange);

        else if((column == 6) && (arrDiff[i][0] >= 60000 && arrDiff[i][0] < 300000) || ((column == 7) && (depDiff[i][0] >= 60000 && depDiff[i][0] < 300000)))
            cell.setBackground(Color.YELLOW);

        else if((column == 6) && (arrDiff[i][0]== 0 && arrDiff[i][0] < 60000 && !actArr1.equals("01-JAN-01 00.00.00")) || ((column == 7) && (depDiff[i][0]== 0 && depDiff[i][0] < 60000 && !actDep1.equals("01-JAN-01 00.00.00"))))
            cell.setBackground(Color.GREEN);

        else if((column == 6) && (arrDiff[i][0]>= -600000 && arrDiff[i][0] < 0) || ((column == 7) && (depDiff[i][0]>= -600000 && depDiff[i][0] < 0)))
            cell.setBackground(aqua);

        else if((column == 6) && (arrDiff[i][0] > -600000 && !actArr1.equals("01-JAN-01 00.00.00")) || ((column == 7) && (depDiff[i][0] > -600000 && !actDep1.equals("01-JAN-01 00.00.00"))))
            cell.setBackground(pinky);

        else if((column == 6) && (arrDiff[i][0] < -600000) || ((column == 7) && (depDiff[i][0] < -600000)))
            cell.setBackground(Color.GRAY);

        else{

            cell.setBackground(Color.WHITE);
            cell.setForeground(Color.BLACK);
      }
      }

       return cell;

}

}

您希望将空值解析为什么?希望将空值视为01-JAN-01 00.00.00。因此,您可以在try parse date中使用try catch块,并在catch中将日期设置为01-JAN-01 00.00.00。然后,使用if-else条件处理空值的第二个问题,例如-if date==-{format.parse01-JAN-01 00.00.00;}这比我想象的要容易。但仍然存在第一个问题,即当导入一个包含多行的大文件时,滚动条的响应速度非常慢。请帮助…然后尝试双缓冲,这并不容易,但这将是第一个问题的解决方案