笔记:先前的UDP聊天程序改良版
博客专区 > 徐航 的博客 > 博客详情
笔记:先前的UDP聊天程序改良版
徐航 发表于5年前
笔记:先前的UDP聊天程序改良版
  • 发表于 5年前
  • 阅读 230
  • 收藏 3
  • 点赞 0
  • 评论 5

腾讯云 技术升级10大核心产品年终让利>>>   

 

代码着实写的很混乱,花了一天多一点的时间来写。遇到很多问题,通过google也解决了一点。 程序还有很多问题,同时打开两个会出现空指针异常。 
关于监听端口,接收端属于一个单独的类,于是要想监听指定的端口需要得到另一个类中的数据,这个数据需要用static修饰,这样才能被接收窗口类得到。 
将程序打成jar包:分别将源文件进行编译,在新建一个文件,在文件中输入:Main-Class: 包名.类名,然后回车。然后:jar -cvfm chat.jar chat.txt com 
 编程过程中遇到一个问题: JTextArea jta = new JTestArea(); JScrollPane jsp = new JScrollPane(jta); JScrollBar jsb = jsp.getVerticalScrollBar(); jsb.setValue(jsb.getMaximum()); 不能将jscrollbar滚动条保持在文本框的最底端,滚动条一直在中间。 并且测试的时候需要两次调用 jsb.setValue(jsb.getMaximum());才能实现滚动条在最底端。 http://www.oschina.net/question/860036_107149 后来在google上搜到一个方法,不过现在也不知道是什么原因。 http://tips4java.wordpress.com/2008/10/22/text-area-scrolling/ 
Based on my observations, when using JDK1.4.2, I have noticed that two requirements must be met for automatic scrolling: the append(…) must be done on the Event Dispatch Thread the caret must currently be positioned at the end of the text area before the append(…) method is invoked

 

  有时候真的很不想学习,一方面是对学的东西都没兴趣,另一方面有点自暴自弃的感觉,总感觉快毕业了却什么都不会。

  这学期课不多,而且好几门课都在期中就结课,其中一门要交一个网络编程的内容,这也是为什么花一天半来写这个破玩意。不过老师教的是C++,本来C++就好难,而且讲的一点头绪都没有,所以干脆不听。不过老师说也可以教java,所以,我可是肩负全宿舍的重任啊

  还是说说一个人写代码过程中遇到的一些问题吧。

==================代码很烂,但是还在学习嘛,慢慢进步撒==================

 

1、一个外部类A,要获取B类对象b的值,B中的b应该用public static 修饰。在google搜索的时候找到另一种方法:http://stackoverflow.com/questions/4089532/accessing-swing-components-of-another-class

 

In order to access the components of gameWindow in gameEngine you need a reference to it. So I assume that GameWindow class creates the instance of GameEngine. Then you can do something like this:
public class GameEngine{
      GameWindow window;
      public GameEngine(GameWindow gm){
           window = gm;
      }
 }
 public class GameWindow(){
     GameEngine ge = new GameEngine(this);
}

不过看了一会感觉整个人都绕进去了。然后又写了个类似的程序测试

public class Demo {
	Info info = null;
	public Demo(Info i){
		this.info = i;
	}
	public static void main(String[] args){
		Demo d1 = new Demo(new Info());
		System.out.println(d1.info.i);
	}
}
class Info{
	int i ;
	String name ;
	Demo d = new Demo(this);
	public Info(){
		this.i=123;
		this.name = "zhangsan";
	}	
}

 

Demo d1 = new Demo(new Info());

 

public class Test2 {
	public static void main(String[] args) {
		Info in = new Info();
		in.i = 10;
		in.name = "lisi";
	}
}

谁给讲讲,如果在其他类中有一个Info对象,并且对数据也进行过修改,Demo类或者其他的类要获取修改后的值用这种方法可以得到吗?

2、在接收端用DatagramSocket绑定端口的时候,并不是想一初始化就绑定一个端口,这样在打开第二个程序的时候绑定相同的端口会报错。于是就准备在程序打开的时候先出来一个对话框,要求输入监听的端口和目的端口,目的端口后面可以修改,监听端口不能。当输入监听端口后用刚才讲到的方法拿到输入的端口号并简单的判断下,此时才绑定端口。这样打开多个窗口只要输入的监听端口不一样并且和系统以及应用程序使用的端口号不重复就不会报错。

3、还有一个不好解决的问题就是关于滚动条的,当接收到的信息过多的时候会出现滚动条。但是滚动条一直保持在滚动栏的最顶端,这样如果要看到信接收的信息需要不停的拉动滚动条。在网上找到的方法是调用JScrollBar的setValue()方法,将值设为滚动条的最大值。

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.regex.Pattern;

import javax.swing.*;

public class Test1 extends JFrame{
	Container cont = this.getContentPane();
	JPanel jpanel = new JPanel();
	JTextArea jta = null;
	JScrollPane jsp = null;
	JScrollBar jsb = null;
	public Test1(){
		cont.setLayout(new BorderLayout());
		jpanel = new JPanel();
		jta = new JTextArea(5,5);
		for(int i =0 ;i<15;i++){
			jta.append(i+":++\r\n");
		}
		jsp = new JScrollPane(jta);
		jsb = jsp.getVerticalScrollBar();
		//光标移到文本末
		//jta.setCaretPosition(jta.getDocument().getLength());

		//设置滚动条位置
		/*----------------------------问题在这----------------------------*/
		jsb.setValue(jsb.getMaximum());
		jsb.setValue(jsb.getMaximum());
		/*----------------------------问题在这----------------------------*/
		jpanel.add(jsp);
		this.add(jpanel,BorderLayout.NORTH);
		this.setBounds(400, 200, 500, 450);
		this.setResizable(false);
		this.setVisible(true);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);	
	}
	public static void main(String[] args) {
		new Test1();
	}
}

问题是调用一次的话滚动条只是出现在滚动栏的中间部分,当调用两次就奇迹般的滚到最下面的。实在是不知道怎么搞。

同样,用google搜到说需要将光标移到文档末,一试,果然就好了。还是不知道怎么搞的。

4、编写过程中也有很多小问题,但是记不清了,不过慢慢的试并百度谷歌搜一下就解决了,所以写不出来了。

5、备忘一下吧,将程序打成jar包:

    ①编译,在源文件的目录中javac -d . Source.java。编译后的文件保存在当前目录下。

    ②编写配置文件,新建一个文件“doc”(文件名任意),在文件中输入Main-Class: cn.edu....Source

        Main-Class: 包名.包含main函数的类。冒号和包名之间有空格,并且在类的后面要回车

    ③打包,jar -cvfm des.jar doc cn

        des.jar是打包后的jar文件的文件名

        doc是配置文件

        cn是包名开头的那个文件夹,一般建包的时候都是按域名从大往小写,所以在cn文件夹下有edu文件夹

                直到包含class文件的目录,所以cn就包含了所有的class文件

  

标签: java udp swing thread 聊天
共有 人打赏支持
粉丝 16
博文 28
码字总数 19400
评论 (5)
LuckyWiky
加油
徐航

引用来自“LuckyWiky”的评论

加油

(* ̄︶ ̄*)谢
Timco
我也遇到,开启两个就会出现空指针异常,楼主发现是原因了没?
徐航

引用来自“Timco”的评论

我也遇到,开启两个就会出现空指针异常,楼主发现是原因了没?

应该不会啊,如果开启两个监听相同的端口倒是会报异常。
Timco

引用来自“徐航”的评论

引用来自“Timco”的评论

我也遇到,开启两个就会出现空指针异常,楼主发现是原因了没?

应该不会啊,如果开启两个监听相同的端口倒是会报异常。

谢了。应该是因为监听相同窗口的原因
×
徐航
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: