给JPanel中的控件赋值 假设在一个JPanel中有四个控件JTextField,JList,JCheckBox,JButton当我点JButton时如何用一个for循环给其它三个控件赋值(所有控件已初始化) 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 自己写一个MyPanel类,继承自JPanel,然后在其中加入属性 ArrayList UIList,重载 JPanel的add 方法public Component add(Component comp) { UIList.add(comp); super.add(comp); }然后在 button事件监听器里 遍历这个 UIList 即可。 请问一下,假设遍历 UIList 得到JTextField,能用setText("test")吗?好象不可以,可否说详细点! 1、自动以一个接口:interface MyComponent{void initComponent(Object value);//不知道需不需要参数,如果有默认值,可以不需要参数;}2、实现自己的组件,JTextField、JList、JCheckBox,全部实现MyComponent的接口:3、实现自己的JPanel,或者不实现也可以,就是向Panel中添加自定义组件的时候,需要使用List<MyComponent>保存起来, 在需要初始化的时候,遍历List<MyComponent>,调用initComponent进行控件的初始化 如果使用一楼的方法,无论是默认值,还是自己需要设置的值,都需要在List遍历的时候对控件类型进行判断 是这个意思。我觉得在接口中定义的给控件赋值的方法里需要参数的,应该Object类型的,或者数组。总之参数是自己传入的,而接口的实现也是自己写的,肯定能够处理好。另外,我说的方法在2楼,不在1楼。 public interface MyComponent{ public void setValueToComponent(Object value);}import javax.swing.JTextField;public class MyJTextField extends JTextField implements MyComponent{ //實現MyComponent,TextField類型,調用父類的setText(String)方法 public void setValueToComponent(Object value) { if (value instanceof String) { setText((String) value); } else { setText(""); } }}import java.awt.Component;import java.util.ArrayList;import java.util.List;import javax.swing.JPanel;public class MyPanel extends JPanel{ private List uiList = new ArrayList(); //可以多重載一些JPanel的方法,提供良好的接口 //把UI加入到UIList中,在調用父類方法,將UI加入到JPanel中 public Component add(MyComponent comp) { uiList.add(comp); return super.add((Component) comp); } //返回UIList public List getUIList() { return uiList; }}import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.util.List;import javax.swing.JButton;import javax.swing.JFrame;public class TestFrame extends JFrame{ public TestFrame() { final MyPanel myP = new MyPanel(); // 需要加入到UIList里的UI,定義成MyComponent接口類型 MyComponent myJtf = new MyJTextField(); //此處進入MyPanel的add方法 myP.add(myJtf); //不需要加入到UIList里的UI,定義成JComponent類型 JButton btn = new JButton("setValue"); //此處進入JButton繼承自Container的add方法 myP.add(btn); btn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { List uiList = myP.getUIList(); for(int i = 0; i < uiList.size(); i++) { // 此處給UI控件賦値 //此處因為只加入了TextField控件,所以可以循環賦値 //但由于JList,JCheckBox等賦値的參數不同,應該另行設計 //可以將參數也有序化,然后調用MyComponent接口方法 ((MyComponent) uiList.get(i)).setValueToComponent("String"); } myP.updateUI(); } }); getContentPane().add(myP); setSize(300, 300); setLocation(100, 100); pack(); setVisible(true); } public static void main(String args[]) { TestFrame tf = new TestFrame(); }} LS实现的不太好的地方(个人观点)://把UI加入到UIList中,在調用父類方法,將UI加入到JPanel中 public Component add(MyComponent comp) { uiList.add(comp); return super.add((Component) comp); }应该这样: @Override protected void addImpl(Component comp, Object constraints, int index) { if(comp inatanceof MyComponent){ uiList.add(comp);} super.addImpl(comp, constraints, index); }如果像LS那样的话,太缺乏通用性,还的用户自己判断什么样控件需要调用什么样的add方法 jpanel.getComponents(),得到数组后遍历。 JScrollPane中放JTable,为什么不显示滚动条呢? 2个小问题 快来抢分阿 jdk 1.5 枚举替代类 Enum 一个简单的问题,解决一下.我刚学JAVA的. 送分就是爽继续:) 简单问题:如何迅速找到方法是属于哪个类的? BBS中怎样获取在线用户列表?(我已经在很多BBS上发贴了。但还没找到解决办法的。。。) about static 哪儿有Jbuilder可以down! wait为什么总是抛出这个异常? 我的java 计时器 一运行就会是cpu的利用率达到100%,感觉自己的程序有问题,但又找不到问题所在,高手帮忙!急急!! args在编译中的作用
然后在其中加入属性 ArrayList UIList,
重载 JPanel的add 方法public Component add(Component comp) {
UIList.add(comp);
super.add(comp);
}然后在 button事件监听器里 遍历这个 UIList 即可。
好象不可以,可否说详细点!
interface MyComponent{
void initComponent(Object value);//不知道需不需要参数,如果有默认值,可以不需要参数;
}2、实现自己的组件,JTextField、JList、JCheckBox,全部实现MyComponent的接口:3、实现自己的JPanel,或者不实现也可以,就是向Panel中添加自定义组件的时候,需要使用List<MyComponent>保存起来,
在需要初始化的时候,遍历List<MyComponent>,调用initComponent进行控件的初始化
如果使用一楼的方法,无论是默认值,还是自己需要设置的值,都需要在List遍历的时候对控件类型进行判断
是这个意思。我觉得在接口中定义的给控件赋值的方法里需要参数的,应该Object类型的,或者数组。总之参数是自己传入的,而接口的实现也是自己写的,肯定能够处理好。另外,我说的方法在2楼,不在1楼。
public interface MyComponent
{
public void setValueToComponent(Object value);
}import javax.swing.JTextField;public class MyJTextField extends JTextField implements MyComponent
{
//實現MyComponent,TextField類型,調用父類的setText(String)方法
public void setValueToComponent(Object value)
{
if (value instanceof String)
{
setText((String) value);
}
else
{
setText("");
}
}
}import java.awt.Component;
import java.util.ArrayList;
import java.util.List;import javax.swing.JPanel;public class MyPanel extends JPanel
{
private List uiList = new ArrayList();
//可以多重載一些JPanel的方法,提供良好的接口 //把UI加入到UIList中,在調用父類方法,將UI加入到JPanel中
public Component add(MyComponent comp)
{
uiList.add(comp);
return super.add((Component) comp);
}
//返回UIList
public List getUIList()
{
return uiList;
}
}
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;import javax.swing.JButton;
import javax.swing.JFrame;public class TestFrame extends JFrame
{
public TestFrame()
{
final MyPanel myP = new MyPanel();
// 需要加入到UIList里的UI,定義成MyComponent接口類型
MyComponent myJtf = new MyJTextField();
//此處進入MyPanel的add方法
myP.add(myJtf);
//不需要加入到UIList里的UI,定義成JComponent類型
JButton btn = new JButton("setValue");
//此處進入JButton繼承自Container的add方法
myP.add(btn);
btn.addActionListener(new ActionListener()
{ public void actionPerformed(ActionEvent e)
{
List uiList = myP.getUIList();
for(int i = 0; i < uiList.size(); i++)
{
// 此處給UI控件賦値
//此處因為只加入了TextField控件,所以可以循環賦値
//但由于JList,JCheckBox等賦値的參數不同,應該另行設計
//可以將參數也有序化,然后調用MyComponent接口方法
((MyComponent) uiList.get(i)).setValueToComponent("String");
}
myP.updateUI();
} });
getContentPane().add(myP);
setSize(300, 300);
setLocation(100, 100);
pack();
setVisible(true);
} public static void main(String args[])
{
TestFrame tf = new TestFrame();
}
}
//把UI加入到UIList中,在調用父類方法,將UI加入到JPanel中
public Component add(MyComponent comp)
{
uiList.add(comp);
return super.add((Component) comp);
}
应该这样: @Override
protected void addImpl(Component comp, Object constraints, int index) {
if(comp inatanceof MyComponent){
uiList.add(comp);
}
super.addImpl(comp, constraints, index);
}如果像LS那样的话,太缺乏通用性,还的用户自己判断什么样控件需要调用什么样的add方法