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 insidescheduleNumbers()
中调用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);
}
}