从另一个JFrame Gui访问vars

时间:2012-07-15 14:32:03

标签: java swing user-interface methods jframe

好的,我已按照您的说法对我的代码进行了一些更改。我有3个班级:

第二类(和第一个GUI):我有4个JButton s - Simulare,CazParticular,Start和HandSelection,一些JLabel和3 JTextField s;当我按下HandSelection按钮时,另一帧用不同的内容创建。

第3类(和第二个GUI):我有2个JButton s - 确定和取消和其他东西。当我按下确定按钮时,我希望从第一个Gui访问JTextField(QuesHandText)并使用方法setText()。我无法弄清楚这一点,我正在考虑4-5天,仍然无法得到答案。请帮帮我!

Screenshot

我应该在if语句中编写哪些代码,以便能够从第2类(第一个GUI)修改JTextField中的文本?

头等舱:

import javax.swing.JFrame;
public class Main {

    public static void main(String[] args){

        //other stuff
        GuiMain gui = new GuiMain();

        gui.frame1.setLocation(150,150);
        gui.frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        gui.frame1.setSize(400,250);
        gui.frame1.setResizable(false);
        gui.frame1.setVisible(true);

        //other stuff
    }
}

第二课:

import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowEvent;
import javax.swing.*;

public class GuiMain {

    public static GuiMain instance;
public static GuiMain getInstance(){
    if(GuiMain.instance == null){GuiMain.instance = new GuiMain();}
    return GuiMain.instance;
}
    public JFrame frame1 = new JFrame();

    public JTextField QuesHandText, FlopTurnRiverText, RezultatText; 
    public JButton Simulare, CazParticular, Start, HandSelection;
    public int w1,h1;
    public JLabel someText;
    static int u=0;
    public int j=0;

    public GuiMain(){

        frame1.setTitle("HoldemTool");
        frame1.setLayout(null);
        QuesHandText = new JTextField(4);

        Simulare = new JButton("Simulare");
        CazParticular = new JButton("Caz particular");
        Start = new JButton("Start");
        HandSelection = new JButton(new ImageIcon(getClass().getResource("GuiPic.png")));
        Handler handler1 = new Handler();

        CazParticular.addActionListener(handler1);
        Simulare.addActionListener(handler1);

        HandSelection.addActionListener(handler1);
        Start.addActionListener(handler1);

        QuesHandText.setEditable(false);
        FlopTurnRiverText.setEditable(false);
        RezultatText.setEditable(false);

        frame1.add(Welcome1);
        frame1.add(Welcome2);
        frame1.add(QuesHand);
        frame1.add(FlopTurnRiver);
        frame1.add(Rezultat);
        frame1.add(QuesHandText);
        frame1.add(FlopTurnRiverText);
        frame1.add(RezultatText);
        frame1.add(Simulare);
        frame1.add(CazParticular);
        frame1.add(Start);

    }

    public JTextField getQuesHandText(){
    return QuesHandText;
}
    public class Handler implements ActionListener{
        public void actionPerformed(ActionEvent e){

            if(e.getSource()==Simulare)
            {

            }
            if(e.getSource()==CazParticular){
                QuesHandText.setEditable(true);
                FlopTurnRiverText.setEditable(true);

                QuesHandText.setText("");
                FlopTurnRiverText.setText("");
                RezultatText.setText("");

                frame1.setSize(470, 250);
                Start.setBounds(3*FlopTurnRiverText.getX(), QuesHand.getY(), 65, h1);
                HandSelection.setBounds(3*FlopTurnRiverText.getX(), FlopTurnRiverText.getY(), 65, h1);

                frame1.add(HandSelection);
                frame1.add(Start);
            }
            if(e.getSource()==Start){
                QuesHandText.setText("Text");
            }
            if(e.getSource()==HandSelection){
                GuiSelection gui2 = new GuiSelection();  
                gui2.frame2.setVisible(true);
            }
        }

    }}

第3课

import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowEvent;
import javax.swing.*;

public class GuiSelection extends GuiMain {

    JFrame frame2 = new JFrame();
    GuiMain guiMain;
    public JButton Ok,Cancel;

    //other stuff

    public GuiSelection(){
        guiMain = new GuiMain();
        frame2.setTitle("Hand selection");
        frame2.setSize(1135,535);
        frame2.setLayout(null);
        frame2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame2.setVisible(true);
        frame2.setResizable(false);

        //other stuff

        Handler2 handler2 = new Handler2();

        Ok.addActionListener(handler2);
        Cancel.addActionListener(handler2);

        frame2.add(Ok); frame2.add(Cancel); 

    }

    public class Handler2 implements ActionListener{
        public void actionPerformed(ActionEvent e){
            if(e.getSource()==Cancel){
                frame2.hide();
            }
            if(e.getSource()==Ok)
            {
            GuiMain.getInstance().getQuesHandText().setText("From Ok");

                //When I prees this button "Ok" I want to get access to the JTextField(QuesHandText) in the         GuiMain class, and .setText();
                //somothing like QuesHandtText.setText("someText");
            }
        }
    }
}

5 个答案:

答案 0 :(得分:3)

向您的第一个GUI添加方法public JTextField getQuesHandText()和静态方法public static JFrame getInstance(),它返回第一个GUI的实例。现在,您可以从任意位置调用SecondClass.getInstance().getQuesHandText()来获取JTextField实例。请注意,使用此方法,您随时只能拥有SecondClass的单个实例。

您的getInstance()方法如下所示:

public class SecondClass extends JFrame {

    private static SecondClass instance;

    public static SecondClass getInstance() {
        if(SecondClass.instance == null)
            SecondClass.instance = new SecondClass();

        return SecondClass.instance
    }

}

请注意,您不应手动创建SecondClass的实例。

答案 1 :(得分:3)

使用已启动的Class的实例来访问其public个变量。所以你应该这样做:

GuiMain main=new GuiMain();
...
main.QuesHandtText.setText("someText");

或者,如果您的JTextFieldprivate(尽管不是),请使用具有public访问权限的实例方法来更改其内容 - 这是首选方法:

A类:

class A {
private JTextField tf;
public void setFieldText(String text) {
tf.setText(text);
}
}

B组:

class B {
A a = new A();
a.setText("hello");
}

答案 2 :(得分:3)

使用合成

1。创建包含JFrame的类的实例,您需要访问其JTextField。

2. 然后在该实例上调用JTextField的setter或getter方法。

<强>编辑:

确定你在主类上实施了Singleton原则,否则你会得到 一个你不想要的新实例...... 在第二课。

公共课GuiMain {

Main m = new Main();

m.getText(); m.setText();

//其他东西

}

答案 3 :(得分:3)

也许你真的不需要两个Windows。你需要的是一个可以通过课程JOptionPane实现的对话。

这是演示代码。

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class YourGui implements ActionListener {
    private JFrame frame;
    private JTextField text;
    private JButton takeInput;

    public YourGui() {
        frame = new JFrame();
        frame.setLayout(new GridLayout(2, 1));

        text = new JTextField();
        takeInput = new JButton("Take Input!");

        frame.add(text);
        frame.add(takeInput);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 100);

        takeInput.addActionListener(this);
    }

    public void show() {
        frame.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        int selection =
            JOptionPane.showConfirmDialog(frame, "Select Hand", "Select",
                JOptionPane.OK_CANCEL_OPTION);

        if (selection == JOptionPane.OK_OPTION) {
            text.setText("You selected ok");
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                YourGui gui = new YourGui();
                gui.show();
            }
        });
    }
}

答案 4 :(得分:2)

在GuiMain的处理程序中,将自身(主JFrame)作为参数传递给GuiSelection的构造函数:

GuiSelection gui2 = new GuiSelection(this);

然后从

更改GuiSelection的构造函数
public GuiSelection(){
    guiMain = new GuiMain();
    ...

public GuiSelection(GuiMain guiMain){
    this.guiMain = guiMain;
    ...

此外,GuiSelection是GuiMain的子类似乎很奇怪。可能这两个都应该是JFrame的直接子类。

此外,您应该在SwingUtilities.invokeLater中的main方法中包装所有内容,因为与Swing相关的所有内容都应该在事件派发线程上运行。

此外,您永远不应该使用公共成员变量:它非常非Java。