30/09/2018, 18:19

Có phải hàm bắt xử kiện được sử lý ở một luồng riêng không?

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

... viết 20:29 ngày 30/09/2018

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ó.

ĐỨC LINH viết 20:30 ngày 30/09/2018

đâ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 LINH viết 20:19 ngày 30/09/2018

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);
  }
}
... viết 20:32 ngày 30/09/2018

this.addKeyListener(this);

Đâ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);
ĐỨC LINH viết 20:34 ngày 30/09/2018

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 ạ ?

... viết 20:19 ngày 30/09/2018

Có thể truyền 1 đối tượng của class có implements cái KeyListener hoặc this (khi chính nó implements)

ĐỨC LINH viết 20:30 ngày 30/09/2018

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ỉ ?

... viết 20:30 ngày 30/09/2018

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

Bài liên quan
0