问题来了

[复制链接]
查看11 | 回复9 | 2007-9-4 12:51:04 | 显示全部楼层 |阅读模式
在eclispe里运行,组件不能正确显示。把frame最大化,再还原,就能正确显示了。


1.gif (218.02 KB, 下载次数: 0)
下载附件
2007-12-6 18:51 上传

在dos里执行java命令,组件能正确显示


2.gif (231.31 KB, 下载次数: 1)
下载附件
2007-12-6 18:51 上传

实在不知道是为什么,大哥们指点!以下是代码
package chatSystem;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.Panel;
import java.awt.TextField;
import javax.swing.ButtonGroup;
import javax.swing.JRadioButton;
/**
* 用户注册
* */
public class Enral {
Frame EnralFrame;//用户注册窗口
Label username,password,sex;//标签:用户名,密码,性别
TextField TFusername,TFpassword;//文本输入框:用户名,密码
JRadioButton man,woman;//单选框:男,女
Button ok,cannel;
Panel p,p1,p2,p3;
Enral(){

//主窗口

EnralFrame=new Frame("用户注册");

EnralFrame.setVisible(true);

EnralFrame.setLocation(250, 250);

EnralFrame.setSize(300,200);

//EnralFrame.setResizable(false);

//标签

username=new Label("用户名");

password=new Label("密"+""+"码");

sex=new Label("性"+""+"别");

//文本框

TFusername=new TextField(10);

TFpassword=new TextField(10);

//复选框

man=new JRadioButton("男",true);

woman=new JRadioButton("女");

//按钮

ok=new Button("确定");

cannel=new Button("取消");

ButtonGroup group=new ButtonGroup();

group.add(man);

group.add(woman);

//添加组件

p=new Panel();

p1=new Panel();

p2=new Panel();

p3=new Panel();

p.add(username);p.add(TFusername);

p1.add(password);p1.add(TFpassword);

p2.add(sex);p2.add(man);p2.add(woman);
p3.add(ok);
p3.add(cannel);
EnralFrame.setLayout(new GridLayout(4,1));

EnralFrame.add(p);

EnralFrame.add(p1);

EnralFrame.add(p2);

EnralFrame.add(p3);


}
public static void main(String[] args){

new Enral();
}
}
回复

使用道具 举报

千问 | 2007-9-4 12:51:04 | 显示全部楼层
没发现什么问题。。不过我把一些代码删了就能出来了。看比较一下,我怀疑是被遮住了。
/**
*
*/
package com.neu.test;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.Panel;
import java.awt.TextField;
import javax.swing.ButtonGroup;
import javax.swing.JRadioButton;

/**
* @author yuhl
*
*/
public class Enral {

Frame EnralFrame;//用户注册窗口
Label username,password,sex;//标签:用户名,密码,性别
TextField TFusername,TFpassword;//文本输入框:用户名,密码
JRadioButton man,woman;//单选框:男,女
Button ok,cannel;
Panel p,p1,p2,p3;
Enral(){

//主窗口

EnralFrame=new Frame("用户注册");

EnralFrame.setVisible(true);

EnralFrame.setLocation(250, 250);

EnralFrame.setSize(300,200);

//EnralFrame.setResizable(false);

//标签

username=new Label("用户名");

password=new Label("密"+""+"码");

sex=new Label("性"+""+"别");

//文本框

TFusername=new TextField(10);

TFpassword=new TextField(10);

//复选框


//添加组件

p=new Panel();

p1=new Panel();

p2=new Panel();

p3=new Panel();

p.add(username);p.add(TFusername);

p1.add(password);p1.add(TFpassword);


EnralFrame.setLayout(new GridLayout(4,1));

EnralFrame.add(p);

EnralFrame.add(p1);




}
public static void main(String[] args){

new Enral();
}

}
复制代码
回复

使用道具 举报

千问 | 2007-9-4 12:51:04 | 显示全部楼层
再DOS里2段代码都没问题
再eclipse里运行,我这边2段代码都不行,你那边能出来啊?不过把窗口最大化了,再还原,就可以正常显示了。以下是放大再还原的结果


1.gif (227.61 KB, 下载次数: 0)
下载附件
2007-12-6 21:08 上传

[ 本帖最后由 不杀生的狼 于 2007-12-6 21:14 编辑 ]
回复

使用道具 举报

千问 | 2007-9-4 12:51:04 | 显示全部楼层
我的能正常显示了。
回复

使用道具 举报

千问 | 2007-9-4 12:51:04 | 显示全部楼层
把这些放到最后

EnralFrame.setVisible(true);

EnralFrame.setLocation(250, 250);

EnralFrame.setSize(300,200);

//EnralFrame.setResizable(false);
回复

使用道具 举报

千问 | 2007-9-4 12:51:04 | 显示全部楼层
在你的窗口构造器里面先调用一下父类的构造器 super();试试看。
有时候可能是因为窗口没有刷新的原因,所以显示不出来。而当你拖放窗口的时候,窗口就会刷新,所以就能看到里面的东西了。
回复

使用道具 举报

千问 | 2007-9-4 12:51:04 | 显示全部楼层
一般来说,是先setSize,接着添加组件,然后pack,再设置location,最后setvisible。
回复

使用道具 举报

千问 | 2007-9-4 12:51:04 | 显示全部楼层
原帖由 greenflute 于 2007-12-8 03:16 发表
一般来说,是先setSize,接着添加组件,然后pack,再设置location,最后setvisible。

学习了!


回复

使用道具 举报

千问 | 2007-9-4 12:51:04 | 显示全部楼层
EnralFrame.setVisible(true);这句其实是MVC中controller的工作,简单的说,你的这段代码是构造一个窗体,然后显示,显然,构造窗体的位置大小控件布局,这些事情都是静态的,属于View的范围,而让它在当前桌面上显示,这个是动态的行为,属于Control的范围,所以建议你的代码,可以这样写
public class Enral {
private .....//declare members
public Enral() // default constructor
public void init()//initialize member value
public void active()//display current form
}
public static void main(String[] args){

Enral enral= new Enral();

enral.init();

enral.active();
}
以上并不是完全的mvc模式(没有加上model和controller),但是已经比你的代码好多了,试问,你把全部的代码都写在constructor里面,如果当前的form要刷新一下你怎么办?因为constructor是不能重复调用的,但是active()这样的可以。
你的这段代码工作完全没问题,但是既然是面对过程而不是面对对象的,你在维护时候的会比较吃力。
回复

使用道具 举报

千问 | 2007-9-4 12:51:04 | 显示全部楼层
你先setvisible了,窗口就出来了,然后添加组件什么的,窗口也知道了,可是你没让它刷新显示,也没有能触发刷新的事件,代码一行一行来,它都照做了。呵呵
建议一下,构造器内的工作可以抽成方法,看起来清晰许多
public Enral() {
JPanel p = initPanle();
runPanel(p);
}
void runPanel(JPanel p) {
JFrame jf = new JFrame();//init
jf.setDefaultCloseOperation(.....);//close operation
jf.setTitle(...);//title
jf.setSize(...);//size
jf.getContentPanel().add(p);//content
jf.pack();//validate
jf.setvisible(true);//show
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行