Java,两个JPanel之间怎么传值

时间:2022-09-11 13:40:37
初学Java,遇到点棘手的问题,求教各位大侠:

我做个了界面,里边包含了几个JPanel,每个Panel都有相应的控件。我想做这个一个操作:
即在Panel A里点击一个Button,会弹出一个对话框,然后会运行一个命令,我想把这个命令运行的结果在Panel B的JTextArea控件上显示出来。

想了几天了,也不知道该怎么处理!!!

Help!

19 个解决方案

#1


Panel B的JTextArea jta为类属性。
在Panel A里点击一个Button,会弹出一个对话框,然后会运行一个命令,我想把这个命令运行的结果 s
jta.setText(s);

#2


静态变量

#3


命令模式的变体?

#4


实在不行的话就用2楼说的静态变量

#5


我有一种思路,首先Panel B需要提供一个getTextArea()方法,以便程序能够获得相应的JTextArea对象,然后Panel A的构造函数里面加入一个Panel B的参数,最后就可以在button的事件中获得Panel B的JTextArea对象了

下面用个例子来表达我的思路

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class TestFrame extends JFrame
{
public TestFrame()
{
TestPanelB panelB = new TestPanelB();
TestPanelA panelA = new TestPanelA(panelB);

setLayout(new BorderLayout());
add(panelB, BorderLayout.CENTER);
add(panelA, BorderLayout.SOUTH);
}

public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
JFrame frame = new TestFrame();
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
});
}
}

class TestPanelA extends JPanel
{
private JButton button = new JButton("Set Text");

public TestPanelA(final TestPanelB panelB) //构造函数添加一个Panel B参数
{
add(button);
button.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
panelB.getTextArea().setText("Hello, World!"); //直接对Panel B对象的JTextArea进行操作
}
});
}
}

class TestPanelB extends JPanel
{
private JTextArea text = new JTextArea(10, 40);

public TestPanelB()
{
add(text);
}

public JTextArea getTextArea() //提供获取JTextArea的函数
{
return text;
}
}

#6


你可以去参考java的html文档呀~

#7


中介者模式试一试

#8


把结果返回给JB

#9


该怎么传还是怎么传的,就跟普通的代码一样,要不就调用方法,要不就写成静态变量!

#10


A 和B 在同一个界面不好做吗? 把你要引用的组件定义成全局变量就可以了

还有一种方法:你可以自定义JPanel,让每个JPanel保持父对象如JFrame的引用,这样整个系统中的任意一个组件都可以访问到(要提供相应组件的getter)

#11


楼主的几个panel是不是在同一个frame里?
如果是的,那个,你可以把frame作为panel构造方法中的一个参数传进去,赋给panel类里的一个frame成员变量,那么,你就可以操作frame里的变量了,而各个panel都是在frame里的,那么,你就可以随意的操作每个组件了

#12


在Panel A里点击一个Button,会弹出一个对话框,然后会运行一个命令,我想把这个命令运行的结果 s
jta.setText(s);

#13


这里可以用点模式嘛,持有对方的引用,或者大管家引用。你最好把你自己的代码贴进来。好让人给你看看,!传值问题的变量可见性是一个很基础的问题

#14


引用 1 楼 yangjunloveyu 的回复:
Panel B的JTextArea jta为类属性。
在Panel A里点击一个Button,会弹出一个对话框,然后会运行一个命令,我想把这个命令运行的结果 s
jta.setText(s);


静态变量能够保存Panel B的改变的值,但是静态变量的一个缺点是,我不能从Panel B的事件去触发。

#15


引用 6 楼 wudi221364 的回复:
你可以去参考java的html文档呀~

初学,参考html我还真的看不懂,呵呵。恰好还有几天就要交这个东西了,所以急着要。有各位大侠在论坛上,问一下是最快捷的方式了,哈哈。不过,要学东西还真得好好参考java的帮助文档。

#16


引用 10 楼 lg_asus 的回复:
A 和B 在同一个界面不好做吗? 把你要引用的组件定义成全局变量就可以了

还有一种方法:你可以自定义JPanel,让每个JPanel保持父对象如JFrame的引用,这样整个系统中的任意一个组件都可以访问到(要提供相应组件的getter)

我明白是什么意思了!谢谢!初涉Java,而且从来没做过界面,难免问到这么没有技术含量的问题。

#17


#5楼 的比较靠谱,我曾这么用过。

#18


谢谢5楼nbda1121440的解答,很仔细,我一看过后就明白了。。。非常感谢

#19


引用 5 楼 nbda1121440 的回复:
我有一种思路,首先Panel B需要提供一个getTextArea()方法,以便程序能够获得相应的JTextArea对象,然后Panel A的构造函数里面加入一个Panel B的参数,最后就可以在button的事件中获得Panel B的JTextArea对象了

下面用个例子来表达我的思路
Java code

import java.awt.*;
import java.awt.even……


遇到一个新的问题:在你这个程序基础之上,我在按键上添加了一个执行.exe程序的功能,用Runtime中的exec方法,这个被执行的.exe执行时间很长,我启用了另外一个线程获取.exe执行的InputStream和ErrorStream,然后将取得的结果result直接通过 panelB.getTextArea().setText(result);语句设置panel,panel并不会更新,只有在.exe执行结束后才能刷新。这个要怎么样才能解决呢?


谢谢!

#1


Panel B的JTextArea jta为类属性。
在Panel A里点击一个Button,会弹出一个对话框,然后会运行一个命令,我想把这个命令运行的结果 s
jta.setText(s);

#2


静态变量

#3


命令模式的变体?

#4


实在不行的话就用2楼说的静态变量

#5


我有一种思路,首先Panel B需要提供一个getTextArea()方法,以便程序能够获得相应的JTextArea对象,然后Panel A的构造函数里面加入一个Panel B的参数,最后就可以在button的事件中获得Panel B的JTextArea对象了

下面用个例子来表达我的思路

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class TestFrame extends JFrame
{
public TestFrame()
{
TestPanelB panelB = new TestPanelB();
TestPanelA panelA = new TestPanelA(panelB);

setLayout(new BorderLayout());
add(panelB, BorderLayout.CENTER);
add(panelA, BorderLayout.SOUTH);
}

public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
JFrame frame = new TestFrame();
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
});
}
}

class TestPanelA extends JPanel
{
private JButton button = new JButton("Set Text");

public TestPanelA(final TestPanelB panelB) //构造函数添加一个Panel B参数
{
add(button);
button.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
panelB.getTextArea().setText("Hello, World!"); //直接对Panel B对象的JTextArea进行操作
}
});
}
}

class TestPanelB extends JPanel
{
private JTextArea text = new JTextArea(10, 40);

public TestPanelB()
{
add(text);
}

public JTextArea getTextArea() //提供获取JTextArea的函数
{
return text;
}
}

#6


你可以去参考java的html文档呀~

#7


中介者模式试一试

#8


把结果返回给JB

#9


该怎么传还是怎么传的,就跟普通的代码一样,要不就调用方法,要不就写成静态变量!

#10


A 和B 在同一个界面不好做吗? 把你要引用的组件定义成全局变量就可以了

还有一种方法:你可以自定义JPanel,让每个JPanel保持父对象如JFrame的引用,这样整个系统中的任意一个组件都可以访问到(要提供相应组件的getter)

#11


楼主的几个panel是不是在同一个frame里?
如果是的,那个,你可以把frame作为panel构造方法中的一个参数传进去,赋给panel类里的一个frame成员变量,那么,你就可以操作frame里的变量了,而各个panel都是在frame里的,那么,你就可以随意的操作每个组件了

#12


在Panel A里点击一个Button,会弹出一个对话框,然后会运行一个命令,我想把这个命令运行的结果 s
jta.setText(s);

#13


这里可以用点模式嘛,持有对方的引用,或者大管家引用。你最好把你自己的代码贴进来。好让人给你看看,!传值问题的变量可见性是一个很基础的问题

#14


引用 1 楼 yangjunloveyu 的回复:
Panel B的JTextArea jta为类属性。
在Panel A里点击一个Button,会弹出一个对话框,然后会运行一个命令,我想把这个命令运行的结果 s
jta.setText(s);


静态变量能够保存Panel B的改变的值,但是静态变量的一个缺点是,我不能从Panel B的事件去触发。

#15


引用 6 楼 wudi221364 的回复:
你可以去参考java的html文档呀~

初学,参考html我还真的看不懂,呵呵。恰好还有几天就要交这个东西了,所以急着要。有各位大侠在论坛上,问一下是最快捷的方式了,哈哈。不过,要学东西还真得好好参考java的帮助文档。

#16


引用 10 楼 lg_asus 的回复:
A 和B 在同一个界面不好做吗? 把你要引用的组件定义成全局变量就可以了

还有一种方法:你可以自定义JPanel,让每个JPanel保持父对象如JFrame的引用,这样整个系统中的任意一个组件都可以访问到(要提供相应组件的getter)

我明白是什么意思了!谢谢!初涉Java,而且从来没做过界面,难免问到这么没有技术含量的问题。

#17


#5楼 的比较靠谱,我曾这么用过。

#18


谢谢5楼nbda1121440的解答,很仔细,我一看过后就明白了。。。非常感谢

#19


引用 5 楼 nbda1121440 的回复:
我有一种思路,首先Panel B需要提供一个getTextArea()方法,以便程序能够获得相应的JTextArea对象,然后Panel A的构造函数里面加入一个Panel B的参数,最后就可以在button的事件中获得Panel B的JTextArea对象了

下面用个例子来表达我的思路
Java code

import java.awt.*;
import java.awt.even……


遇到一个新的问题:在你这个程序基础之上,我在按键上添加了一个执行.exe程序的功能,用Runtime中的exec方法,这个被执行的.exe执行时间很长,我启用了另外一个线程获取.exe执行的InputStream和ErrorStream,然后将取得的结果result直接通过 panelB.getTextArea().setText(result);语句设置panel,panel并不会更新,只有在.exe执行结束后才能刷新。这个要怎么样才能解决呢?


谢谢!

#20