笔记:先前的UDP聊天程序改良版

 

代码着实写的很混乱,花了一天多一点的时间来写。遇到不少问题,经过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

 

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

  这学期课很少,并且好几门课都在期中就结课,其中一门要交一个网络编程的内容,这也是为何花一天半来写这个破玩意。不过老师教的是C++,原本C++就好难,并且讲的一点头绪都没有,因此干脆不听。不过老师说也能够教java,因此,我但是肩负全宿舍的重任啊编程

  仍是说说一我的写代码过程当中遇到的一些问题吧。网络

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

 

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

 

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);
}

不过看了一会感受整我的都绕进去了。而后又写了个相似的程序测试wordpress

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类或者其余的类要获取修改后的值用这种方法能够获得吗?函数

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

三、还有一个很差解决的问题就是关于滚动条的,当接收到的信息过多的时候会出现滚动条。可是滚动条一直保持在滚动栏的最顶端,这样若是要看到信接收的信息须要不停的拉动滚动条。在网上找到的方法是调用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();
	}
}

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

一样,用google搜到说须要将光标移到文档末,一试,果真就行了。仍是不知道怎么搞的。

四、编写过程当中也有不少小问题,可是记不清了,不过慢慢的试并百度谷歌搜一下就解决了,因此写不出来了。

五、备忘一下吧,将程序打成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文件

相关文章
相关标签/搜索