如何将JTextfield信息从JDialog传递到JFrame(单独的类)

时间:2018-03-06 12:47:07

标签: java variables jframe jdialog

我一直在尝试将JDialog中的JTextField信息传递给我的JFrame。 JDialog和JFrame都在不同的类中。我试图使用.setText和.getText将JTextField存储到JLable中,然后将JLable传递给JFrame,但没有运气。

我知道有很多类似的问题,但我尝试了很多不同的方法,但仍然没有运气。我对Java比较陌生,不知道所有的内容和内容。非常感谢任何帮助!

我的JFrame代码:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.JPanel;

public class StockApp extends JFrame implements PropertyChangeListener {

    private JPanel main = new JPanel();
    private JPanel north = new JPanel();
    private JPanel center = new JPanel();
    private JPanel south = new JPanel();
    private JButton buyStock = new JButton("Buy Stock");
    private JButton sellStock = new JButton("Sell Stock");
    public TestTest variables = new TestTest();
    private JLabel stockNameNorth = new JLabel("Stock Name");
    private JLabel stockPriceNorth = new JLabel("Stock Price");
    String stockName = variables.getStockName();
    String stockPrice = variables.getStockPrice();

    public StockApp() {
        setTitle("StockApp");
        getContentPane().setBackground(Color.white);
        setSize(400,400);
        setLocation(500,200);
        setVisible(true);
        main.setLayout(new BorderLayout());
        north.setLayout(new FlowLayout());
        center.setLayout(new FlowLayout());
        south.setLayout(new FlowLayout());
        stockNameNorth.setText(stockName);
        stockPriceNorth.setText(stockPrice);
        add(main);
        north.add(stockNameNorth);
        north.add(stockPriceNorth);
        south.add(buyStock);
        south.add(sellStock);
        main.add(north, BorderLayout.NORTH);
        main.add(center, BorderLayout.CENTER);
        main.add(south, BorderLayout.SOUTH);
    }
}

和对话:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class TestTest extends JDialog implements ActionListener {

private JPanel main = new JPanel();
    private JPanel north = new JPanel();
    private JPanel center = new JPanel();
    private  JPanel south = new JPanel();
    private JLabel stockNameLabel = new JLabel("Stock name: ");
    private JLabel stockPriceLabel = new JLabel("Stock price(£): ");
    private JTextField stockNameIn = new JTextField(5);
    private JTextField stockPriceIn = new JTextField(5);
    private JButton buttonOK = new JButton("OK");
    public JLabel stockPrice = new JLabel();
    public JLabel stockName = new JLabel();

    public TestTest() {
        getContentPane().setBackground(Color.white);
        setSize(400,400);
        setLocation(500,200);
        setModal(false);
        setVisible(true);
        getRootPane().setDefaultButton(buttonOK);
        main.setLayout(new BorderLayout());
        north.setLayout(new FlowLayout());
        center.setLayout(new FlowLayout());
        south.setLayout(new FlowLayout());
        add(main);
        north.add(stockNameLabel);
        north.add(stockNameIn);
        center.add(stockPriceLabel);
        center.add(stockPriceIn);
        south.add(buttonOK);
        main.add(north, BorderLayout.NORTH);
        main.add(center, BorderLayout.CENTER);
        main.add(south, BorderLayout.SOUTH);
        buttonOK.addActionListener(this);
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == buttonOK){
            stockName.setText(stockNameIn.getText());
            stockPrice.setText(stockPriceIn.getText());
            dispose();
            new StockApp();
            }
        }
    public String getStockName() {
        return stockNameIn.getText();
    }
    public String getStockPrice() {
        return stockPriceIn.getText();
    }
}    

我正在尝试将stockName和stockPrice变量从JDialog传递到JFrame。然后我希望名称和价格显示在JFrame的顶部。

1 个答案:

答案 0 :(得分:-1)

为了演示,问题是什么,我们需要更少的字段和按钮。

到目前为止,不需要从不同的方法访问StockApp的任何组件,因此不需要在ctor之外显示它们。

代码中有更多解释。

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JPanel;

public class StockApp extends JFrame {

    public StockApp() {
        // move those unreferenced panels here, so we don't have to reason about them:
        JPanel main = new JPanel();
        JPanel north = new JPanel();
        JPanel center = new JPanel();
        JPanel south = new JPanel();
        // add price later, when name works
        JButton buyStock = new JButton("Buy Stock");
        JLabel stockNameNorth = new JLabel("Stock Name");

        // critical change: Make the label, which you like to update,
        // accessible by whom it should be updated:
        TestTest variables = new TestTest (stockNameNorth);

        setTitle ("StockApp");
        getContentPane().setBackground(Color.white);
        setSize (600,400);
        setLocation (500,200);
        setVisible (true);
        // make the close-frame action terminate the program:
        setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);

        main.setLayout (new BorderLayout());
        north.setLayout (new FlowLayout());
        center.setLayout (new FlowLayout());
        south.setLayout (new FlowLayout());
        add (main);
        north.add (stockNameNorth);
        south.add (buyStock);
        main.add (north, BorderLayout.NORTH);
        main.add (center, BorderLayout.CENTER);
        main.add (south, BorderLayout.SOUTH);
    }

    // Main method to start the damn thing
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new StockApp ();
            }
        });
    }
}

// no need to make this class public in a short test:   
class TestTest extends JDialog implements ActionListener {

    // this are elements, visible outside the construction phase,
    // we need to have access to from more than one method.
    // Make this important distinction visible to the reader: 
    JLabel name;
    JTextField stockNameIn = new JTextField (5);
    JButton buttonOK = new JButton ("OK");

    // add the JLabel to update to the ctor, so that it can't be forgotten
   // to be set
    public TestTest (JLabel pname) {
        // we copy the reference to the label, to have access to it in 
        // the actionPerformed method.
        name = pname;
        JPanel main = new JPanel();
        JPanel north = new JPanel();
        JPanel center = new JPanel();
        JPanel south = new JPanel();
        JLabel stockNameLabel = new JLabel ("Stock name: ");
        getContentPane().setBackground(Color.white);
        // different size/location than frame, so that they don't hide
        // each other completly
        setSize (400,600);
        setLocation (700,300);
        setModal (false);
        setVisible (true);
        getRootPane().setDefaultButton(buttonOK);
        main.setLayout (new BorderLayout());
        north.setLayout (new FlowLayout());
        center.setLayout (new FlowLayout());
        south.setLayout (new FlowLayout());
        add (main);
        north.add (stockNameLabel);
        north.add (stockNameIn);
        south.add (buttonOK);
        main.add (north, BorderLayout.NORTH);
        main.add (center, BorderLayout.CENTER);
        main.add (south, BorderLayout.SOUTH);
        buttonOK.addActionListener(this);
    }

    // here we need access to the button - was it the OK-Button, clicked?    
    // and the textfield stockNameIn, to read the text 
    // and the name field from the frame, to set the text 
    public void actionPerformed(ActionEvent e) {
        if (e.getSource () == buttonOK) {
            name.setText (stockNameIn.getText());
            dispose();
        }
    }
}