3

好的,伙计们,我已经按照你的说法对我的代码进行了一些更改。我有 3 节课:

第二类(也是第一个 GUI):我有 4 个JButton- Simulare、CazParticular、Start 和 HandSelection,一些JLabels 和 3 个JTextField;当我按下 HandSelection 按钮时,它会创建另一个具有不同内容的框架。

第三节课(和第二个 GUI):我有 2JButton秒 - 确定和取消以及其他东西。当我按下 Ok 按钮时,我想JTextField(QuesHandText)从第一个 Gui 访问并使用方法setText()。我想不通,我想了 4-5 天,但仍然无法得到答案。请帮我!

截屏

我应该在 if 语句中编写什么代码才能修改JTextField第二类(第一个 GUI)中的文本?

一级:

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);
            }
        }

    }}

三等

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");
            }
        }
    }
}
4

5 回答 5

3

也许您并不真的需要两个 Windows。您需要的是一个可以通过类实现的 Dialog 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();
            }
        });
    }
}
于 2012-07-15T16:18:25.823 回答
3

将方法和返回第一个 GUI 实例的public JTextField getQuesHandText()静态方法添加到您的第一个 GUI。public static JFrame getInstance()现在您可以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手动创建 的实例。

于 2012-07-15T14:40:41.787 回答
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");
}
于 2012-07-15T14:41:10.713 回答
3

使用组合

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

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

编辑:

确保你已经在 Main 类上实现了 Singleton 原则,否则你会得到一个你不想要的新实例......在第二类。

公共类 GuiMain{

主要 m = new Main();

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

// 其他东西

}

于 2012-07-15T14:42:37.167 回答
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。

于 2012-07-15T14:57:21.330 回答