2017-02-10 50 views
1

我需要帮助,在Java中使用textfields更改类的属性的值下面我有3个简化版本的代码来演示我遇到的问题。我在alpha,UIalpha和mainGUI类下有3个类。当我运行mainGUI类时,我需要用户单击窗口上的pc图像。这将创建UIaplha对象,以打开一个新框架。此框架具有应该能够更改mainGUI类中aplha类对象的name属性的文本框。我的代码工作到某个地方,我不知道如何解决它。我搜索了多次,尝试了很多种类的东西,但都没有为我工作。 pc image needed在java中使用textfields更改类的详细信息

Alpha.java

public class alpha{ 
String name; 
public void setName(String n){ 
    name=n; 
    } 
    public void print(){ 
    System.out.println("name= "+name); 
    } 
    public static void main(String[] args){ 
    alpha a=new alpha(); 
    } 
} 

mainGUI.java

import java.awt.*; // this is used to access the GridLayout class 
import java.awt.event.*; 
import javax.swing.*; 
public class mainGUI extends JComponent{ 
private static final int WIDTH = 400; 
private static final int HEIGHT = 300; 
private int PCHeight=40; 
private int PCWidth=41; 
int y=20,x=30; 
private JButton pc1button; 
private PCButtonHandler pcbHandler; 
public mainGUI(){ 
    JFrame frame=new JFrame("NETWORK EXAMPLE"); 
    ImageIcon image = new ImageIcon("pc.png"); 
    pc1button =new JButton(image); 
    ////////////////////////////////////////////////////////// 
    pc1button.setOpaque(false); 
    pc1button.setContentAreaFilled(false); 
    pc1button.setBorderPainted(false); 
    pc1button.setBounds(y,x,PCHeight,PCWidth); 
    //////////////////////////////////////////////////////// 
    pcbHandler=new PCButtonHandler(); 
    pc1button.addActionListener(pcbHandler); 
    frame.setTitle("GUI example"); 
    Container pane= frame.getContentPane(); 
    pane.setLayout(null); 
    pane.setBackground(Color.WHITE); 
    pane.add(pc1button); 
    frame.setSize(WIDTH, HEIGHT); 
    frame.setVisible(true); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
} 
public class PCButtonHandler implements ActionListener 
{ 
    String name; 
    public void actionPerformed(ActionEvent e) 
    { 
     alpha test=new alpha(); 
     test.setName("WRONG"); 
     test.print(); 
     UIalpha help=new UIalpha(test); 
     test=help.updateObjects(); 
     test.print(); 
    } 
    } 
public static void main(String[] args){ 
    mainGUI work=new mainGUI(); 
} 
} 

UIalpha.java

import java.awt.*; // this is used to access the GridLayout class 
import java.awt.event.*; 
import javax.swing.*; 
public class UIalpha extends JFrame{ 
    String Name; 
    private JLabel nameL; 
    private JTextField nameTF; 
    boolean pressed=false; 
    private JButton enterbutton=new JButton("Enter"); 
    private JFrame frame=new JFrame("PC"); 
    alpha refrence; 
    public UIalpha(alpha test){ 
    this.refrence=test; 
    nameL= new JLabel("Enter the name of alpha: ", SwingConstants.CENTER); 
    nameTF=new JTextField(10); 
    nameTF.setMaximumSize(new Dimension(500,20)); 
    enterbutton.addActionListener(new ActionListener(){ 
    public void actionPerformed(ActionEvent e) { 
     refrence.setName(nameTF.getText()); 
    // test.setName(nameTF.getText()); 
     //test.print(); 
     pressed=true; 
    } 
    }); 
    Container pane= frame.getContentPane(); 
    frame.setLayout(new BoxLayout(pane,BoxLayout.PAGE_AXIS)); 
    pane.add(nameL); 
    pane.add(nameTF); 
    pane.add(enterbutton); 
    frame.setMinimumSize(new Dimension(300,200)); 
    frame.setPreferredSize(new Dimension(600,200)); 
    frame.setMaximumSize(new Dimension(660,200)); 
    frame.setVisible(true); 
    } 
    public alpha updateObjects(){ 

    return refrence; 
    } 
} 
+1

'我的代码工作到某个地方,我不知道如何解决它'这不是很具体。什么实际上起作用,什么不起作用? – Deltharis

+0

所以当我按下输入按钮时,它会更改传入的aplha对象。但该更改不会反射回mainGUI类中的alpha对象。什么即时尝试达到令人满意的是允许用户按下输入按钮,然后我可以在新闻后在mainGUI类中稍后使用更新对象。 –

回答

0

你的代码其实大部分都是可用的。 Bah,alpha IS中的变化反映在mainGUI中。只是你试图打印它太早 - 创建一个新的框架不会阻止。 printsPCButtonHandler都会立即发生,然后才有机会输入新值。如果你说,在mainGUI中添加一个新按钮来打印alpha的当前值,你将能够看到它改变了。

而且,因为我在这里:

  • Java类的名称应该以大写字母开头。
  • 为了在应用程序不断增长时不会感到疯狂,请使用布局管理器(例如MigLayout)。

CNC中

一个很好的时机,尝试做一些新的值(例如,更新整个mainGUI需要的地方),在关闭窗口会。你可以不喜欢它,在mainGUI正下方创建UIalpha:

help.addWindowListener(new WindowAdapter(){ 
       @Override 
       public void windowClosing(WindowEvent e) { 
        System.out.println("window closing"); 
        test.print(); 
       } 
      }); 

或者很好,这应该工作,当你收拾你是怎么做UIalpha:

  • 删除frame变量
  • 无论你打电话方法在该变量上调用它在UIalpha上(当前对象)

因为否则,您会将该侦听器设置在与你使用。

+0

除了一个按钮以外,是否还有其他任何方式来查看变更是否已反映出来。我怎么才能等到输入按钮被按下。我试过类似while(enterpressed == false);但这没有给我textfeilds或按钮。我也试图使用一个线程,但我不明白如何使用它们,因为在尝试这种事情之前我只做了基本的Java。 –

+0

@DillonWaters扩大了答案 – Deltharis

+0

非常感谢你现在的工作。 –