免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2854 | 回复: 5
打印 上一主题 下一主题

jframe 组件显示问题!!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-02-08 16:38 |只看该作者 |倒序浏览

  1. void jButton1_actionPerformed(ActionEvent e) {
  2.     username = jTextField1.getText();
  3.     password = jPasswordField1.getText();

  4.     try {
  5.       s = new Socket(host, 10000); //与服务器端建立连接

  6.       InputStreamReader isr;
  7.       //从服务器读取数据接口
  8.       isr = new InputStreamReader(s.getInputStream());
  9.       br = new BufferedReader(isr);
  10.       pw = new PrintWriter(s.getOutputStream(), true);

  11.       pw.println("Login");
  12.       pw.println(username);
  13.       pw.println(password);
  14.       String line = null;

  15.       if ( (line = br.readLine()) != null) {
  16.         if (line.startsWith(">>>loginSuccess")) {
  17.           success = true;
  18.         }
  19.         else {
  20.           success = false;
  21.         }
  22.       }
  23.       br.readLine();
  24.     }
  25.     catch (IOException ie) {
  26.       System.out.println("error: " + ie.toString());
  27.     }
  28.     finally {
  29.       try {
  30.         if (br != null) {
  31.           br.close();

  32.         }
  33.         if (pw != null) {
  34.           pw.close();

  35.         }
  36.         if (s != null) {
  37.           s.close();
  38.         }
  39.       }
  40.       catch (IOException oe) {
  41.       }
  42.     }

  43.     if (success) {
  44.       this.setVisible(false);
  45.       this.dispose();
  46.       ShopClientFrame frame = null;
  47.       frame = new ShopClientFrame(host);
  48.       frame.validate();
  49.       Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
  50.       Dimension frameSize = frame.getSize();
  51.       if (frameSize.height > screenSize.height) {
  52.         frameSize.height = screenSize.height;
  53.       }
  54.       if (frameSize.width > screenSize.width) {
  55.         frameSize.width = screenSize.width;
  56.       }
  57.       frame.setLocation( (screenSize.width - frameSize.width) / 2,
  58.                         (screenSize.height - frameSize.height) / 2);
  59.       frame.setVisible(true);
  60.       frame.now();//标志1
  61.     }
  62.     else {
  63.       d1 = new Dialog(this, "警告", true);
  64.       Panel p1 = new Panel();
  65.       p1.add(new Label("您无权进本系统!"));
  66.       Panel p2 = new Panel();
  67.       p2.add(jButton3);
  68.       d1.add("South", p2);
  69.       d1.add("Center", p1);
  70.       d1.setSize(200, 100);
  71.       d1.setLocation(400, 400);
  72.       d1.show();
  73.     }
  74.     System.out.println(username);
  75.     System.out.println(password);
  76.   }
复制代码


如上代码。。为一个按钮的动作。。(登录过程)

登录成功关闭此窗口。。实例化一个登录后的窗口。。

问题是在如上所示标志1处。。调用now()方法后。frame就不能显示上面的组件了(为什么?)

now()方法{
其中有一个阻塞函数

}


怎么解决?

帮我!!

论坛徽章:
0
2 [报告]
发表于 2006-02-08 16:52 |只看该作者
sakulagi!!!

知道你在图形方面很在行,,帮帮我。。

看了一些书。好像要用线程。。怎么做!??

论坛徽章:
0
3 [报告]
发表于 2006-02-09 12:37 |只看该作者
上边的程序中,因为frame.now()是写在一个EventHadler里的,所以把AWT的事件队列给block了。


SwingUtilities.InvokeLater(new Runnable() {public void run() {frame.now()}})

frame这个变量可能需要定义成final的变量。


上边只是一个示例代码。如果希望进一步了解InvokeLater(),可以看一下Java API Doc里相关的解释,还是很详细的。

这个问题很好,是一个很常见的关于线程的问题

论坛徽章:
0
4 [报告]
发表于 2006-02-09 12:43 |只看该作者
你都阻塞了,程序代码执行不下去了,怎么完成显示内容?

要阻塞也要放到新的线程里面去阻塞。不要妨碍frame代码的执行。

论坛徽章:
0
5 [报告]
发表于 2006-02-09 13:57 |只看该作者
谢谢两位斑竹!确如你们所说的!
昨天下午我也尝试了把它放在新线程中运行,成功了!!
下面是我的解决方法。。贴出来。。与大家共享!


  1. if (success) {
  2.       this.setVisible(false);
  3.       this.dispose();
  4.       try {
  5.         new Thread() {
  6.           public void run() {

  7.             ShopClientFrame frame = null;
  8.             frame = new ShopClientFrame(host);
  9.             frame.validate();
  10.             //Center the window
  11.             Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
  12.             Dimension frameSize = frame.getSize();
  13.             if (frameSize.height > screenSize.height) {
  14.               frameSize.height = screenSize.height;
  15.             }
  16.             if (frameSize.width > screenSize.width) {
  17.               frameSize.width = screenSize.width;
  18.             }
  19.             frame.setLocation( (screenSize.width - frameSize.width) / 2,
  20.                               (screenSize.height - frameSize.height) / 2);
  21.             frame.setVisible(true);
  22.             frame.now();
  23.           }
  24.         }.start();
  25.       }
  26.       catch (Exception ex) {
  27.         ex.printStackTrace();
  28.       }
  29.     }
复制代码


至于InvokeLater()这个方法。。我在研究研究/。。。。。
SwingUtilities.InvokeLater(new Runnable() {public void run() {frame.now()}})

这句话很好!!再次谢过

论坛徽章:
0
6 [报告]
发表于 2006-02-10 13:25 |只看该作者
好象很复杂的样子,研究中~~

PS:我是新来的,请大家多多指教!!!

[ 本帖最后由 pns-110 于 2006-2-10 13:33 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP