我想知道如何将连续值导出到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();
}
}
}
我在类中使用了静态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);
有许多方法可以解决这个问题,包括在您的问题的评论中建议的方法,这些方法涉及正确连接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函数,但最终没有找到合适的解决方案。 这是我的代码片段,获取第一个键值对的值: 以下是上述片段的输出: