swing两个窗体传值问题?

sunny8675 2012-05-14 11:23:26
最近在学习swing,可视化界面开发。用的是myeclipse 10的matisse4插件。我有个主窗体和一个子窗体。
通过点击主窗体的按钮来打开子窗体,子窗体中获取当前时间。点击子窗体确定后把值传到主窗体的JTextArea中。隐藏子窗体。研究了好几天了没弄出来。请教做过的朋友帮忙给个例子。实在是困扰好久了。
...全文
415 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunny8675 2012-05-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
几年没用过Swing了 , 你试一下 ,我这边刚打开窗口后显示不出来按钮和文本域,要将窗口放大放大一点才看得到 ,你试试。 我也忘记改怎么弄了。
[/Quote]

好的,谢谢,我试试。
sdojqy1122 2012-05-14
  • 打赏
  • 举报
回复

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);
}
}
_jerrytiger 2012-05-14
  • 打赏
  • 举报
回复
几年没用过Swing了 , 你试一下 ,我这边刚打开窗口后显示不出来按钮和文本域,要将窗口放大放大一点才看得到 ,你试试。 我也忘记改怎么弄了。
_jerrytiger 2012-05-14
  • 打赏
  • 举报
回复

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

}

}

sunny8675 2012-05-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
public class MainClass{ //主入口类

public static MainJFrame main = null; //主窗口

static {
main = new MainJFrame (); //打开主窗口 ,主窗口中有个JTextArea组件,比如说叫text
//监听主窗口中的事件,点击主窗口中的按钮后打开子窗口。
//比……
[/Quote]
是两个窗体类,能具体的给我看下怎么操作吗?
_jerrytiger 2012-05-14
  • 打赏
  • 举报
回复
public class MainClass{ //主入口类

public static MainJFrame main = null; //主窗口

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



}
sunny8675 2012-05-14
  • 打赏
  • 举报
回复
大家都很忙?谁出来帮忙看看啊。
sdojqy1122 2012-05-14
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

引用 11 楼 的回复:
传对象引用。先看下我的代码吧。尤其是
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == createFrame) {
TestFrame f = new TestFrame("新窗体",this);
f.time.setText(new Date()+ "……
[/Quote]
呵呵,虽然是一个类,但是实际上我创建了两个窗体,只是重用了一些代码。但是还是传的对象引用。要是理解困难就写成两个类。
sunny8675 2012-05-14
  • 打赏
  • 举报
回复
谢谢:is_zhoufeng
效果出来了。看来这个是要在new第二个窗体的时候通过构造函数把第一个窗体传过去。这样才能使用。
打扰了这么久还是谢谢你了。
也谢谢:sdojqy1122
感谢两位的指点。
sunny8675 2012-05-14
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]
你是要分成两个类吗?


Java code


package com.zf.ui;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;

import javax.sw……
[/Quote]

谢谢,刚才出不来效果,我乱点了下,出来效果了。我看代码好像是要传个窗体类进去。我在试试。
_jerrytiger 2012-05-14
  • 打赏
  • 举报
回复
你是要分成两个类吗?


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

}
sunny8675 2012-05-14
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]
传对象引用。先看下我的代码吧。尤其是
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == createFrame) {
TestFrame f = new TestFrame("新窗体",this);
f.time.setText(new Date()+ "");
}……
[/Quote]
说实话,有点不明白。你的是在一个里面处理的。我的是要在第二个窗体调用第一个窗体的jTextArea.append(str)来追加数据。
你告诉下我在第二个窗体中如何调用第一个窗体的控件属性来赋值?
sdojqy1122 2012-05-14
  • 打赏
  • 举报
回复
传对象引用。先看下我的代码吧。尤其是
@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();
}
}
这一段跟你的有什么不同。
sunny8675 2012-05-14
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
引用 8 楼 的回复:
还是不行,我的代码是这样的:
Java code
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
String timeOneStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
.format(this……

为什么要n……
[/Quote]
两个窗体就是两个类,另外一个窗体调用另一个窗体的方法不是这样吗?
sdojqy1122 2012-05-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
还是不行,我的代码是这样的:
Java code
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
String timeOneStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
.format(this……
[/Quote]
为什么要new一个?除非你用单例模式,否则,就不是同一个主窗体了。

sunny8675 2012-05-14
  • 打赏
  • 举报
回复
还是不行,我的代码是这样的:

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

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧