Java:尝试在JApplet中重新绘制paintComponent()

Java:尝试在JApplet中重新绘制paintComponent(),java,swing,applet,paint,java-8,Java,Swing,Applet,Paint,Java 8,我有一个扩展了JPanel的类(从调用它重新绘制的位置来看,这个类目前没有多大意义,所以忽略它。我很高兴它能同时绘制任何东西): 以下是主类中的相关代码: public class AUIApplet3 extends JApplet { GamePanel gamePan; public void scheduleNumbers(int[] randomNumbers, int speed, int amount) { long initialDelay =

我有一个扩展了
JPanel
的类(从调用它重新绘制的位置来看,这个类目前没有多大意义,所以忽略它。我很高兴它能同时绘制任何东西):

以下是主类中的相关代码:

public class AUIApplet3 extends JApplet {
    GamePanel gamePan;

    public void scheduleNumbers(int[] randomNumbers, int speed, int amount) {
        long initialDelay = INITIAL_DELAY;
        final AtomicInteger curNumber = new AtomicInteger(-1);
        System.out.println(getNumbersAsString());

        final Runnable setNumber = () -> {
            currentNumberLab.setText(Integer.toString(randomNumbers[curNumber.incrementAndGet()]));
            System.out.println(randomNumbers[curNumber.get()]);
            gamePan.repaint();
        };

        setNumberService = scheduler.scheduleAtFixedRate(setNumber, initialDelay, speed, MILLISECONDS);

        endNumberService = scheduler.schedule(() -> {
            currentNumberLab.setText("");
            answerField.setEditable(true);
            checkAnswerBut.setEnabled(true);
            gameStatus = GameStatusEnum.WAITING;
            System.out.println("Finished in scheduleNumbers() lambda");
            setNumberService.cancel(true);
        }, ((speed * amount)+ initialDelay), MILLISECONDS);
    }
}
下面是和类的完整代码

当我在
Runnable
lambda inside
scheduleNumbers()
中调用
repaint()
时,我希望每次都在
gamePan
上绘制一些东西。然后最终展开
GamePanel
paintComponent()
,以便每次使用不同的值更新所绘制的内容,并且能够在用户赢得或输掉游戏时绘制图像

到目前为止,代码没有绘制任何内容。我不完全确定我是否正确地实现了
GamePanel

编辑(更新代码):

正在打印,但显示在错误的面板上,尽管在
feedbackPan
上调用了
repaint()

public void scheduleNumbers(int[] randomNumbers, int speed, int amount) {
    long initialDelay = INITIAL_DELAY;
    final AtomicInteger curNumber = new AtomicInteger(-1);
    System.out.println(getNumbersAsString());
    final Runnable setNumber = () -> {
        currentNumberLab.setText(Integer.toString(randomNumbers[curNumber.incrementAndGet()]));
        System.out.println(randomNumbers[curNumber.get()]);
        feedbackPan.repaint();
    };
    setNumberService = scheduler.scheduleAtFixedRate(setNumber, initialDelay, speed, MILLISECONDS);
    endNumberService = scheduler.schedule(() -> {
        currentNumberLab.setText("");
        answerField.setEditable(true);
        checkAnswerBut.setEnabled(true);
        gameStatus = GameStatusEnum.WAITING;
        System.out.println("Finished in scheduleNumbers() lambda");
        setNumberService.cancel(true);
    }, ((speed * amount)+ initialDelay), MILLISECONDS);
}

public class GamePanel extends JPanel {
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        drawCounter(g);
    }

    private void drawCounter(Graphics g) {
        System.out.println("test");
        g.drawRect(10,10,50,70);
        g.fillRect(10,10,50,70);
        g.drawString("Dia Dhuit", 10, 10);
    }
}


你怎么知道不是重印的?GamePanel做的不多……你似乎也违反了Swing的单线程规则。Swing不是线程安全的,您不应该在事件调度线程之外更新ui的任何部分是的,这没有帮助,因为paintComponent是组件的背景,您可以使用Swing计时器或SwingUtilities.invokeLater。一般来说,我会避免使用调度,而更喜欢使用Swing计时器,或者只使用Thread.sleep线程(只要您使用EDT同步更新)不,这是一个主要问题;)
public void scheduleNumbers(int[] randomNumbers, int speed, int amount) {
    long initialDelay = INITIAL_DELAY;
    final AtomicInteger curNumber = new AtomicInteger(-1);
    System.out.println(getNumbersAsString());
    final Runnable setNumber = () -> {
        currentNumberLab.setText(Integer.toString(randomNumbers[curNumber.incrementAndGet()]));
        System.out.println(randomNumbers[curNumber.get()]);
        feedbackPan.repaint();
    };
    setNumberService = scheduler.scheduleAtFixedRate(setNumber, initialDelay, speed, MILLISECONDS);
    endNumberService = scheduler.schedule(() -> {
        currentNumberLab.setText("");
        answerField.setEditable(true);
        checkAnswerBut.setEnabled(true);
        gameStatus = GameStatusEnum.WAITING;
        System.out.println("Finished in scheduleNumbers() lambda");
        setNumberService.cancel(true);
    }, ((speed * amount)+ initialDelay), MILLISECONDS);
}

public class GamePanel extends JPanel {
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        drawCounter(g);
    }

    private void drawCounter(Graphics g) {
        System.out.println("test");
        g.drawRect(10,10,50,70);
        g.fillRect(10,10,50,70);
        g.drawString("Dia Dhuit", 10, 10);
    }
}