Java 调用了重新绘制方法,但paintComponent不调用';跑不动
我正在尝试制作一个游戏,让文本一次显示一个角色,就像大多数RPG游戏一样。我在for循环底部附近调用repaint(),但它一直运行到for循环的最后一次迭代。这是全班同学。我正在使用displayMessage方法。请帮忙。 多谢各位Java 调用了重新绘制方法,但paintComponent不调用';跑不动,java,jpanel,paintcomponent,repaint,Java,Jpanel,Paintcomponent,Repaint,我正在尝试制作一个游戏,让文本一次显示一个角色,就像大多数RPG游戏一样。我在for循环底部附近调用repaint(),但它一直运行到for循环的最后一次迭代。这是全班同学。我正在使用displayMessage方法。请帮忙。 多谢各位 private class BattleTextArea extends JPanel{ private String atk1; private String atk2; private String atk3; pr
private class BattleTextArea extends JPanel{
private String atk1;
private String atk2;
private String atk3;
private String atk4;
private String messageWords;
private boolean messageDisplayed;
private boolean finishedMessage;
private int xSpot;
private String charAt;
public BattleTextArea(){
setAtk1("1");
setAtk2("2");
setAtk3("3");
setAtk4("4");
}
public void updateText(Pokemon poke){
setAtk1(poke.attacks.get(0).getName());
setAtk2(poke.attacks.get(1).getName());
setAtk3(poke.attacks.get(2).getName());
setAtk4(poke.attacks.get(3).getName());
repaint();
}
public void paintComponent(Graphics g){
System.out.println("begining of paint");
g.setColor(Color.WHITE);
g.fillRect(0, 0, 500, 225);
g.setColor(Color.BLACK);
g.drawRoundRect(0, 0, 489, 94, 10, 10);
if(!isMessageDisplayed()){
if(!isAttacksSelected()){
g.drawString("Fight", 325, 30);
g.drawString("Bag", 425, 30);
g.drawString("Party", 325, 75);
g.drawString("Run", 425, 75);
}else{
g.drawString(getAtk1() , 50, 30);
g.drawString(getAtk2(), 150, 30);
g.drawString(getAtk3(), 50, 75);
g.drawString(getAtk4(), 150, 75);
}
if(getSelectedButton() == 1){
g.drawRect(320, 15, 42, 22);
}else if(getSelectedButton() == 2){
g.drawRect(418, 15, 42, 22);
}else if(getSelectedButton() == 3){
g.drawRect(320, 60, 42, 22);
}else if(getSelectedButton() == 4){
g.drawRect(418, 60, 42, 22);
}
if(getSelectedButton() == 11){
g.drawRect(45, 15, 50, 22);
}else if(getSelectedButton() == 12){
g.drawRect(145, 15, 50, 22);
}else if(getSelectedButton() == 13){
g.drawRect(45, 60, 50, 22);
}else if(getSelectedButton() == 14){
g.drawRect(145, 60, 50, 22);
}
}else{
//Display message
/*int x = 20;
g.drawString(getMessageWords().substring(0, 1), 20,20);
for (int i = 1; i <= getMessageWords().length(); i++) {
try {
Thread.sleep(1000);//1000 milliseconds is one second.
} catch(InterruptedException ex) {
Thread.currentThread().interrupt();
}
System.out.println("in for");
JComponent c = bta;
FontMetrics fm = c.getFontMetrics(c.getFont()); // or another font\
if(i != getMessageWords().length())
x += fm.stringWidth(getMessageWords().substring(i, i + 1));
else
x += fm.stringWidth(getMessageWords().substring(i));
if(i != getMessageWords().length())
g.drawString(getMessageWords().substring(i, i + 1), x,20);
else
g.drawString(getMessageWords().substring(i), x, 20);
}//for*/
//setFinishedMessage(true);
System.out.println("in paint");
System.out.println(getCharAt());
//System.out.println(getMessageWords().length());
g.drawString(getCharAt(), getXSpot(), 20);
System.out.println("in if");
}
}//paint comp
public void displayMessage(String message){
//setMessageWords(message);
setMessageDisplayed(true);
JComponent c = bta;
FontMetrics fm = c.getFontMetrics(c.getFont());
for(int i = 0; i < message.length(); i++){
setCharAt(message.substring(i, i + 1));
System.out.println("before if");
System.out.println(fm.stringWidth(getCharAt()));
System.out.println(getXSpot());
setXSpot(getXSpot() + fm.stringWidth(getCharAt()));
System.out.println(getXSpot());
System.out.println("right before paint");
repaint();
System.out.println("right after paint");
try {
Thread.sleep(1000);//1000 milliseconds is one second.
} catch(InterruptedException e) {
Thread.currentThread().interrupt();
e.printStackTrace();
}
}//for
setFinishedMessage(true);
}
public String getAtk1() {
return atk1;
}
public void setAtk1(String atk1) {
this.atk1 = atk1;
}
public String getAtk2() {
return atk2;
}
public void setAtk2(String atk2) {
this.atk2 = atk2;
}
public String getAtk3() {
return atk3;
}
public void setAtk3(String atk3) {
this.atk3 = atk3;
}
public String getAtk4() {
return atk4;
}
public void setAtk4(String atk4) {
this.atk4 = atk4;
}
public boolean isMessageDisplayed() {
return messageDisplayed;
}
public void setMessageDisplayed(boolean messageDisplayed) {
this.messageDisplayed = messageDisplayed;
}
public String getMessageWords() {
return messageWords;
}
public void setMessageWords(String messageWords) {
this.messageWords = messageWords;
}
public boolean isFinishedMessage() {
return finishedMessage;
}
public void setFinishedMessage(boolean finishedMessage) {
this.finishedMessage = finishedMessage;
}
public int getXSpot() {
return xSpot;
}
public void setXSpot(int x) {
this.xSpot = x;
}
public String getCharAt() {
return charAt;
}
public void setCharAt(String charAt) {
this.charAt = charAt;
}
}//bta class
private-class-BattleTextArea扩展了JPanel{
私有字符串atk1;
私有字符串atk2;
专用字符串atk3;
专用字符串atk4;
私有字符串;
显示私有布尔信息;
私有布尔完成消息;
私有int-xSpot;
私有字符串字符;
公共战场(){
setAtk1(“1”);
setAtk2(“2”);
setAtk3(“3”);
setAtk4(“4”);
}
公共void updateText(口袋妖怪poke){
setAtk1(poke.attacks.get(0.getName());
setAtk2(poke.attacks.get(1.getName());
setAtk3(poke.attacks.get(2.getName());
setAtk4(poke.attacks.get(3.getName());
重新油漆();
}
公共组件(图形g){
System.out.println(“油漆开始”);
g、 setColor(Color.WHITE);
g、 fillRect(0,0500225);
g、 设置颜色(颜色为黑色);
g、 drawRoundRect(0,0489,94,10,10);
如果(!isMessageDisplayed()){
如果(!isAttacksSelected()){
g、 抽绳(“战斗”,325,30);
g、 抽绳(“袋子”,425,30);
g、 抽绳(“一方”,325、75);
g、 抽绳(“运行”,425,75);
}否则{
g、 抽绳(getAtk1(),50,30);
g、 抽绳(getAtk2(),150,30);
g、 抽绳(getAtk3(),50,75);
g、 抽绳(getAtk4(),150,75);
}
如果(getSelectedButton()==1){
g、 drawRect(320,15,42,22);
}else if(getSelectedButton()==2){
g、 drawRect(418,15,42,22);
}else if(getSelectedButton()==3){
g、 drawRect(320,60,42,22);
}else if(getSelectedButton()==4){
g、 drawRect(418,60,42,22);
}
如果(getSelectedButton()==11){
g、 drawRect(45,15,50,22);
}else if(getSelectedButton()==12){
g、 drawRect(145,15,50,22);
}else if(getSelectedButton()==13){
g、 drawRect(45,60,50,22);
}else if(getSelectedButton()==14){
g、 drawRect(145,60,50,22);
}
}否则{
//显示消息
/*int x=20;
g、 抽绳(getMessageWords().substring(0,1),20,20);
对于(inti=1;我在这里看一下我的答案:。你不应该把线程。sleep
放在paintComponent
里面(或者放在UI线程的任何地方),它冻结了用户界面。请改用计时器。@Radiodef好的,谢谢,让计时器调用repaint并更改actionPreformed中绘制的角色?我评论说,将Thread.sleep放在画图中,它只在displayMessage方法中。我不确定这是否会让你感到困惑。是的,听起来不错。可以找到另一个动画示例回复:还有更多的链接。