本文介绍了骑士之旅的GUI处理的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对骑士的旅游问题基本的GUI工作,我想利用用户输入的两个文本字段从用户的补(X,Y),然后在一个文本框我打印的,如果解决方案是posiible和在另一个我写的knight.My算法采用的路径工作正常,我有gui.i问题都给予了一些默认值(X,Y)的,我得到正确的输出。可是当我改变的价值(X,Y)的文本框,没有变化occurs.this是主文件,还有一个事件处理程序文件,低于it.Your帮助将真诚AP preciated.I我在处理2.2.1工作。这是输出屏幕怎么看起来像

主文件/ project.pde

  //需要G4P库
进口g4p_controls *。
的Maxim Maxim;
AudioPlayer球员;
INT X = -1;
诠释Y = -1;
串溶液=;
PImage IMG;
诠释计数= 0;公共无效设置(){
  尺寸(480,320,的Java2D);
  格言=新美心(本);
  玩家= maxim.loadFile(song.wav);
  player.setLooping(真);  IMG =的LoadImage(chess.jpg);  createGUI();
  customGUI();  //请在此处设置code}
INT T [] =新INT [25];
布尔访问[] [] =新布尔[5] [5];
检查INT [] [] =新INT [5] [5];
布尔B:
INT计数器= -1;
布尔移动(INT X,INT Y,INT M){
 布尔结果= FALSE;
   如果(X℃,|| X'GT = 5 ||Ÿ℃,|| Y'GT = 5 ||参观[X] [Y] ==真)
   {
        返回false;
   }    参观[X] [Y] =真;    如果(M == 24)
    {        参观[X] [Y] =真;        返回true;
    }
    其他
    {
      字符串xstring =将String.valueOf(x)的;
      字符串ystring =将String.valueOf(Y);
      溶液=溶液+ xstring +,+ ystring +;
        打印(X);
        打印(,);
        打印(Y);
        检查[X] [Y] =计数器+ 1;
        如果(移动(X + 2,Y + 1,M + 1)||移动(X + 2,Y-1,M + 1)
            ||移动(X-2,Y + 1,M + 1)||移动(X-2,Y-1,M + 1)
            ||移动(X + 1,Y + 1,M + 1)||移动(X + 1,Y-1,M + 1)
            ||移动(X-1,Y + 1,M + 1)||移动(X-1,Y-1,且m + 1)){
            打印(X);
            打印(,);
            打印(Y);
            //检查[X] [Y] = 1;
            返回true;            }
    返回false;
}
}
公共无效的draw(){
 计数器=计数器+ 1;
   背景(0,128,128);
   图像(IMG,0,0,480,320);
   player.play();
   textarea2.setText(溶液);
   串TXT1 = textfield1.getText();
   X =的Integer.parseInt(TXT1);   串TXT2 = textfield2.getText();
   Y =的Integer.parseInt(TXT2);
   打印(解决方案);
   如果(X GT; = 0&放大器;&放大器y与其所连接; = 0)
   {
     B =移动(X,Y,0);
     如果(二==假)
     {
       textarea1.setText(解决方案是不可能的,输入其它坐标);
     }
     如果(二==真)
     {
       textarea1.setText(恭喜你的解决方案是可能的);
     }
   }
   如果(计数%8 == 0)
   {
     延迟(1000);
     的println(柜);   }}
无效键pressed()
{
  如果(键== 13)
  {
    溶液=;
    打印(解决方案);
    textarea2.setText(溶液);
    串TXT1 = textfield1.getText();
   X =的Integer.parseInt(TXT1);   串TXT2 = textfield2.getText();
   Y =的Integer.parseInt(TXT2);
  }
    如果(X GT; = 0&放大器;&放大器y与其所连接; = 0)
   {
     B =移动(X,Y,0);
     如果(二==假)
     {
       textarea1.setText(解决方案是不可能的,输入其它坐标);
     }
     如果(二==真)
     {
       textarea1.setText(恭喜你的解决方案是可能的);
     }
   }
}//使用这个方法来添加其他语句
//自定义GUI控件
公共无效customGUI(){}

这是事件处理程序文件

  / * ==================================== =====================
 * ====警告===
 * ================================================= ========
 *在这个选项卡中的code已经从GUI形式产生
 *设计师和护理应修改此文件时服用。
 *仅添加/编辑code中的事件处理程序,即只有内
 *匹配的注释标记之间用线。例如 无效myBtnEvents(GButton按钮){// _ code_:按钮1:12356:
     //它是安全的,请在此输入您的活动code
 } // _ code_:按钮1:12356: *不要重新命名这个标签!
 * ================================================= ========
 * /公共无效TF1(GTextField源,GEVENT事件){// _ code_:textfield1的:418637:
  的println(textfield1的 - GTextField>> GEVENT+事件+@+米利斯());
} // _ code_:textfield1的:418637:公共无效TF2(GTextField源,GEVENT事件){// _ code_:文本字段2:859413:
  的println(文本字段2 - GTextField>> GEVENT+事件+@+米利斯());
} // _ code_:文本字段2:859413:公共无效TA1(GTextArea源,GEVENT事件){// _ code_:textarea1:252891:
  的println(textarea1 - GTextArea>> GEVENT+事件+@+米利斯());
} // _ code_:textarea1:252891:公共无效TA2(GTextArea源,GEVENT事件){// _ code_:textarea2:483845:
  的println(textarea2 - GTextArea>> GEVENT+事件+@+米利斯());
} // _ code_:textarea2:483845:公共无效slider1_change1(GSlider源,GEVENT事件){// _ code_:slider1:280049:
  的println(slider1 - GSlider>> GEVENT+事件+@+米利斯());
} // _ code_:slider1:280049:公共无效slider2_change1(GSlider源,GEVENT事件){// _ code_:slider2:362722:
  的println(slider2 - GSlider>> GEVENT+事件+@+米利斯());
} // _ code_:slider2:362722://创建所有的GUI控件。
//自动生成不编辑
公共无效createGUI(){
  G4P.messagesEnabled(假);
  G4P.setGlobalColorScheme(GCScheme.BLUE_SCHEME);
  G4P.setCursor(ARROW);
  如果(帧!= NULL)
    frame.setTitle(素描窗口);
  文本字段1 =新GTextField(这一点,210,32,160,30,G4P.SCROLLBARS_NONE);
  textfield1.setText(1);
  textfield1.setPromptText(输入的x Cordinate);
  textfield1.setOpaque(真);
  textfield1.addEventHandler(这一点,TF1);
  文本字段2 =新GTextField(这一点,204,96,160,30,G4P.SCROLLBARS_NONE);
  textfield2.setText(1);
  textfield2.setPromptText(输入y Cordinate);
  textfield2.setLocalColorScheme(GCScheme.PURPLE_SCHEME);
  textfield2.setOpaque(真);
  textfield2.addEventHandler(这一点,TF2);
  textarea1 =新GTextArea(这一点,53,196,160,80,G4P.SCROLLBARS_NONE);
  textarea1.setLocalColorScheme(GCScheme.GREEN_SCHEME);
  textarea1.setOpaque(真);
  textarea1.addEventHandler(这一点,TA1);
  textarea2 =新GTextArea(这一点,288,192,160,80,G4P.SCROLLBARS_NONE);
  textarea2.setLocalColorScheme(GCScheme.YELLOW_SCHEME);
  textarea2.setOpaque(真);
  textarea2.addEventHandler(这一点,TA2);
  slider1 =新GSlider(这一点,96,276,264,40,10.0);
  slider1.setLimits(0.5,0.0,1.0);
  slider1.setNumberFormat(G4P.DECIMAL,2);
  slider1.setOpaque(假);
  slider1.addEventHandler(这一点,slider1_change1);
  slider2 =新GSlider(这一点,348,240,100,36,10.0);
  slider2.setLimits(0.5,0.0,1.0);
  slider2.setNumberFormat(G4P.DECIMAL,2);
  slider2.setOpaque(假);
  slider2.addEventHandler(这一点,slider2_change1);
}//变量声明
//自动生成不编辑
GTextField textfield1的;
GTextField文本字段2;
GTextArea textarea1;
GTextArea textarea2;
GSlider slider1;
GSlider slider2;


解决方案

有一些问题与上述结构。
你在递归移动()方法来绘制()方法。但在的处理画()被称为在每个很多次的动画线程

对于这样的情况一般是德兴:


  • 您应该有一个变量保持应用程序的状态(逻辑状态)

  • 你的画()方法借鉴了国家仅依赖

  • 状态可修改按动画线程或任何其他线程

我建议改变你的code一点:

首先 - 状态变量:

  // 1  - 显示状态,等待输入值
// 2 - 检查是否x和y是正确的
// 3 - 解决问题
INT状态= 1;
布尔solutionExists = FALSE;公共无效设置(){
...
}

接下来的draw()方法:

 无效平局(){   计数器=计数器+ 1;
   背景(0,128,128);   串COORDS =(+ X +,+ Y +);  如果(状态== 1){
     如果(solutionExists){
       textarea1.setText(恭喜你的解决方案是可能的+ COORDS);
     }其他{
       textarea1.setText(解决方案是不可能的,进入其它坐标+ COORDS);
     }     返回;
  }  如果(状态== 2){
    readXY();
    返回;
  }  如果(状态== 3){
    的println(找到的解决方案:+ COORDS);
    solutionExists =移动(X,Y,0);
    状态= 1;
    返回;
  }}公共无效readXY(){
  尝试{
   X =的Integer.parseInt(textfield1.getText()修剪());
   Y =的Integer.parseInt(textfield2.getText()修剪());
   状态= 3;
  }赶上(例外五){
    状态= 1;
  }}

和最后文本框处理程序:

 公共无效TF1(GTextField源,GEVENT事件){
  如果(event.getType()。等于(LOST_FOCUS)){
    状态= 2;
  }
}公共无效TF2(GTextField源,GEVENT事件){
  如果(event.getType()。等于(LOST_FOCUS)){
    状态= 2;
  }
}

正如你所看到的:


  • 如果状态== 1 - 平局()只更新信息

  • 如果状态== 2 - 平局()检查,如果x和y都有效,如果有效 - >更改状态,以3

  • 如果状态== 3 - 平局()执行递归算法中,更新solutionExists变量,更改状态,以1

任何时候,当你textfield1的或文字栏松动的焦点,它的变化状态,以2


  • 平局()只由应用程序状态驱动。

  • 应用程序状态被其他事件修改。

为了达到最佳效果,递归算法中,应在另一个线程performat,而不是在动画线程。

在一个晴朗的注意:当您编辑文本框它可能包含字符串,如(空)或3(前导空格)或3等等 - 这样的文本不能与解析的Integer.parseInt - 你需要修剪这样的文本,并确保NumberFormatException异常不抛出 - 看 readXY()方法。

I am working on a knight's tour problem with basic gui,i want to take user input in the two text fields which make up the (x,y) from user and then in one text box i print if solution is posiible and in the other i write the path adopted by the knight.My algorithm works fine and i have problem in gui.i have given a few default values to (x,y) for that i get correct output .But when i change the value of (x,y) in the textfield,no change occurs.this is the main file ,there is another event handler file,which is below it.Your help will be sincerely appreciated.I am working on processing 2.2.1.This is how the output screen looks like

Main file/project.pde

// Need G4P library
import g4p_controls.*;
Maxim maxim;
AudioPlayer player;
int x=-1;
int y=-1;
String solution="";
PImage img;
int count=0;

public void setup(){
  size(480, 320, JAVA2D);
  maxim=new Maxim(this);
  player=maxim.loadFile("song.wav");
  player.setLooping(true);

  img=loadImage("chess.jpg");

  createGUI();
  customGUI();

  // Place your setup code here

}
int t[]=new int[25];
boolean visited[][]=new boolean[5][5];
int check[][]=new int[5][5];
boolean b;
int counter=-1;
boolean move(int x,int y , int m){
 boolean result=false;
   if (x<0 || x>=5 || y<0 || y>=5 || visited[x][y]==true)
   {
        return false;
   }

    visited[x][y]=true;

    if (m==24)
    {

        visited[x][y]=true;

        return true;
    }
    else
    {
      String xstring=String.valueOf(x);
      String ystring=String.valueOf(y);
      solution=solution+xstring+","+ystring+"  ";
        print (x);
        print(",");
        print(y);
        check[x][y]=counter+1;
        if (move(x+2,y+1,m+1) || move(x+2,y-1,m+1)
            || move(x-2,y+1,m+1) || move(x-2,y-1,m+1)
            || move(x+1,y+1,m+1) || move(x+1,y-1,m+1)
            || move(x-1,y+1,m+1) || move(x-1,y-1,m+1)){
            print (x);
            print(",");
            print(y);
            //check[x][y]=1;
            return true;

            }


    return false;


}
}


public void draw(){
 counter=counter+1;
   background(0,128,128);
   image(img,0,0,480,320);
   player.play();
   textarea2.setText(solution);


   String txt1 = textfield1.getText();
   x = Integer.parseInt(txt1);

   String txt2 = textfield2.getText();
   y= Integer.parseInt(txt2);
   print(solution);
   if(x>=0 && y>=0)
   {
     b=move(x,y,0);


     if(b==false)
     {
       textarea1.setText("Solution is not possible,enter other coordinates");
     }
     if(b==true)
     {
       textarea1.setText("Congratulations solution is possible");
     }
   }
   if(count%8==0)
   {
     delay(1000);
     println(counter);

   }

}
void keyPressed()
{
  if (key==13)
  {
    solution="";
    print(solution);
    textarea2.setText(solution);
    String txt1 = textfield1.getText();
   x = Integer.parseInt(txt1);

   String txt2 = textfield2.getText();
   y= Integer.parseInt(txt2);
  }
    if(x>=0 && y>=0)
   {
     b=move(x,y,0);


     if(b==false)
     {
       textarea1.setText("Solution is not possible,enter other coordinates");
     }
     if(b==true)
     {
       textarea1.setText("Congratulations solution is possible");
     }
   }
}

// Use this method to add additional statements
// to customise the GUI controls
public void customGUI(){

}

this is the event handlers file

/* =========================================================
 * ====                   WARNING                        ===
 * =========================================================
 * The code in this tab has been generated from the GUI form
 * designer and care should be taken when editing this file.
 * Only add/edit code inside the event handlers i.e. only
 * use lines between the matching comment tags. e.g.

 void myBtnEvents(GButton button) { //_CODE_:button1:12356:
     // It is safe to enter your event code here
 } //_CODE_:button1:12356:

 * Do not rename this tab!
 * =========================================================
 */

public void tf1(GTextField source, GEvent event) { //_CODE_:textfield1:418637:
  println("textfield1 - GTextField >> GEvent." + event + " @ " + millis());
} //_CODE_:textfield1:418637:

public void tf2(GTextField source, GEvent event) { //_CODE_:textfield2:859413:
  println("textfield2 - GTextField >> GEvent." + event + " @ " + millis());
} //_CODE_:textfield2:859413:

public void ta1(GTextArea source, GEvent event) { //_CODE_:textarea1:252891:
  println("textarea1 - GTextArea >> GEvent." + event + " @ " + millis());
} //_CODE_:textarea1:252891:

public void ta2(GTextArea source, GEvent event) { //_CODE_:textarea2:483845:
  println("textarea2 - GTextArea >> GEvent." + event + " @ " + millis());
} //_CODE_:textarea2:483845:

public void slider1_change1(GSlider source, GEvent event) { //_CODE_:slider1:280049:
  println("slider1 - GSlider >> GEvent." + event + " @ " + millis());
} //_CODE_:slider1:280049:

public void slider2_change1(GSlider source, GEvent event) { //_CODE_:slider2:362722:
  println("slider2 - GSlider >> GEvent." + event + " @ " + millis());
} //_CODE_:slider2:362722:



// Create all the GUI controls.
// autogenerated do not edit
public void createGUI(){
  G4P.messagesEnabled(false);
  G4P.setGlobalColorScheme(GCScheme.BLUE_SCHEME);
  G4P.setCursor(ARROW);
  if(frame != null)
    frame.setTitle("Sketch Window");
  textfield1 = new GTextField(this, 210, 32, 160, 30, G4P.SCROLLBARS_NONE);
  textfield1.setText("1");
  textfield1.setPromptText("Enter x-Cordinate");
  textfield1.setOpaque(true);
  textfield1.addEventHandler(this, "tf1");
  textfield2 = new GTextField(this, 204, 96, 160, 30, G4P.SCROLLBARS_NONE);
  textfield2.setText("1");
  textfield2.setPromptText("Enter y Cordinate");
  textfield2.setLocalColorScheme(GCScheme.PURPLE_SCHEME);
  textfield2.setOpaque(true);
  textfield2.addEventHandler(this, "tf2");
  textarea1 = new GTextArea(this, 53, 196, 160, 80, G4P.SCROLLBARS_NONE);
  textarea1.setLocalColorScheme(GCScheme.GREEN_SCHEME);
  textarea1.setOpaque(true);
  textarea1.addEventHandler(this, "ta1");
  textarea2 = new GTextArea(this, 288, 192, 160, 80, G4P.SCROLLBARS_NONE);
  textarea2.setLocalColorScheme(GCScheme.YELLOW_SCHEME);
  textarea2.setOpaque(true);
  textarea2.addEventHandler(this, "ta2");
  slider1 = new GSlider(this, 96, 276, 264, 40, 10.0);
  slider1.setLimits(0.5, 0.0, 1.0);
  slider1.setNumberFormat(G4P.DECIMAL, 2);
  slider1.setOpaque(false);
  slider1.addEventHandler(this, "slider1_change1");
  slider2 = new GSlider(this, 348, 240, 100, 36, 10.0);
  slider2.setLimits(0.5, 0.0, 1.0);
  slider2.setNumberFormat(G4P.DECIMAL, 2);
  slider2.setOpaque(false);
  slider2.addEventHandler(this, "slider2_change1");
}

// Variable declarations
// autogenerated do not edit
GTextField textfield1;
GTextField textfield2;
GTextArea textarea1;
GTextArea textarea2;
GSlider slider1;
GSlider slider2;
解决方案

There are some problems with above constructions.You do recursive move() method inside draw() method. But in Processing draw() is called many times in each second by animation thread.

Common desing for such cases is:

  • you should have variables that hold application state (logical state)
  • what your draw() method draws depends only on state
  • state may be modified by animation thread or by any other thread

I suggest changing your code a little:

First - state variables:

// 1 - display status, wait to enter values
// 2 - check if x and y are correct
// 3 - solve problem
int state=1;
boolean solutionExists=false;

public void setup() {
...
}

next draw() method:

void draw() {

   counter=counter+1;
   background(0,128,128);

   String coords = "(" + x + "," + y + ")";

  if (state == 1) {
     if(solutionExists) {
       textarea1.setText("Congratulations solution is possible  " + coords);
     } else {
       textarea1.setText("Solution is not possible,enter other coordinates  " +coords);
     }

     return;
  }

  if (state == 2) {
    readXY();
    return;
  }

  if (state == 3) {
    println("find solution for: " + coords);
    solutionExists = move(x,y,0);
    state = 1;
    return;
  }

}

public void readXY() {
  try {
   x = Integer.parseInt(textfield1.getText().trim());
   y = Integer.parseInt(textfield2.getText().trim());
   state = 3;
  } catch(Exception e) {
    state = 1;
  }

}

and finally textfields handlers:

public void tf1(GTextField source, GEvent event) {
  if (event.getType().equals("LOST_FOCUS")) {
    state=2;
  }
}

public void tf2(GTextField source, GEvent event) {
  if (event.getType().equals("LOST_FOCUS")) {
    state=2;
  }
}

As you can see:

  • if state==1 - draw() only updates message
  • if state==2 - draw() checks if x and y are valid, if valid -> change state to 3
  • if state==3 - draw() performs recursive algo, update solutionExists variable, change state to 1

Anytime when your textfield1 or textfield2 loose focus, it changes state to 2.

  • draw() is driven only by application state.
  • application state is modified by other events.

For best results, recursive algo should be performat in another thread, not in animation thread.

One fine note: when you edit textfield it may contains string such as "" (empty) or " 3" (leading space) or " 3 " etc - such text cannot be parsed with Integer.parseInt - you need to trim such text and be sure that NumberFormatException is not thrown - see readXY() method.

这篇关于骑士之旅的GUI处理的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-05 05:43