当前位置: 首页 > 知识库问答 >
问题:

将值从按键导出到JAVA中的TextField

胡星汉
2023-03-14

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

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个答案

皇甫高阳
2023-03-14

我在类中使用了静态TextField,然后我只是将其添加到main方法中的框架中

    static TextField field = new TextField();

在键按

      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);
阎坚成
2023-03-14

有许多方法可以解决这个问题,包括在您的问题的评论中建议的方法,这些方法涉及正确连接GUI内容,以便在不需要做大量工作的情况下自动注意并填充更改。

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

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

然后,您实际上可以直接从keyPressed(...)更新它的文本,要么每次按下一个键(见下面的示例),要么你可以把它挤在任何可能更新它的键检查中。

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

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

它也可以在right()、↓()等方法中更新。然而,这两种方法都有点丑陋,既不推荐也不是正确的处理方式。

我不确定在Java中实现这一点的理想方式是什么,但一种简单的方式是运行某种常规的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) );
    }
}
 类似资料:
  • 我有一个<code>HashMap 有没有比排序HashMap更好的解决方案,然后使用 顺便说一句,我一开始并不一定要使用HashMap,但值设置了顺序,我不想交换键和值,因为浮点值可能会改变好几次。

  • 我试图将一个键的值链接到另一个键的值,但似乎无法使其工作。 例如,如果我创建一个哈希映射,我希望能够创建一个键值对,比如(“x”,0)。然后,我希望能够将另一个键值对值添加到第一个键值对中,因此,如果我有(“x”,map.get(“y”))和(“y”,0),我希望能够以某种方式将其链接起来,这样,如果我现在更新y,使其(“y”,10),map。得到(“x”);也应该返回10。 我不知道如何让这个工

  • 问题内容: 我正在尝试模拟输入到中的文本。我有一个1字符长的字符串,其中包含要添加的字母,然后运行: 但这似乎并没有改变任何内容。我在这里想念什么? 问题答案: 在我看来就像是虚拟键盘:-) 几乎完全相同的代码对我有用。我建议以下内容: 将目标(在您的情况下为)作为参数传递给构造函数,即: 确保目标有重点。 编辑: 为了验证以上建议,我测试了以下代码段: 这是行不通的,但是,如果对最后一行进行如下

  • 问题内容: 我有地图,我想要一个列表,其中按其对应的值对键(最小到最大)进行了排序。我的尝试是: 但这只是给我一个条目列表,如何在不丢失顺序的情况下获得类型列表? 问题答案: 您说要按值排序,但是您的代码中没有。传递一个lambda(或方法引用)来告诉它您想如何排序。 而您想获得钥匙;用于将条目转换为键。

  • 问题内容: 我正在尝试导出字体,以便您不必安装字体即可运行在Eclipse中运行的游戏,但无法导出该字体 文件夹结构如下: 我使用以下命令加载字体: 在eclipse中工作正常,但导出似乎未加载字体 编辑:jar文件中的结构: 问题答案: 将fonts文件夹放在您的源文件夹中,我相信这是问题所在: 在聊天中解决,最终代码:

  • 我有以下方式的地图列表: 我想从地址字段的值中获取地址值。例如, 我想从键值"AddressUsageType"中获取值"PRINCIPAL" 我尝试过使用过滤器和许多其他MAP函数,但最终没有找到合适的解决方案。 这是我的代码片段,获取第一个键值对的值: 以下是上述片段的输出: