尝试使用按钮更改JTextFields

时间:2013-03-10 21:22:20

标签: java swing

我试图在点击下一个按钮后获取下一组值以显示在JTextFields中。我是编程新手,所以我不确定我错过了什么。我想要发生的是当我在窗口显示时点击下一个按钮时,下一组值现在将显示在相应的JTextField中,不幸的是,最终发生的事情是什么都没有。我已经尝试了几种不同的方法来实现这一点,到目前为止还没有。我知道它不是自己的按钮,因为如果我改变actionPerformed旁边说setTitle(“5000”)它将改变窗口内的标题。任何帮助表示赞赏。

import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.*;
import java.util.Arrays;
import javax.swing.*;
import java.awt.*;



public class GUI extends JFrame implements ActionListener {
    JButton next;
    JButton previous;
    JButton first;
    JButton last;

    private JLabel itmNum = new JLabel("Item Number: ", SwingConstants.RIGHT);
    private JTextField itemNumber;
    private JLabel proNm = new JLabel ("Product Name: ", SwingConstants.RIGHT);
    private JTextField prodName;
    private JLabel yr = new JLabel("Year Made: ", SwingConstants.RIGHT);
    private JTextField year;
    private JLabel unNum = new JLabel("Unit Number: ", SwingConstants.RIGHT);
    private JTextField unitNumber;
    private JLabel prodPrice = new JLabel("Product Price: ", SwingConstants.RIGHT);
    private JTextField price;
    private JLabel restkFee = new JLabel("Restocking Fee", SwingConstants.RIGHT);
    private JTextField rsFee;
    private JLabel prodInValue = new JLabel("Product Inventory Value",   SwingConstants.RIGHT);
    private JTextField prodValue;
    private JLabel totalValue = new JLabel("Total Value of All Products", SwingConstants.RIGHT);
    private JTextField tValue;
    private double toValue;

    int nb = 0;
    char x = 'y';
    public GUI() 
    {

        super ("Inventory Program Part 5");
        setSize(800,800);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLookAndFeel();




        first = new JButton("First");
        previous = new JButton("Previous");
        next = new JButton("Next");
        last = new JButton("Last");
        first.addActionListener(this);
        previous.addActionListener(this);
        next.addActionListener(this);
        last.addActionListener(this);




        Movies[] titles = new Movies[9];

        titles [0] = new Movies(10001, "King Arthur", 25 , 9.99, 2004, .05);

        titles [1] = new Movies(10002,"Tron", 25, 7.99, 1982, .05);

        titles [2] = new Movies(10003, "Tron: Legacy",25,24.99,2010,.05);

        titles [3] = new Movies(10004,"Braveheart", 25,2.50,1995,.05);

        titles [4] = new Movies(10005,"Gladiator",25,2.50,2000,.05);

        titles [5] = new Movies(10006,"CaddyShack SE",25,19.99,1980,.05);

        titles [6] = new Movies (10007,"Hackers",25,12.50,1995,.05);

        titles [7] = new Movies (10008,"Die Hard Trilogy",25,19.99,1988,.05);

        titles [8] = new Movies (10009,"Terminator",25,4.99,1984,.05);

        Arrays.sort (titles, DVD.prodNameComparator);






                        itemNumber.setText(Double.toString(titles[nb].getitemNum()));
                        prodName.setText(titles[nb].getprodName());
                        year.setText(Integer.toString(titles[nb].getYear()));
                        unitNumber.setText(Integer.toString(titles[nb].getunitNum()));
                        price.setText(Float.toString(titles[nb].getprice()));
                        rsFee.setText(Double.toString(titles[nb].getRestkFee()));
                        prodValue.setText(Double.toString(titles[nb].getprodValue()));
                        tValue.setText("2636");





        setLayout(new GridLayout(8,4));
        add(itmNum);
        add(itemNumber);
        add(proNm);
        add(prodName);
        add(yr);
        add(year);
        add(unNum);
        add(unitNumber);
        add(prodPrice);
        add(price);
        add(restkFee);
        add(rsFee);
        add(prodInValue);
        add(prodValue);
        add(totalValue);
        add(tValue);
        add(first);
        add(previous);
        add(next);
        add(last);
        setLookAndFeel();
        setVisible(true);


    }



    public void updateFields()
    {
        itemNumber.getText();
        prodName.getText();
        year.getText();
        unitNumber.getText();
        price.getText();
        rsFee.getText();
        prodValue.getText();
        tValue.getText();
    }




    public void actionPerformed(ActionEvent evt){
        Object source = evt.getSource();
        if (source == next) 
        {
            nb++;

        }

    }

    private void setLookAndFeel()
    {
        try{
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
                        SwingUtilities.updateComponentTreeUI(this);
            } catch (Exception e) {
                System.err.println("couln't use the system"+ "look and feel: " + e);
            }

    }


    }

2 个答案:

答案 0 :(得分:2)

您的ActionListener只有一个作业

nb = 1;

repaint。这不会使用JTextFields数组Movies中的值更新titles。你需要明确地这样做。

itemNumber.setText(Double.toString(titles[nb].getItemNum()));
...

为了实现这一目标,您需要将Movies titles数组作为类成员变量,以便可以从ActionListener访问它。

此外,您实际上更改 nbActionListener的值。因为它是一个“下一个”按钮,你可能想要增加它:

nb++;

附注:

  • Java使用 camelcase 来制作方法getitemNum getItemNum
  • ArrayList可以让您更灵活地在固定大小的数组上添加电影标题。

答案 1 :(得分:1)

我认为chaning JTextFields的逻辑是在GUI类的构造函数中。因此,除非您正在创建GUI类的另一个对象,我可以看到它没有被创建。您的JTextFields不会更新。

所以基本上要解决这个问题,你必须移动你在另一个方法中更改JTextFields的逻辑,例如

 public void updateFields(){


   //place your logic code here 

 }

然后从actionPerformed方法调用此updateFields()方法

public void actionPerformed(ActionEvent evt){
    Object source = evt.getSource();
    if (source == next) 
    {
        nb =1;
    }
     updateFields();
    ///repaint();   /// you don't need the repaint method 
}

根据您在评论中的问题,就我的理解而言,将您的titles数组放在构造函数之外,并执行以下更改,使其看起来像这样:

private JTextField tValue;
private double toValue;
int nb = 0;   //note initialize this to 0
Movies[] titles = new Movies[9];//this is the line that comes out of the Constructor
public GUI() 
{

///inside the constructor do the following changes



            for (int i = 0; i < titles.length; i ++)
            {


                toValue += (titles[i].gettotalVal());
            }



    //note I will be accessing the 0th position of the array assuming you need the contents of the first objects to be displayed
    itemNumber = new JTextField(Double.toString(titles[0].getitemNum()));
    prodName = new JTextField(titles[0].getprodName());
    year = new JTextField(Integer.toString(titles[0].getYear()));
    unitNumber = new JTextField (Integer.toString(titles[0].getunitNum()));
    price = new JTextField (Float.toString(titles[0].getprice()));
    rsFee = new JTextField (Double.toString(titles[0].getRestkFee()));
    prodValue = new JTextField(Double.toString(titles[0].getprodValue()));
    tValue = new JTextField ("2636");
    nb = 0;
    //if (nb == 0) you don't need a if statement
    //{

    next.addActionListener(this);

    //}

///现在用于updateFields()方法

   public updateFields(){
    nb++;
    itemNumber.setText(Double.toString(titles[nb].getitemNum());
    prodName.setText(titles[nb].getprodName());
    year.setText(Integer.toString(titles[nb].getYear()));
    unitNumber.setText(Integer.toString(titles[nb].getunitNum()));
    price.setText(titles[nb].getprice()));
    rsFee.setText(Double.toString(titles[nb].getRestkFee()));
    prodValue.setText(Double.toString(titles[nb].getprodValue()));
    }