Em mới học bắt sự kiện trong java , mọi người cho em hỏi là có phải hàm bắt xử kiện được sử lý ở một luồng riêng không ạ ? và sao em ko thấy phương thức gọi hàm bắ sự kiện ,
Cho em hỏi thêm là trong Graphics , em thấy có hàm paint(Graphics ) , sao em thấy mình overrid phương thức đó , nhưng ko gọi mà nó vẫn chạy là sao ạ . ai giải thích giúp em với
Có phải hàm bắt sự kiện được xử lý ở một luồng riêng không?
Bạn post đoạn code có xử lý sự kiện trong java lên để mọi người chỉ cho bạn chổ của hàm bắt sự kiện và luồng gì đó của nó.
đây anh ạ
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package demo.snack;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFrame;
/**
*
* @author haixo
*/
public class Main extends JFrame implements KeyListener {
private Snack s;
private Graphics g;
public Main(){
super("Snack");
this.setVisible(true);
this.setResizable(false);
this.setSize(600, 400);
this.setLocation(300, 200);
this.setLayout(null);
s = new Snack();
this.add(s.getHead());
s.getHead().setLocation(60,1);
s.getHead().setx(60);
s.getHead().sety(1);
s.getHead().setxLast(60);
s.getHead().setyLast(1);
this.add(s.getBody()[0]);
s.getBody()[0].setLocation(40,1);
s.getBody()[0].setx(40);
s.getBody()[0].sety(1);
s.getBody()[0].setxLast(40);
s.getBody()[0].setyLast(1);
this.add(s.getBody()[1]);
s.getBody()[1].setLocation(20,1);
s.getBody()[1].setx(20);
s.getBody()[1].sety(1);
s.getBody()[1].setxLast(20);
s.getBody()[1].setyLast(1);
this.addKeyListener(this);
this.run();
}
@Override
public void paint(Graphics g) {
g.setColor (Color.red);
g.drawRect (0,0,100,100);
g.clipRect (25, 25, 50, 50);
g.drawLine (0,100,100,0);
}
public void run(){
while(true){
if(s.getHead().getx()<1)
{
s.getHead().setx(580);
}
if(s.getHead().getx()>580)
{
s.getHead().setx(1);
}
if(s.getHead().gety()<1)
{
s.getHead().sety(380);
}
if(s.getHead().gety()>380)
{
s.getHead().sety(1);
}
s.getHead().setLocation(s.getHead().getx(),s.getHead().gety());
s.getBody()[0].setLocation(s.getHead().getxLast(), s.getHead().getyLast());
for(int i =1 ;i<s.getBody().length;i++){
s.getBody()[i].setLocation(s.getBody()[i-1].getxLast(), s.getBody()[i-1].getyLast());
}
s.getHead().setxLast(s.getHead().getX());
s.getHead().setyLast(s.getHead().getY());
for(int i=0;i<s.getBody().length;i++){
s.getBody()[i].setxLast(s.getBody()[i].getX());
s.getBody()[i].setyLast(s.getBody()[i].getY());
}
if(s.getState()==Snack.UP){
s.getHead().sety(s.getHead().getY()-20);
}
else if(s.getState()==Snack.DOWN){
s.getHead().sety(s.getHead().getY()+20);
}
else if(s.getState()==Snack.LEFT){
s.getHead().setx(s.getHead().getX()-20);
}
else if(s.getState()==Snack.RIGHT){
s.getHead().setx(s.getHead().getX()+20);
}
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyChar()=='a'){
s.setState(Snack.LEFT);
}
if(e.getKeyChar()=='d'){
s.setState(Snack.RIGHT);
}
if(e.getKeyChar()=='w'){
s.setState(Snack.UP);
}
if(e.getKeyChar()=='s'){
s.setState(Snack.DOWN);
}
}
@Override
public void keyReleased(KeyEvent e) {
}
public static void main(String[]args){
Main m = new Main();
}
}
Còn dây là đoạn code hàm paint à , em ko hiểu là sao mình ko gọi hàm paint mà nó vẫn chạy
import java.awt.Color;
import java.awt.Graphics;
// w ww. java 2 s .c om
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Main extends JPanel {
public void paint(Graphics g) {
g.setColor (Color.red);
g.drawRect (0,0,100,100);
g.clipRect (25, 25, 50, 50);
g.drawLine (0,100,100,0);
}
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.add(new Main());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(20,20, 500,500);
frame.setVisible(true);
}
}
Đây là hàm thêm sự kiện vào class.
gọi dòng này
this.addKeyListener
sẽ thêm vào đối tượng đc tạo ra của lớp này một phần xử lý nhấn phím. Và phần xử lý được đặt ngay trong lớp này (do class này implements KeyListener), nên đặt this ở trong ngoặc.
this.addKeyListener(this);
Cho e hỏi là có phải bắt buộc phải truyền this ko ạ ,hay chỉ cần truyền 1 class có implemets cái KeyListener là được ạ ?
Có thể truyền 1 đối tượng của class có implements cái KeyListener hoặc this (khi chính nó implements)
ok , thanks anh , nhân tiện anh cho em hỏi thêm cái này được không
import java.awt.Color;
import java.awt.Graphics;
// w ww. java 2 s .c om
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Main extends JPanel {
public void paint(Graphics g) {
g.setColor (Color.red);
g.drawRect (0,0,100,100);
g.clipRect (25, 25, 50, 50);
g.drawLine (0,100,100,0);
}
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.add(new Main());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(20,20, 500,500);
frame.setVisible(true);
}
}
sao em ko gọi hàm paint() mà nó vẫn chạy nhỉ ?
Hàm paint thuộc về phần giao diện của 1 component, nó tự chạy khi đối tượng được tạo ra.
Khi muốn thay đổi phần giao diện mặc định của một component thì ta có thể kế thừa class của component đó để thay đổi trong hàm paint.
http://docs.oracle.com/javase/tutorial/uiswing/painting/index.html
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?