简体   繁体   中英

JTextField is read before it is given an input

I made a simple try to make a Shop Billing app. Everything is good for now but I am now stuck with a problem. The original source code would be too big and thus could be confusing. So I made an example code to describe my problem. Here is the code.

package experiement;

import java.awt.Container; 
import java.awt.event.ActionEvent;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.JLabel;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.awt.event.KeyListener;

public class Experiment extends JFrame implements ActionListener,KeyListener    {

ArrayList<JTextField> fruitsindex;
ArrayList<JLabel>fruits;
int serial =0;
public Experiment(){
fruitsindex=new ArrayList<JTextField>();        
fruits=new ArrayList<JLabel>(); 
addKeyListener(this);
fruits.add(new JLabel("Apple"));
fruits.add(new JLabel("Orange"));
fruits.add(new JLabel("Mango"));
fruits.add(new JLabel("Pomegranate"));
fruits.add(new JLabel("Guava"));
fruits.add(new JLabel("Papapya"));
fruits.add(new JLabel("Banana"));

setSize(800,800);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
Experiment e=new Experiment();        
}

@Override
public void actionPerformed(ActionEvent e) {}

@Override
public void keyTyped(KeyEvent e) {}

@Override
public void keyPressed(KeyEvent e) {
   int c=e.getKeyCode();
   switch(c){
       case KeyEvent.VK_ENTER:
       fruitsindex.add(new JTextField(15));
       for(int i=0;i<fruitsindex.size();i++){
       fruitsindex.get(i).setBounds(30,20*i,50,25);
       getContentPane().add(fruitsindex.get(i));
       }
       getContentPane().repaint();
       break;
   }
}
@Override
public void keyReleased(KeyEvent e){}
}

So when I press the Enter key, a new JTextField is created where I can enter the index of the fruits ArrayList. But I want to create JLabel displaying the fruit's name corresponding to the index typed in the JTextField . Is there any way to do this task?

See the following and ask for clarifications as needed :

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class Experiment extends JFrame {

    ArrayList<JTextField> fruitsindex;
    ArrayList<String>fruits; //use to keep fruit name
    int serial =0;

    private JTextField userInput;
    private JLabel fruitName;

    public Experiment(){

        fruits=new ArrayList<String>();
        fruits.add("Apple");
        fruits.add("Orange");
        fruits.add("Mango");
        fruits.add("Pomegranate");
        fruits.add("Guava");
        fruits.add("Papapya");
        fruits.add("Banana");

        //initialize user input JtextFiield
        userInput = new JTextField(2);
        userInput.setPreferredSize(new Dimension(15,40));
        userInput.setToolTipText("Enter fruit index (0-6)");
        //add key listener
        userInput.addKeyListener(new KeyListener() {

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

            @Override
            public void keyReleased(KeyEvent e) {
                // TODO Auto-generated method stub
            }

            @Override
            public void keyPressed(KeyEvent e) {
                int c=e.getKeyCode();
                if(c == KeyEvent.VK_ENTER) {
                    processInput();
                }
            }

        });
        add(userInput, BorderLayout.WEST);

        //initialize fruit name label
        fruitName = new JLabel("Enter fruit index");
        fruitName.setPreferredSize(new Dimension(140,40));
        add(fruitName, BorderLayout.EAST);

        pack();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

    private void processInput() {

        //error msg will be over written if input is valid 
        fruitName.setText("Wrong input");

        try {
            String inputString = userInput.getText();
            int inputInt = Integer.valueOf(inputString);
            if((inputInt >=0) && (inputInt < fruits.size())) {

                fruitName.setText(fruits.get(inputInt));
                userInput.setText(""); //clear input

            }
        } catch (NumberFormatException ex) {
            ex.printStackTrace();
        }

        repaint();
    }

    public static void main(String[] args) {
        //no need to keep a reference if you don't use it
        //Experiment e=
        new Experiment();
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM