最近在学习swing,可视化界面开发。用的是myeclipse 10的matisse4插件。我有个主窗体和一个子窗体。
通过点击主窗体的按钮来打开子窗体,子窗体中获取当前时间。点击子窗体确定后把值传到主窗体的JTextArea中。隐藏子窗体。研究了好几天了没弄出来。请教做过的朋友帮忙给个例子。实在是困扰好久了。

解决方案 »

  1.   

    public class MainClass{   //主入口类
        
          public static MainJFrame main = null;  //主窗口      static {
              main = new MainJFrame ();  //打开主窗口 ,主窗口中有个JTextArea组件,比如说叫text
              //监听主窗口中的事件,点击主窗口中的按钮后打开子窗口。
              //比如说打开的子窗口是 ChildJFrame 
              //在ChildJFrame获取当前时间,然后执行下面的代码,给主窗口中的JTextArea赋值
              MainClass.main.text.setText(new Date().toLocalString());
          }}
      

  2.   


    package com.zf.ui;import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.Date;import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JTextArea;/**
     * 主窗口
     * @author zhoufeng
     *
     */
    public class MainFrame { JFrame frame = null ;
    JTextArea text = null;
    JButton button = null;

    public void init(){
    frame = new JFrame("主窗口");
    frame.setBounds(500, 250, 500, 300);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    text = new JTextArea();
    text.setSize(100, 50 );  
    text.setText("这里将会显示时间!");
    frame.add(text , BorderLayout.NORTH);
       
    button = new JButton("打开子窗口");

    frame.add(button , BorderLayout.SOUTH);

    button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
    System.out.println("点击了。");
    new ChildFrame();
    }
    });
    }

    public static void main(String[] args) {
    new MainFrame().init();
    }

    /**
     * 子窗口
     * @author zhoufeng
     *
     */
    class ChildFrame{
    JFrame frame = null;
    JButton button = null;
    public ChildFrame(){
    frame = new JFrame("子窗口");
    frame.setBounds(500, 250, 300, 150);
    frame.setVisible(true);
    button = new JButton("为主窗口中的文本域赋值");
    button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
    MainFrame.this.text.setText(new Date().toLocaleString());
    frame.setVisible(false);
    }
    });
    frame.add(button , BorderLayout.NORTH);
    }

    }

    }
      

  3.   

    几年没用过Swing了 , 你试一下 ,我这边刚打开窗口后显示不出来按钮和文本域,要将窗口放大放大一点才看得到 ,你试试。 我也忘记改怎么弄了。
      

  4.   


    import javax.swing.JTextField;public class TestFrame extends Frame implements ActionListener {
    TestFrame parent;
    Button createFrame = new Button("产生新窗体");
    Button returnValue = new Button("参数回传");
    JTextField time = new JTextField(); public TestFrame(String title, TestFrame parent) {
    this.setTitle(title);
    this.parent = parent;
    initFrame();
    } private void initFrame(){
    this.add(time,BorderLayout.NORTH);
    if (this.parent == null) {
    this.add(createFrame);
    createFrame.addActionListener(this);
    } else {
    this.add(returnValue);
    returnValue.addActionListener(this);
    }

    this.pack();
    this.setVisible(true);
    } @Override
    public void actionPerformed(ActionEvent e) {
    if (e.getSource() == createFrame) {
    TestFrame f = new TestFrame("新窗体",this);
    f.time.setText(new Date()+ "");
    }
    else if(e.getSource()== returnValue){
    parent.time.setText(this.time.getText());
    this.dispose();
    }
    }

    public static void main(String args[]){
    new TestFrame("主窗体",null);
    }
    }
      

  5.   

    还是不行,我的代码是这样的:private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
    String timeOneStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
    .format(this.jSpinner1.getValue());
    String timeTwoStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
    .format(this.jSpinner2.getValue());
    LoginFrame lf=new LoginFrame(); //主窗体
    lf.getjTextArea1().append(timeOneStr); //主窗体的jtextArea出不来数据。
    //this.dispose();
    }
      

  6.   

    为什么要new一个?除非你用单例模式,否则,就不是同一个主窗体了。
      

  7.   

    传对象引用。先看下我的代码吧。尤其是
    @Override
        public void actionPerformed(ActionEvent e) {
            if (e.getSource() == createFrame) {
                TestFrame f = new TestFrame("新窗体",this);
                f.time.setText(new Date()+ "");
            }
            else if(e.getSource()== returnValue){
                parent.time.setText(this.time.getText());
                this.dispose();
            }
        }
    这一段跟你的有什么不同。
      

  8.   

    说实话,有点不明白。你的是在一个里面处理的。我的是要在第二个窗体调用第一个窗体的jTextArea.append(str)来追加数据。
    你告诉下我在第二个窗体中如何调用第一个窗体的控件属性来赋值?
      

  9.   

    你是要分成两个类吗?
    package com.zf.ui;import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.Date;import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JTextArea;/**
     * 主窗口
     * @author zhoufeng
     *
     */
    public class MainFrame { JFrame frame = null ;
    JTextArea text = null;
    JButton button = null; public void init(){
    frame = new JFrame("主窗口");
    frame.setBounds(500, 250, 500, 300);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); text = new JTextArea();
    text.setSize(100, 50 );  
    text.setText("这里将会显示时间!");
    frame.add(text , BorderLayout.NORTH); button = new JButton("打开子窗口"); frame.add(button , BorderLayout.SOUTH); button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
    System.out.println("点击了。");
    new ChildFrame(MainFrame.this);
    }
    });
    } public static void main(String[] args) {
    new MainFrame().init();
    }
    }
    /**
     * 子窗口
     * @author zhoufeng
     *
     */
    class ChildFrame{
    MainFrame mainFrame = null;
    JFrame frame = null;
    JButton button = null;
    public ChildFrame(final MainFrame mainFrame){   
    frame = new JFrame("子窗口");
    frame.setBounds(500, 250, 300, 150);
    frame.setVisible(true);
    button = new JButton("为主窗口中的文本域赋值");
    button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
    mainFrame.text.setText(new Date().toLocaleString());
    frame.setVisible(false);
    }
    });
    frame.add(button , BorderLayout.NORTH);
    }}
      

  10.   

    谢谢:is_zhoufeng
    效果出来了。看来这个是要在new第二个窗体的时候通过构造函数把第一个窗体传过去。这样才能使用。
    打扰了这么久还是谢谢你了。
    也谢谢:sdojqy1122
    感谢两位的指点。