phân biệt paint(Graphics g ) và paintComponent(Graphics g)

0 nhận xét
Lần trước tôi đã dùng Applet để viết 1 tấm ảnh có thể chạy được, lần này tôi viết tấm ảnh chạy trên JPanel . dưới đssy là code mẫu , không phải toàn bộ project

Đây source code mẫu

import java.awt.Graphics;
import java.awt.Color;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
public class Heart extends JPanel{
    private ImageIcon heart;
    private static int x = 10;   
    private Tuyen1 t ;
    Heart(){
        heart = new ImageIcon("heart.png");        
        setBackground(Color.WHITE);
        t = new Tuyen1();          
        t.start();
    }
    public void paintComponent(Graphics g){
        super.paintComponent( g ); // nếu thiếu dòng này sẽ k đẹp.
        heart.paintIcon(this,g,x,10);
    }   
    public class Tuyen1 extends  Thread{
        public void run(){
            try {
                        sleep( 1*1000);
                    }catch (InterruptedException e) {}
            while(true){
                while ( x <500){    
                    x +=1;                   
                    try {
                        sleep( 1*10);
                    }catch (InterruptedException e) {}
                        repaint();
                }   
                while ( x >10){    
                    x -=1;                   
                    try {
                        sleep( 1*10);
                    }catch (InterruptedException e) {}
                        repaint();
                }                  
            }
        }
    }    
}
Các bạn hãy chú ý là nếu chạy trên Applet thì hảnh ta thấy sẽ bị giựt , còn nếu dùng hàm paintComponent(Graphics g) thì ảnh chuyển động sẽ mượt hơn. các bạn có thể thử
Mến chào các bạn.

SocketServer và Socket

0 nhận xét
viết giao diện để dùng ServerSocket và Socket
PHÀN SERVERSOCKET
Giao diện
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JScrollPane;
import java.awt.BorderLayout;
public class Panel extends JPanel{
    public JTextArea text = new JTextArea();
    Panel(){
        BorderLayout Layout = new BorderLayout();
        setLayout(Layout);        
        JScrollPane js = new JScrollPane(text);        
        add(js,Layout.CENTER);
    }
}
Hoạt động
import javax.swing.JFrame;
import java.awt.BorderLayout;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Server{
    static Panel p = new Panel();       
    private static final int port = 8000;     
    public static void main(String args[]){
        ServerSocket serverSocket = null;
        DataInputStream dataInputStream = null;
        DataOutputStream dataOutputStream = null; 
        JFrame f = new JFrame();        
        f.setTitle("Server");
        f.setLayout(new BorderLayout());
        f.setSize(300,300);        
        f.add(p);        
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
        try{            
            serverSocket = new ServerSocket(port);                                 
            Socket clientSocket = serverSocket.accept();                 
            dataInputStream = new DataInputStream(clientSocket.getInputStream());
            dataOutputStream = new DataOutputStream(clientSocket.getOutputStream());
        }
        catch(IOException e){            
        }    
        try{
            dataOutputStream.writeUTF("Welcome to the TCP Echo  Server!");
            String input;
            while(true)    {                
                input = dataInputStream.readUTF();
                p.text.append("Received:  " + input+"\n");                  
            }
        }
        catch(IOException e){
            p.text.append("Client disconnected from server\n");
        }        
    }    
}    
PHẦN SOCKET
Giao diện
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import java.awt.BorderLayout;
public class Panel extends JPanel{
    public JTextArea text = new JTextArea();
    public JTextField t = new JTextField();
    public String a = new String();
    Panel(){
        BorderLayout L = new BorderLayout();
        setLayout(L);        
        JScrollPane js = new JScrollPane(text);        
        add(js,L.CENTER);
        add(t,L.SOUTH);           
    }    
}
hoạt động 
import java.net.Socket;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.awt.BorderLayout;
import javax.swing.JFrame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Client{
    public static class TCPEchoReader extends Thread
    {
        boolean active;
        public TCPEchoReader(DataInputStream input) {
            dataInputStream = input;
            boolean active = true;
        }    
        public void run() {
            while(active)    {
                try    {
                    String message = dataInputStream.readUTF();  
                    if (message != null){
                        p.text.append("Server: "+message+"\n");
                    }
                }
                catch(IOException e) {                    
                }
            }
        }
    }    
    static Panel p = new Panel();      
    static Socket socket;
    static DataInputStream dataInputStream = null;
    static DataOutputStream dataOutputStream = null;
    public static void main(String[] args)    {        
        BorderLayout L = new BorderLayout();
        JFrame f = new JFrame();        
        f.setTitle("CLient");
        f.setLayout(L);
        f.setSize(300,300);        
        f.add(p,L.CENTER);        
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
        String address = "127.0.0.1";
        int port = 8000;        
        Socket socket = null;        
        try
        {
            socket = new Socket(address, port);        
            dataInputStream = new DataInputStream(socket.getInputStream());
            dataOutputStream = new DataOutputStream(socket.getOutputStream());         
        }
        catch(IOException e)        {
        }             
        TCPEchoReader reader = new TCPEchoReader(dataInputStream);
        reader.setDaemon(true);
        reader.start();        
            p.t.addActionListener( 
                new ActionListener(){
                public void actionPerformed( ActionEvent event ) {
                    p.a = event.getActionCommand() ;
                    p.text.append("Sent: "+p.a+"\n");
                    p.t.setText("");
                    try    {                          
                          dataOutputStream.writeUTF(p.a);                  
                          p.a ="";                         
                    } catch(IOException e){
                    }
                }
           } 
        );         
    }    
}

comment nha Vũ

2 nhận xét

ý tưởng

làm 1 tấm ảnh có cảm giác đang chạy trong JFrame
- lợi dụng khả năng lưu ảnh cuả mắt , ta làm như sau : tại vị trĩ x,y ta vẽ 1 hình , sau chu kì T ta xóa nó rồi vẽ nó ở chỗ x+i,y+i
- viết applet, dùng hàm paint( Graphics g), repaint() để vẽ lại , dùng Thread để vết chu kì

ví dụ mẫu

import java.awt.Graphics;
import javax.swing.ImageIcon;
import java.applet.Applet;
import java.awt.BorderLayout;
public class Heart extends Applet{
    private ImageIcon heart;
    private static int x = 10;   
    private Tuyen1 t ;
    public void init(){
        heart = new ImageIcon("heart.png");
        t = new Tuyen1();
        setLayout(new BorderLayout());       
    }    
    public void start(){
        t.start();
    }
    public void paint(Graphics g){
        heart.paintIcon(this,g,x,10);
    }
    public static void main(String[] args) {
           Heart it = new Heart();
    } 
    public class Tuyen1 extends  Thread{
        public void run(){
             try {
                        sleep( 1*1000);
                    }catch (InterruptedException e) {}
            while(true){
                while ( x <500){    
                    x +=4;                   
                    try {
                        sleep( 1*50);
                    }catch (InterruptedException e) {}
                        repaint();
                }   
                while ( x >10){    
                    x -=4;                   
                    try {
                        sleep( 1*50);
                    }catch (InterruptedException e) {}
                        repaint();
                }                  
            }
        }
    }    
}

mời gọi

mong các bạn cho đánh giá khuyết điểm và đưa ra giải thuật hay hơn.
Copyright 2011 learn java.
Blogger Template by Noct. Free Download Blogger Template