下面聊天室的程序源代码中用户的信息用了两个类Node类和UserLinkList类来实现。
可不可以只用一个类来实现这些功能呢?用LinkedList类实现可以吗?谢谢!Node.java
import java.net.*;
import java.io.*;/**
*用户链表(单链表)的结点类,定义了链表中的用户。
*/
public class Node {
String username = null;
Socket socket = null;
ObjectOutputStream output = null;
ObjectInputStream input = null;
Node next = null;
}UserLinkList.java
/**
* 用户链表结点的具体实现类。该类通过构造函数构造用户链表,定义了添加用户、删除用户、返回用户数、根据
* 用户名查找用户、根据索引查找这5个方法
*/
public class UserLinkList {
Node root;
Node pointer;
int count;
/**
* 构造用户链表
*/
public UserLinkList(){
root = new Node();
root.next = null;
pointer = null;
count = 0;
}
/**
* 添加用户
*/
public void addUser(Node n){
pointer = root;
while(pointer.next != null){
pointer = pointer.next;
}
pointer.next = n;
n.next = null;
count++;
}
/**
* 删除用户
*/
public void delUser(Node n){
pointer = root;
while(pointer.next != null){
if(pointer.next == n){
pointer.next = n.next;
count --;
break;
}
pointer = pointer.next;
}
}
/**
* 返回用户数
*/
public int getCount(){
return count;
}
/**
* 根据用户名查找用户
*/
public Node findUser(String username){
if(count == 0) return null;
pointer = root;
while(pointer.next != null){
pointer = pointer.next;
if(pointer.username.equalsIgnoreCase(username)){
return pointer;
}
}
return null;
}
/**
* 根据索引查找用户
*/
public Node findUser(int index){
if(count == 0) {
return null;
}
if(index < 0) {
return null;
}
pointer = root;
int i = 0;
while(i < index + 1){
if(pointer.next != null){
pointer = pointer.next;
}
else{
return null;
}
i++;
}
return pointer;
}
}
可不可以只用一个类来实现这些功能呢?用LinkedList类实现可以吗?谢谢!Node.java
import java.net.*;
import java.io.*;/**
*用户链表(单链表)的结点类,定义了链表中的用户。
*/
public class Node {
String username = null;
Socket socket = null;
ObjectOutputStream output = null;
ObjectInputStream input = null;
Node next = null;
}UserLinkList.java
/**
* 用户链表结点的具体实现类。该类通过构造函数构造用户链表,定义了添加用户、删除用户、返回用户数、根据
* 用户名查找用户、根据索引查找这5个方法
*/
public class UserLinkList {
Node root;
Node pointer;
int count;
/**
* 构造用户链表
*/
public UserLinkList(){
root = new Node();
root.next = null;
pointer = null;
count = 0;
}
/**
* 添加用户
*/
public void addUser(Node n){
pointer = root;
while(pointer.next != null){
pointer = pointer.next;
}
pointer.next = n;
n.next = null;
count++;
}
/**
* 删除用户
*/
public void delUser(Node n){
pointer = root;
while(pointer.next != null){
if(pointer.next == n){
pointer.next = n.next;
count --;
break;
}
pointer = pointer.next;
}
}
/**
* 返回用户数
*/
public int getCount(){
return count;
}
/**
* 根据用户名查找用户
*/
public Node findUser(String username){
if(count == 0) return null;
pointer = root;
while(pointer.next != null){
pointer = pointer.next;
if(pointer.username.equalsIgnoreCase(username)){
return pointer;
}
}
return null;
}
/**
* 根据索引查找用户
*/
public Node findUser(int index){
if(count == 0) {
return null;
}
if(index < 0) {
return null;
}
pointer = root;
int i = 0;
while(i < index + 1){
if(pointer.next != null){
pointer = pointer.next;
}
else{
return null;
}
i++;
}
return pointer;
}
}
String name;
}class UserList{
private LinkedList<User> users;
public UserList(){
users = new LinkedList();
}
public void addUser(User user){
users.add(user);
}
public int getCount(){
return users.size();
}
public User findUser(String name){
for(User user:users){
if(user.name.equals(name)){
return user;
}
}
return null;
}
}
可不可以只用一个类来实现这些功能呢?只要定义一个class User{..}来表示一个用户就行了.(但要注意:要重写类User中的equals方法,即:当两个User对象的name相同时返回true,否则返回false就行了
)
private LinkedList <User> users;出现错误提示如下:
-The type LinkedList is not generic; it cannot be parameterized with arguments<User>
-Syntax error,parameterized types are only available if source level is 5.0
用的是Eclipse 3.2.2,JDK是1.6.0啊,为什么会出现这种情况呢?以前听说过这种问题主要是Eclipse自身有一个JRE,但我忘了怎么改了,请问怎么改呢?谢谢!
为什么我的下面这段代码在dos黑窗口编译输出显示的窗体是设定的图标"icon.gif",而在Eclipse窗口中输出的却仍然是Java的咖啡杯标识。
public class ChatServer extends JFrame{
public static void main(String[] args) {
new ChatServer();
} public ChatServer() {
Toolkit kit = Toolkit.getDefaultToolkit();
Image img = kit.getImage("icon.gif");
this.setIconImage(img); }
}
代码片断: Toolkit toolkit = Toolkit.getDefaultToolkit();
image = toolkit.getImage("c:/t1.jpg");//装入图标文件
MediaTracker mediaTracker = new MediaTracker(this);
mediaTracker.addImage(image, 0);
try
{
mediaTracker.waitForID(0);
}
catch (InterruptedException ie)
{
System.err.println(ie);
System.exit(1);
}
System.out.println("icon:"+image+" wid:"+image.getWidth(null)+" hei:"+ image.getHeight(null));
this.setIconImage(image);
MediaTracker mediaTracker = new MediaTracker(this);
mediaTracker.addImage(image, 0);
try
{
mediaTracker.waitForID(0);
}
catch (InterruptedException ie)
{
System.err.println(ie);
System.exit(1);
}
System.out.println("icon:"+image+" wid:"+image.getWidth(null)+" hei:"+ image.getHeight(null));这一大段代码起什么作用呢?貌似无关,难道我的程序中因为没有这一段而没法将图标显示出来?
这个动作是启动另外一个线程来异步装入的,
与你的下一个动作: this.setIconImage(img); 是并发执行的. 因此:完全可能在:setIconImage(img); 时,由于img还没有准备好(此时:img实际是null),从而导致仍是默认的icon.我有几次都是遇到这种情况.
而加上:这一段代码,含义是:等待装入Image的线程完全装载入image之后(此时:img是有效时),才继续执行: this.setIconImage(img);
注:有时:不同的图形文件类型,有些是不能作为icon设置的.如:t1.bmp类型文件,我在setIconImage(img); 时就没有成功.(原因待定)