筆記:先前的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文件

相關文章
相關標籤/搜索