Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 重绘方法不适用于';不工作或循环_Java_While Loop_Paint_Repaint - Fatal编程技术网

Java 重绘方法不适用于';不工作或循环

Java 重绘方法不适用于';不工作或循环,java,while-loop,paint,repaint,Java,While Loop,Paint,Repaint,我不知道我是否正确使用了重新绘制的方法,我需要更新数字时钟的时间,但即使使用while循环尝试重新绘制,它也不起作用 public class Frame extends JFrame{ Calendar calendar = Calendar.getInstance(); int[] horaD = new int[14]; int[] horaU = new int[14]; int[] minD = new int[14]; int[] minU

我不知道我是否正确使用了重新绘制的方法,我需要更新数字时钟的时间,但即使使用while循环尝试重新绘制,它也不起作用

public class Frame extends JFrame{


    Calendar calendar = Calendar.getInstance();
    int[] horaD = new int[14];
    int[] horaU = new int[14];
    int[] minD = new int[14];
    int[] minU = new int[14];
    int[] segD = new int[14];
    int[] segU = new int[14];

    public Frame(){
        this.setTitle("Relógio Digital");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.pack();
        this.setSize(1000, 400);
        this.setVisible(true); 
    }

    public void obterHora(){
        verificaHora();
        verificaMinuto();
        verificaSegundo();
    }

    public void verificaHora(){

        int d;
        int u;
        int i = calendar.get(Calendar.HOUR_OF_DAY);
        char[] digitos = String.valueOf(i).toCharArray();
        if(digitos.length == 2){
            d = Integer.parseInt(String.valueOf(digitos[0]));
            u = Integer.parseInt(String.valueOf(digitos[1]));
        }else{
            d = 0;
            u = Integer.parseInt(String.valueOf(digitos[0]));
        }

        switch(d){
            case 0:
                horaD = Numeros.Zero;
                break;
            case 1:
                horaD = Numeros.Um;
                break;
            case 2:
                horaD = Numeros.Dois;
                break;
            default:
                horaU = Numeros.Zero;
                break;
        }

        switch(u){
            case 0:
                horaU = Numeros.Zero;
                break;
            case 1:
                horaU = Numeros.Um;
                break;
            case 2:
                horaU = Numeros.Dois;
                break;
            case 3:
                horaU = Numeros.Tres;
                break;
            case 4:
                horaU = Numeros.Quatro;
                break;
            case 5:
                horaU = Numeros.Cinco;
                break;
            case 6:
                horaU = Numeros.Seis;
                break;
            case 7:
                horaU = Numeros.Sete;
                break;
            case 8:
                horaU = Numeros.Oito;
                break;
            case 9:
                horaU = Numeros.Nove;
                break;
            default:
                horaU = Numeros.Zero;
                break;
        }   
    }   
    public void verificaMinuto(){

        int d;
        int u;
        int i = calendar.get(Calendar.MINUTE);
        char[] digitos = String.valueOf(i).toCharArray();
        if(digitos.length == 2){
            d = Integer.parseInt(String.valueOf(digitos[0]));
            u = Integer.parseInt(String.valueOf(digitos[1]));
        }else{
            d = 0;
            u = Integer.parseInt(String.valueOf(digitos[0]));
        }
        switch(d){
            case 0:
                minD = Numeros.Zero;
                break;
            case 1:
                minD = Numeros.Um;
                break;
            case 2:
                minD = Numeros.Dois;
                break;
            case 3:
                minD = Numeros.Tres;
                break;
            case 4:
                minD = Numeros.Quatro;
                break;
            case 5:
                minD = Numeros.Cinco;
                break;
            default:
                minD = Numeros.Zero;
                break;
        }

        switch(u){
            case 0:
                minU = Numeros.Zero;
                break;
            case 1:
                minU = Numeros.Um;
                break;
            case 2:
                minU = Numeros.Dois;
                break;
            case 3:
                minU = Numeros.Tres;
                break;
            case 4:
                minU = Numeros.Quatro;
                break;
            case 5:
                minU = Numeros.Cinco;
                break;
            case 6:
                minU = Numeros.Seis;
                break;
            case 7:
                minU = Numeros.Sete;
                break;
            case 8:
                minU = Numeros.Oito;
                break;
            case 9:
                minU = Numeros.Nove;
                break;
            default:
                minU = Numeros.Zero;
                break;
        }   
    }
    public void verificaSegundo(){

        int d;
        int u;
        int i = calendar.get(Calendar.SECOND);
        char[] digitos = String.valueOf(i).toCharArray();
        if(digitos.length == 2){
            d = Integer.parseInt(String.valueOf(digitos[0]));
            u = Integer.parseInt(String.valueOf(digitos[1]));
        }else{
            d = 0;
            u = Integer.parseInt(String.valueOf(digitos[0]));
        }

        switch(d){
            case 0:
                segD = Numeros.Zero;
                break;
            case 1:
                segD = Numeros.Um;
                break;
            case 2:
                segD = Numeros.Dois;
                break;
            case 3:
                segD = Numeros.Tres;
                break;
            case 4:
                segD = Numeros.Quatro;
                break;
            case 5:
                segD = Numeros.Cinco;
                break;
            default:
                segD = Numeros.Zero;
                break;
        }

        switch(u){
            case 0:
                segU = Numeros.Zero;
                break;
            case 1:
                segU = Numeros.Um;
                break;
            case 2:
                segU = Numeros.Dois;
                break;
            case 3:
                segU = Numeros.Tres;
                break;
            case 4:
                segU = Numeros.Quatro;
                break;
            case 5:
                segU = Numeros.Cinco;
                break;
            case 6:
                segU = Numeros.Seis;
                break;
            case 7:
                segU = Numeros.Sete;
                break;
            case 8:
                segU = Numeros.Oito;
                break;
            case 9:
                segU = Numeros.Nove;
                break;
            default:
                segU = Numeros.Zero;
                break;
        }   
    }

    @Override
    public void paint(Graphics g){

        g.setColor(Color.black);

        obterHora();

        //Dígito da dezena da hora
        g.fillRect(100, 100, horaD[0], horaD[7]);
        g.fillRect(100, 100, horaD[1], horaD[8]);
        g.fillRect(200, 100, horaD[2], horaD[9]);
        g.fillRect(100, 200, horaD[3], horaD[10]);
        g.fillRect(200, 200, horaD[4], horaD[11]);
        g.fillRect(100, 200, horaD[5], horaD[12]);
        g.fillRect(100, 300, horaD[6], horaD[13]);

        //Dígito da unidade da hora
        g.fillRect(230, 100, horaU[0], horaU[7]);
        g.fillRect(230, 100, horaU[1], horaU[8]);
        g.fillRect(330, 100, horaU[2], horaU[9]);
        g.fillRect(230, 200, horaU[3], horaU[10]);
        g.fillRect(330, 200, horaU[4], horaU[11]);
        g.fillRect(230, 200, horaU[5], horaU[12]);
        g.fillRect(230, 300, horaU[6], horaU[13]);

        //Dois pontos (Hora/Minuto)
        g.fillRect(365, 180, 15, 15);
        g.fillRect(365, 215, 15, 15);

        //Dígito da dezena do minuto
        g.fillRect(400, 100, minD[0], minD[7]);
        g.fillRect(400, 100, minD[1], minD[8]);
        g.fillRect(500, 100, minD[2], minD[9]);
        g.fillRect(400, 200, minD[3], minD[10]);
        g.fillRect(500, 200, minD[4], minD[11]);
        g.fillRect(400, 200, minD[5], minD[12]);
        g.fillRect(400, 300, minD[6], minD[13]);

        //Dígito da unidade do minuto
        g.fillRect(530, 100, minU[0], minU[7]);
        g.fillRect(530, 100, minU[1], minU[8]);
        g.fillRect(630, 100, minU[2], minU[9]);
        g.fillRect(530, 200, minU[3], minU[10]);
        g.fillRect(630, 200, minU[4], minU[11]);
        g.fillRect(530, 200, minU[5], minU[12]);
        g.fillRect(530, 300, minU[6], minU[13]);

        //Dois pontos (Minuto/Segundo)
        g.fillRect(665, 180, 15, 15);
        g.fillRect(665, 215, 15, 15);

        //Dígito da dezena do segundo
        g.fillRect(700, 100, segD[0], segD[7]);
        g.fillRect(700, 100, segD[1], segD[8]);
        g.fillRect(800, 100, segD[2], segD[9]);
        g.fillRect(700, 200, segD[3], segD[10]);
        g.fillRect(800, 200, segD[4], segD[11]);
        g.fillRect(700, 200, segD[5], segD[12]);
        g.fillRect(700, 300, segD[6], segD[13]);

        //Dígito da unidade do segundo
        g.fillRect(830, 100, segU[0], segU[7]);
        g.fillRect(830, 100, segU[1], segU[8]);
        g.fillRect(930, 100, segU[2], segU[9]);
        g.fillRect(830, 200, segU[3], segU[10]);
        g.fillRect(930, 200, segU[4], segU[11]);
        g.fillRect(830, 200, segU[5], segU[12]);
        g.fillRect(830, 300, segU[6], segU[13]);
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Frame f = new Frame();
        while(true){
            f.repaint();
        }
    }

}
我改进了我的代码,但我不得不使用线程每秒钟延迟一次重新绘制,因为我的老师不想让我使用计时器来完成此代码,我尝试了此操作,但它仍然没有更新

public class Frame extends JFrame{
HoraExata he = new HoraExata(); //Exact Time

private int[] horaD = new int[14];
private int[] horaU = new int[14];
private int[] minD = new int[14];
private int[] minU = new int[14];
private int[] segD = new int[14];
private int[] segU = new int[14];

public Frame(){
    this.setTitle("Relógio Digital");
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.pack();
    this.setSize(1000, 400);
}

 public void atualizaHora() { //Update Time
     while (true) {
             repaint();
             try {
                     Thread.sleep(1000);
             } catch (InterruptedException e) {
             }
     }
 }

public void obterHora(){ //Get the values to make each number in canvas
    horaD = he.verificaHora(1);
    horaU = he.verificaHora(2);
    minD = he.verificaMinuto(1);
    minU = he.verificaMinuto(2);
    segD = he.verificaSegundo(1);
    segU = he.verificaSegundo(2);
}

public void paint(Graphics g){

    g.setColor(Color.black);

    obterHora();

    //Dígito da dezena da hora
    g.fillRect(100, 100, horaD[0], horaD[7]);
    g.fillRect(100, 100, horaD[1], horaD[8]);
    g.fillRect(200, 100, horaD[2], horaD[9]);
    g.fillRect(100, 200, horaD[3], horaD[10]);
    g.fillRect(200, 200, horaD[4], horaD[11]);
    g.fillRect(100, 200, horaD[5], horaD[12]);
    g.fillRect(100, 300, horaD[6], horaD[13]);

    //Dígito da unidade da hora
    g.fillRect(230, 100, horaU[0], horaU[7]);
    g.fillRect(230, 100, horaU[1], horaU[8]);
    g.fillRect(330, 100, horaU[2], horaU[9]);
    g.fillRect(230, 200, horaU[3], horaU[10]);
    g.fillRect(330, 200, horaU[4], horaU[11]);
    g.fillRect(230, 200, horaU[5], horaU[12]);
    g.fillRect(230, 300, horaU[6], horaU[13]);

    //Dois pontos (Hora/Minuto)
    g.fillRect(365, 180, 15, 15);
    g.fillRect(365, 215, 15, 15);

    //Dígito da dezena do minuto
    g.fillRect(400, 100, minD[0], minD[7]);
    g.fillRect(400, 100, minD[1], minD[8]);
    g.fillRect(500, 100, minD[2], minD[9]);
    g.fillRect(400, 200, minD[3], minD[10]);
    g.fillRect(500, 200, minD[4], minD[11]);
    g.fillRect(400, 200, minD[5], minD[12]);
    g.fillRect(400, 300, minD[6], minD[13]);

    //Dígito da unidade do minuto
    g.fillRect(530, 100, minU[0], minU[7]);
    g.fillRect(530, 100, minU[1], minU[8]);
    g.fillRect(630, 100, minU[2], minU[9]);
    g.fillRect(530, 200, minU[3], minU[10]);
    g.fillRect(630, 200, minU[4], minU[11]);
    g.fillRect(530, 200, minU[5], minU[12]);
    g.fillRect(530, 300, minU[6], minU[13]);

    //Dois pontos (Minuto/Segundo)
    g.fillRect(665, 180, 15, 15);
    g.fillRect(665, 215, 15, 15);

    //Dígito da dezena do segundo
    g.fillRect(700, 100, segD[0], segD[7]);
    g.fillRect(700, 100, segD[1], segD[8]);
    g.fillRect(800, 100, segD[2], segD[9]);
    g.fillRect(700, 200, segD[3], segD[10]);
    g.fillRect(800, 200, segD[4], segD[11]);
    g.fillRect(700, 200, segD[5], segD[12]);
    g.fillRect(700, 300, segD[6], segD[13]);

    //Dígito da unidade do segundo
    g.fillRect(830, 100, segU[0], segU[7]);
    g.fillRect(830, 100, segU[1], segU[8]);
    g.fillRect(930, 100, segU[2], segU[9]);
    g.fillRect(830, 200, segU[3], segU[10]);
    g.fillRect(930, 200, segU[4], segU[11]);
    g.fillRect(830, 200, segU[5], segU[12]);
    g.fillRect(830, 300, segU[6], segU[13]);
}

public static void main(String[] args) {
    // TODO Auto-generated method stub
    Frame f = new Frame();
    f.setVisible(true);
    f.atualizaHora();
}

}

首先,调用repaint方法并不一定意味着要再次绘制UI。它由JVM控制UI是否要再次绘制。这基本上是JAVA中的一个内置特性。如果JVM检测到UI已更改,则只有JVM将再次绘制UI。这里调用
repaint
方法只会触发JVM,以查看UI是否需要再次绘制。像最小化、恢复和最大化帧一样,将导致调用重绘,而不使用任何代码

这里还要注意,您已经覆盖了
JFrame
paint
方法。您应该重写
paintComponent
方法,并且应该在开头有一行

super.paintComponent();
这确保了
JFrame
的默认绘制方法是完整的,这样当您通过绘制不同的形状进行更改时,它可以反映在已绘制的
JFrame

对于显示
main
方法中的
JFrame
,您应该使用:

Frame f = new Frame();
f.setVisible(true);

为了使框架可见。

首先,调用repaint方法并不一定意味着要再次绘制UI。它由JVM控制UI是否要再次绘制。这基本上是JAVA中的一个内置特性。如果JVM检测到UI已更改,则只有JVM将再次绘制UI。这里调用
repaint
方法只会触发JVM,以查看UI是否需要再次绘制。像最小化、恢复和最大化帧一样,将导致调用重绘,而不使用任何代码

这里还要注意,您已经覆盖了
JFrame
paint
方法。您应该重写
paintComponent
方法,并且应该在开头有一行

super.paintComponent();
这确保了
JFrame
的默认绘制方法是完整的,这样当您通过绘制不同的形状进行更改时,它可以反映在已绘制的
JFrame

对于显示
main
方法中的
JFrame
,您应该使用:

Frame f = new Frame();
f.setVisible(true);

为了使框架可见。

您在多个级别上犯了根本错误

看起来你在尝试生成某种“时钟”,我猜你在尝试绘制“分段”时钟,但我需要继续挖掘

  • 不要扩展JFrame,这是一个根本不好的起点,原因很多;您将自己锁定在一个用例中,
    JFrame
    有一个
    JRootPane
    contentPane
    ,可以在不需要先绘制框架的情况下进行绘制
  • 不要覆盖
    paint
    ,一般来说,这样做会导致无休止的问题,通常不鼓励这样做,通常最好使用
    JPanel
    JComponent
    并扩展覆盖其
    paintComponent
    方法。油漆是复杂的,你需要小心你做什么,看看和更多的细节
  • 您应该调用
    paint
    methods
    super
    方法,以确保不会破坏绘制过程
  • while循环
    对于尝试更新UI来说是一个糟糕的选择,相反,我建议使用Swing
    计时器
    ,请参阅以获取更多详细信息。
    计时器
    报告EDT内的滴答声,使处理Swing时使用更安全,它还将在计划重新绘制时为EDT和
    重新绘制管理器
    提供一些喘息空间
  • 重新绘制由
    repaitmanager
    控制,它可能会将重复的重新绘制请求合并为数量较少的事件,从而开始提示问题的原因
让我们面对现实吧,你只需要每秒更新一次,为了安全起见,我可能每半秒更新一次,但那就是我


对于你在多个层面上犯下的根本错误

看起来你在尝试生成某种“时钟”,我猜你在尝试绘制“分段”时钟,但我需要继续挖掘

  • 不要扩展JFrame,这是一个根本不好的起点,原因很多;您将自己锁定在一个用例中,
    JFrame
    有一个
    JRootPane
    contentPane
    ,可以在不需要先绘制框架的情况下进行绘制
  • 不要覆盖
    paint
    ,一般来说,这样做会导致无休止的问题,通常不鼓励这样做,通常最好使用
    JPanel
    JComponent
    并扩展覆盖其
    paintComponent
    方法。油漆是复杂的,你需要小心你做什么,看看和更多的细节
  • 您应该调用
    paint
    methods
    super
    方法,以确保不会破坏绘制过程
  • while循环
    对于尝试更新UI来说是一个糟糕的选择,相反,我建议使用Swing
    计时器
    ,请参阅以获取更多详细信息。
    计时器
    报告EDT内的滴答声,使处理Swing时使用更安全,它还将在计划重新绘制时为EDT和
    重新绘制管理器
    提供一些喘息空间
  • 重新绘制由
    重新绘制管理器
    控制,该管理器可将重复的重新绘制请求合并到数量较少的事件中,