how to optimize this game loop

Hi there!
I’m starting a Quix clone based on kevglass source of one of his 4k games. How can I optimize the loop on the constructor below? Also the line should increase while I keep a directional key pressed but it is not working right. For example, if i keep pressing UP key the line increases and after a while it decrease to a single point again as if I have released the UP key (and I didn’t).
Tks


import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.image.BufferStrategy;

import javax.swing.JFrame;

/*
 * Created on 28/01/2005
 */

public class Q extends JFrame {

    private int px;

    private int py;
    
    private int oldPx;
    private int oldPy;

    private boolean started;

    private boolean gameOver;

    private int[] keys = new int[] { KeyEvent.VK_LEFT, KeyEvent.VK_RIGHT,
            KeyEvent.VK_UP, KeyEvent.VK_DOWN};

    private boolean[] controls = new boolean[4];

    private Q() {
        super("Quix");
        super.setSize(400, 400);
        super.setResizable(false);
        super.show();
        super.createBufferStrategy(2);
        BufferStrategy strategy = getBufferStrategy();
        this.init();
        long lastLoopTime = System.currentTimeMillis();
        while (true) {
            int delta = (int) (System.currentTimeMillis() - lastLoopTime);
            logic(delta);

            lastLoopTime = System.currentTimeMillis();
            this.render(strategy.getDrawGraphics());
            strategy.show();
            try {
                Thread.sleep(1);
                
            } catch(InterruptedException e) {
            }
        }
    }

    private void init() {
        this.started = true;
        this.gameOver = false;
        this.px = 200;
        this.py = 370;
    }

    private void logic(int delta) {
        if(!this.started) {
            return;
        }
        if(this.controls[2]) {
            this.py -= delta * 0.1;
        } 
        else if(this.controls[3]) {
            this.py += delta * 0.1;
        }
        else if(this.controls[0]) {
            this.px -= delta * 0.1;
        }
        else if(this.controls[1]) {
            this.px += delta * 0.1;
        } else {
            this.oldPx = this.px;
            this.oldPy = this.py;
        }
    }

    private void render(Graphics g) {
        // Clear screen.
        g.setColor(Color.black);
        g.fillRect(0, 0, 400, 400);

        g.setFont(g.getFont().deriveFont(Font.BOLD, 20.0f));
        if (!started) {
            g.setColor(Color.red);
            g.drawString("Quix", 90, 100);
            g.drawString("4k Game", 80, 120);
            g.setColor(Color.white);
            g.drawString("Press Space", 65, 150);
            return;
        }
        
        g.setColor(Color.blue);
        g.drawRect(20,30,360,350);
        
        g.setColor(Color.red);
        g.drawLine(this.px,this.py,this.oldPx,this.oldPy);

    }

    protected void processKeyEvent(KeyEvent e) {
        for (int i = 0; i < keys.length; i++) {
            if (e.getKeyCode() == keys[i]) {
                controls[i] = e.getID() == KeyEvent.KEY_PRESSED;
            }
        }
        
        if (e.getKeyCode() == 27) {
            System.exit(0);
        } else if (e.getKeyCode() == 32) {
            started = true;
            if (this.gameOver) {
                this.init();
            }
        }
    }

    public static void main(String[] args) {
        new Q();
    }
}