Search code examples
javaswingvariablesjbuttonjtextfield

Make JButton insert text from JTextField into variables?


I'm trying to write a program that will take text in a JTextField and put it into variables I've declared when I press a JButton. I need to calculate weekly pay for a school project, but that only requires the console, I'm doing the GUI for my own fun. I'm trying to get it so when I hit 'calc' it'll take the imputs from id, rh, oh, hp, etc and calculate weekly pay (wp), which will then be printed on the right column next to the calc button.

//the calculations aren't complete yet until I finish the GUI

public class Weekly_Pay 
{

public static void calculations(String[] args) 
{

Scanner imput = new Scanner(System.in);

System.out.println("ID number: ");
int employeeId = imput.nextInt();

System.out.println("Hourly Wage: ");
Double hourlyWage = imput.nextDouble();

System.out.println("Regular Hours: ");
double regularHours = imput.nextDouble();

System.out.println("Overtime Hours: ");
double overtimeHours = imput.nextDouble();

double overtimePay = round(overtimeHours * (1.5 * hourlyWage));
double regularPay  = round(hourlyWage * regularHours);

double weeklyPay = regularPay + overtimePay;

System.out.println("Employee ID Number:" + employeeId);
System.out.printf("Weekly Pay: " + "$%.2f\n", weeklyPay);

}

public static double round(double num) 
{

// rounding to two decimal places
num *= 100;
int rounded = (int) Math.round(num);
return rounded/100.0;

}


public static void main(String[] args) 
{

JFrame window = new JFrame();
window.setTitle("Weekly Pay");
window.setSize(350, 200);
window.setResizable(false);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Color lGray = new Color(209, 209, 209);

JPanel panel = new JPanel();
GroupLayout layout = new GroupLayout(panel);
panel.setBackground(lGray);
panel.setLayout(layout);
layout.setAutoCreateGaps(true);
layout.setAutoCreateContainerGaps(true);

JTextField idEntry = new JTextField(); //where the user imputs their ID
JTextField hwEntry = new JTextField(); //where the user imputs their hourly wage
JTextField rhEntry = new JTextField(); //where the user imputs their regular hours
JTextField ohEntry = new JTextField(); //where the user imputs their overtime hours

JLabel id = new JLabel("ID Number");
JLabel hw = new JLabel("Hourly Wage");
JLabel rh = new JLabel("Regular Hours");
JLabel oh = new JLabel("Overtime Hours");
JButton calc = new JButton("Calculate");
JLabel wp = new JLabel(" Weekly Pay: $" + "$%.2f\n", weeklyPay);

GroupLayout.SequentialGroup hGroup = layout.createSequentialGroup();    
hGroup.addGroup(layout.createParallelGroup().
           addComponent(id).addComponent(hw).addComponent(rh).addComponent(oh).addComponent(calc));
hGroup.addGroup(layout.createParallelGroup().
  addComponent(idEntry).addComponent(hwEntry).addComponent(rhEntry).addComponent(ohEntry).addComponent(wp));
layout.setHorizontalGroup(hGroup);

GroupLayout.SequentialGroup vGroup = layout.createSequentialGroup();    
vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE).
    addComponent(id).addComponent(idEntry));
vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE).
    addComponent(hw).addComponent(hwEntry));
vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE).
    addComponent(rh).addComponent(rhEntry));
vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE).
    addComponent(oh).addComponent(ohEntry));
vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE).
    addComponent(calc).addComponent(wp));
layout.setVerticalGroup(vGroup);

window.add(panel);
window.setVisible(true);

}  
}

Solution

  • for example:

    String input = new String();         
    JButton mbutt = new JButton;
    JTextField jtxt = new JTextField();
    
    mbutt.addActionListener(new ActionListener(){
    
           public void actionPerformed(ActionEvent event){    
                 input = jtxt.getText().toString();
           }
     });
    

    ////////////////////////////////// Edited Part //////////////////////////////

    Now few things before i jump into the code.

    - I just wanted to show the working of ActionListener, and how to extract a data from a field and put it into a variable.

    - Its a bad practice to directly put the component on the JFrame, and thats exactly what i have done here (too bad of me..!!!), so You should always use something like a JPanel over the JFrame, and then place the component over it. In order to keep it Simple i have Deliberately use direct JFrame to hold the components.

    - And yes, Its always a very good practice to have the UI work on the UI thread, and Non-UI work on Non-UI thread.

    - In Swings main() method is Not long lived, after scheduling the construction of GUI in the Event Dispatcher Thread it exits... So now its the responsibility of EDT to handle the GUI, so you should keep the EDT for handling the GUI only, as i have done it in the main() method [EventQueue.invokeLater()].

    Full Code:

    import java.awt.BorderLayout;
    import java.awt.EventQueue;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JTextField;
    
    public class Tes extends JFrame {
    
        String input;
        JTextField jtxt; 
        JButton mbutt; 
    
    
        public Tes(){
    
     //--ALWAYS USE A JPANEL OVER JFRAME, I DID THIS TO KEEP IT SIMPLE FOR U--//
    
            this.setSize(400,400);
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            this.setComponent();
            this.setHandler();
        }
    
        public void setComponent(){
    
            jtxt =  new JTextField("Hello");
    
            mbutt = new JButton("Button"); 
    
            this.add(BorderLayout.SOUTH,mbutt);
    
            this.add(BorderLayout.NORTH,jtxt);
    
        }
    
        public void setHandler(){
    
            mbutt.addActionListener(new ActionListener() {
    
                @Override
                public void actionPerformed(ActionEvent arg0) {
    
                    input = jtxt.getText().toString();
    
                    System.out.println("Input Value: "+input);
    
              **//--See your Console Output everytime u press the button--//**
    
                }
            });
    
        }
        public static void main(String[] args){
    
    
             EventQueue.invokeLater(new Runnable(){
    
                @Override
                public void run() {
    
                    Tes t = new Tes();
                    t.setVisible(true);
    
                }
    
    
    
             });
        }
    
    }