从keyPressed将值导出到JAVA中的TextField

时间:2018-01-16 21:13:22

标签: java swing jtextfield

我想知道如何将值连续导出到JFrame中的TextField,有一个正在移动的圆,我正在计算它的速度,我希望每次改变速度时都要在TextField中显示这个速度,但问题是我无法从(public void(keyPressed(KeyEvent e))获取值并将其带到main方法以在TextField中显示它(field.setText(Double.toString(velx) ));)enter image description here enter image description here

public class All extends JComponent implements ActionListener, KeyListener {


Timer t = new Timer(5, this);
double x=0 , y=0;
static double velx=0 ,vely=0;




public All() {
    t.start();
    addKeyListener(this);
    setFocusable(true);
    setFocusTraversalKeysEnabled(false);

}

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;


     g2.setStroke(new BasicStroke(10));
     g2.setColor(Color.red);
     g2.drawLine(10, 300, 1990, 300);
     g2.setColor(Color.blue);
     g2.fill(new Ellipse2D.Double(x,y,40,40));
     g2.setStroke(new BasicStroke(10));
     g2.setColor(Color.green);
     g2.drawRect(900, 500, 700,400);
 }

 public void up() {
    vely=vely-0.5;
    velx = 0;

 }
 public void down() {
    vely=vely+0.5;
    velx = 0;
}
public void left() {
velx=velx-0.5;
vely = 0;
 }
  public void right() {


velx=velx+0.5;
vely = 0;

 }
 public static void stop() {
 velx=0;
 vely=0;
 }




 public void keyPressed(KeyEvent e) {
 int code = e.getKeyCode();



if(code == KeyEvent.VK_UP) {
    up(); 
    if(x>900 && x<1577 && y>500 && y<860) {
 System.out.println("up: "+(-1*vely)+"/s");

    }
}




if(code == KeyEvent.VK_DOWN) {
down();
if(x>900 && x<1577 && y>500 && y<860) {
System.out.println("down: "+vely+"/s");
 }}




 if(code == KeyEvent.VK_RIGHT) {
     right(); 
     if((x<=1880 && x>=-7 && y>=262 && y<=288 ) || (x>900 && x<1577 && y>500 
    && y<860 )) {
      System.out.println("right: "+velx+"/s");
      }
   }



   if(code == KeyEvent.VK_LEFT) {
    left(); 
    if(x<=1880 && x>=-7 && y>=262 && y<=288 ||  (x>900 && x<1577 && y>500 && 
    y<860)) {
        System.out.println("left: "+(-1*velx)+"/s");}
}
 if(code == KeyEvent.VK_SPACE) {
    stop();
   }

    }

主要方法:

public static void main(String[] args) {

JLabel velocity = new JLabel("Velocity");
JLabel change = new JLabel("Change");
JFrame frame = new JFrame("APPLICATION");
Button button = new Button("Mode 2");


TextField field = new TextField();      



change.setBounds(30, 486, 150,50);
velocity.setBounds(30, 400, 150,50);
button.setBounds(150, 500, 150,30);    
field.setBounds(150, 415, 150,30);



velocity.setForeground(Color.white);        
velocity.setFont(new Font("sansserif",Font.PLAIN, 30));

change.setForeground(Color.white);
change.setFont(new Font("sansserif",Font.PLAIN, 30));


  button.setFont(new Font("serif",Font.PLAIN, 18));
  field.setFont(new Font("serif",Font.PLAIN, 18));   


    frame.setContentPane(new All());
    frame.setBackground(Color.BLACK);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setResizable(true);
    frame.pack();


     frame.add(field);
     frame.add(button);
     frame.add(velocity);
    frame.add(change);

    frame.setSize(800,600);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);




    field.setText(Double.toString(velx));




       button.addActionListener(new ActionListener(){  
            @Override
            public void actionPerformed(ActionEvent e){  
              if(e.getActionCommand()=="Mode 2"){
                  All2.main(args);
             frame.setVisible(false);
              stop();
              }
                      }  
                }); 
   }


 @Override
 public void keyReleased(KeyEvent e) {

 }

 @Override
 public void keyTyped(KeyEvent arg0) {
    // TODO Auto-generated method stub

 }

 @Override
 public void actionPerformed(ActionEvent arg0) {
    repaint();
    x += velx;
    y += vely;

    if(x>=1885) {
        x=1885;
        stop();
    }

 if(y>=1010) {
    y=1010;
    stop(); 
  }
  if(y>=372 && y<374 && x<300 ) {
    stop();up();

  }if(x<300 && (y>374 && y<524) ) {

     stop();right();
 }if( x<300 && y>=524 && y<526) {
     stop();down();
 }

if(x<=-7) {
    x=-7;
     stop();
 }
 if(y<=-5) {
    y=-5;
    stop();
 }

  }







 }

2 个答案:

答案 0 :(得分:0)

有很多种方法可以解决这个问题,包括在你的问题评论中建议的那些涉及正确挂钩GUI的内容,这样就可以自动注意更改并填充,而无需你做太多的工作。

快速而肮脏的解决方案是为该字段设置一个全局变量。

TextField yourTextField; // <-- global variable (initialized somewhere)

然后,您可以在每次按下某个键时直接从keyPressed(...)更新它的文本(请参阅下面的示例),或者您可以在任何可能更新它的键检查中将其挤出。

public void keyPressed(KeyEvent e) {
    // ... all the other stuff

    textField.setText( Double.toString(velx) );
}

它也可以在right(),left()等方法中更新。然而,这些方法中的任何一种都是丑陋的,既不推荐也不适当处理它。

我不确定理想这样做的方式是什么,但是一种方法就是运行某种常规的UI更新,检查你想要的所有字段UI显示。的值。

更新功能

void updateUI() {
    // ... whatever else needs doing

    if( !textField.getText().equals( Double.toString(velx) ) ) {
        textField.setText( Double.toString(velx) );
    }
}

然后在某个主程序中调用该函数。

void mainLoop() {
    updateUI()
}

另一个是调整你的功能,这样当你调整这些值时,你也会勾选一些会触发条件UI更新的框。

在更改特定变量的值时更改的全局(或其他范围)变量。

boolean velx_changed = false;

更改值并标记更新

velx++;
velx_changed = true;

主程序中发生的事情

void mainLoop() {
    if( velx_changed ) {
        textField.setText( Double.toString(velx) );
    }
}

答案 1 :(得分:-1)

谢谢你。我在课堂上使用了静态TextField然后我将它添加到主方法中的框架

    static TextField field = new TextField();

在keyPressed中

      if(code == KeyEvent.VK_RIGHT) {
       right();  field.setText(Double.toString(velx));
      if((x<=1880 && x>=-7 && y>=262 && y<=288 ) || (x>900 && x<1577 && y>500 
      && y<860 )) {
      System.out.println("right: "+velx+"/s");
      }
     }

主要方法

frame.add(field);