1

This is homework. Beginning Java class. Still wrapping my head around this stuff.

The project is to make an Inventory Management System.

I have everything figured out except how to make this button change the text in a JTextField. It needs to add info from an array of a product (DVD's in this case). The book talks about different ways to manage things like font, position and state of a JTextField but it does not cover formatting or calling a method for the text.

Here is an example of what I want to do using a JTextArea. This is essentially what I want to do with my JTextFields.

   ...
    // setup the interface    

 JPanel panel = new JPanel();
 txt = new JTextArea(15,40);
 txt.setEditable(false);//user shouldn't change it
 panel.add(txt);

 JButton next = new JButton("Next");

 panel.add(next);

 getContentPane().add(panel);

 displayDVD();
 }
 // view software
 public void displayDVD() {
       txt.setText("DVD Details:\n");
    txt.append("Item number: " + inv.get(currentDisplay).getItem() + "\n");
    txt.append("DVD name: " + inv.get(currentDisplay).getName() + "\n");
    txt.append("Units in stock: " + inv.get(currentDisplay).getUnits() + "\n");
    txt.append("Price: $" +                                              
       String.format("%.2f",inv.get(currentDisplay).getPrice()) + "\n");
    txt.append("Total value: $" +                             
       String.format("%.2f",inv.get(currentDisplay).value()) + "\n");
    txt.append("Fee: $" + String.format("%.2f",inv.get(currentDisplay).fee()) + "\n\n");

    txt.append("Total value: $" + String.format("%.2f",inv.value()));
 }

And here is my actual code so far

// GUI with navigation and file manipulation buttons
import javax.swing.*; // provides basic window features
import java.awt.event.*;
import java.awt.GridLayout;
import java.awt.BorderLayout;

public class AppGUI extends JFrame 
{
   private Inventory inv;    
 private int currentDisplay = 0; 

   private JPanel topButtonJPanel;
 private JButton topButtons[]; 

 private JPanel labelJPanel;
 private JLabel labels[]; 

 private JPanel fieldJPanel;
 private JTextField fields[];

   private JPanel buttonJPanel;
 private JButton buttons[]; 

   // LabelFrame constructor adds JLabels to JFrame
   public AppGUI()
   {
      super( "Inventory Program v.5" );
      setLayout( new BorderLayout() ); // set frame layout
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// quit if the window is closed

  // initialize values
  RatedDVD d1 = new RatedDVD(1, "The Invisible Man", 0, 4999.99, "PG");
  RatedDVD d2 = new RatedDVD(2, "The Matrix", 1, 13.01, "PG13");
  RatedDVD d3 = new RatedDVD(3, "Se7en", 7, 11.11, "R");
  RatedDVD d4 = new RatedDVD(4, "Oceans Eleven", 11, 9.02, "PG13");
  RatedDVD d5 = new RatedDVD(5, "Hitch Hikers Guide to the Galaxy", 42, 10.00, "G"); 

  // create inv and enter values
  inv = new Inventory();
  inv.add(d1);
  inv.add(d2);
  inv.add(d3);
  inv.add(d4);
  inv.add(d5);

  inv.sort();

  topButtons = new JButton[ 6 ]; // create topButtons array
  topButtonJPanel = new JPanel(); // set up panel
  topButtonJPanel.setLayout( new GridLayout( 1, topButtons.length, 2, 2 ) );
  topButtons[0] = new JButton( "Load file" );
  topButtons[1] = new JButton( "Add" );
  topButtons[2] = new JButton( "Modify" );
  topButtons[3] = new JButton( "Delete" );
  topButtons[4] = new JButton( "Search" );
  topButtons[5] = new JButton( "Save" );

  for(int count=0;count<topButtons.length;count++){topButtonJPanel.add(topButtons[count]);}
  //add( topButtonJPanel, BorderLayout.NORTH ); // this is for next weeks assignment

  labels = new JLabel[8];
  labelJPanel = new JPanel();
  labelJPanel.setLayout( new GridLayout( labels.length, 1 ));
  labels[0] = new JLabel( "Item ID" );
  labels[1] = new JLabel( "Name" );
  labels[2] = new JLabel( "Rating" );
  labels[3] = new JLabel( "# in Stock" );
  labels[4] = new JLabel( "Price" );
  labels[5] = new JLabel( "Restocking Fee" );//[DEBUG] ref actual Variable
  labels[6] = new JLabel( "Inventory Value with Fee (5%)" );
  labels[7] = new JLabel( "Total Value with Fee(for all items)" );

  for(int count=0;count<labels.length;count++){labelJPanel.add(labels[count]);}
  add( labelJPanel, BorderLayout.WEST );

  fields = new JTextField[8];
  fieldJPanel = new JPanel();
  int spaces = 28;
  fieldJPanel.setLayout( new GridLayout( labels.length, 1 ));
  fields[0] = new JTextField( "", spaces );
  fields[1] = new JTextField( "", spaces );
  fields[2] = new JTextField( "", spaces );
  fields[3] = new JTextField( "", spaces );
  fields[4] = new JTextField( "", spaces );
  fields[5] = new JTextField( "", spaces );
  fields[6] = new JTextField( "", spaces );
  fields[7] = new JTextField( "", spaces );

  for(int count=0;count<fields.length;count++)
  {
   fields[count].setEditable( false );
   fieldJPanel.add(fields[count]);
  }
  add( fieldJPanel, BorderLayout.EAST );

  buttons = new JButton[ 5 ]; // create buttons array
  buttonJPanel = new JPanel(); // set up panel
  buttonJPanel.setLayout( new GridLayout( 1, buttons.length, 2, 2 ) );
  buttons[0] = new JButton( "First" ); 
  buttons[0].addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent e) {
    if (currentDisplay != 0)currentDisplay = 0; //advance to the end
    }
   });
  buttons[1] = new JButton( "Prev" );
  buttons[1].addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent e) {
    if (currentDisplay != 0)currentDisplay--; //advance to the end
     else currentDisplay = (inv.size()-1); 
    }
   });
  Icon bug1 = new ImageIcon( getClass().getResource( "bug1.gif" ) );
  buttons[2] = new JButton( bug1 );
  buttons[3] = new JButton( "Next" );
  buttons[3].addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent e) {
    if (currentDisplay < inv.size()-1)currentDisplay++; //advance to the end
     else currentDisplay = 0;    stkover
   }}); 
  buttons[4] = new JButton( "Last" );
  buttons[4].addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent e) {
    if (currentDisplay != inv.size()-1)currentDisplay = inv.size()-1; //advance to the end
     else currentDisplay = (inv.size()-1); 
    }
   });

  for(int count=0;count<buttons.length;count++){buttonJPanel.add(buttons[count]);}
  add( buttonJPanel, BorderLayout.SOUTH );
 }// end method

}// end class AppGUI

Any hints tips or nudges appreciated. Don't do it all for me though please.

gooddadmike
  • 2,329
  • 4
  • 26
  • 48

3 Answers3

5

You add an action listener to the button (so that it will listen to the button action (click)). Then program that action to change the TextField value.

final JButton    aButton    = ...;
final JTextField aTextField = ...;
final String     aNewText   = "New TextField Value";

aButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        aTextField.setText(aNewText);
    }
});

Observe that variables accessed with in 'actionPerformed' must be final (except the fields).

Hope this helps.

NawaMan
  • 901
  • 5
  • 12
  • Ok so I need to change 8 JTextFields with each button. Next week (tomorrow) I will be working on a function to modify. How would I approach that? – gooddadmike Sep 06 '09 at 21:55
  • 2
    If you have more than one button acting similarly, they can share the same action listener. First make your AppGUI implements ActionListener and add a method call "public void actionPerformed(ActionEvent e)" to it. In the method, you can call e.getSource() (See http://java.sun.com/javase/6/docs/api/java/util/EventObject.html#getSource()) to see what button is the action originated and react accordingly. I suggest you to look at the tutorial for this for more info: http://java.sun.com/docs/books/tutorial/uiswing/components/button.html. Enjoy :D. – NawaMan Sep 06 '09 at 23:41
0

For a cross-reference like "my button changes my testbox", the idea is to give to the button (the controller, the code that will get activated when clicked) a reference to the textbox. So when the button is pressed, it can change the textbox.

They are many improvements possible, but that's the basic idea.

KLE
  • 23,689
  • 4
  • 56
  • 62
  • Your response confuses me. The wording I think. I know to give the button the code to control the JTextField. What I am asking is for the method or syntax to do it with like fields[i]setString(inv.get(currentDisplay).getItem()) or something – gooddadmike Sep 06 '09 at 21:52
-1

I guess I don't understand the question.

You know how to add multiple pieces of text to a single component.

txt.append("Item number: " + inv.get(currentDisplay).getItem() + "\n"); 
txt.append("DVD name: " + inv.get(currentDisplay).getName() + "\n");

So why it is so hard to add a single piece of text to multiple components?

itemTextField.setText( inv.get(currentDisplay).getItem() );
nameTextField.setText( inv.get(currentDisplay).getName() );
camickr
  • 321,443
  • 19
  • 166
  • 288