好的,我已按照您的说法对我的代码进行了一些更改。我有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天,仍然无法得到答案。请帮帮我!
我应该在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);
}
}
}}
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");
}
}
}
}
答案 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");
或者,如果您的JTextField
为private
(尽管不是),请使用具有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。