2012-04-01 43 views
5

Tôi đang làm việc với Netbeans IDE trong Java.Làm thế nào để gọi một hàm khi tôi bấm vào một jPanel (Java)?

Tôi có biểu mẫu với một JPanel. Mỗi JPanel có một gridLayout 3x3 và ở mỗi nơi có một hình ảnh đại diện cho một số [0,1,2,3,4,5,6,7,8] (hình ảnh được tạo ra được sử dụng một lớp tùy chỉnh, không chỉ phù hợp hình ảnh trong phòng thí nghiệm).

Tôi muốn có thể trao đổi hai hình ảnh trong bảng điều khiển khi người dùng nhấp vào chúng (Nhấp chuột đầu tiên: không có hành động, nhấp chuột thứ hai: chuyển đổi hai hình ảnh được trang bị trong thành phần jPanel).

Tôi đã tạo một hàm exchangeComponents và với một mã kiểm tra (như:

exchangeComponents (0,8,jPanel1) 

nó trao đổi một cách chính xác những hình ảnh nằm trong position1 (hàng 1, cột 1) và trong position2 (hàng 3, cột thứ 3) .

chức năng một creted như sau:

public void exchangeComponents(int component1,int component2,JPanel jpanel){ 
    try{ 
    Component aux1 = jpanel.getComponent(component1); 
    Point aux1Loc = aux1.getLocation(); 
    Component aux2 = jpanel.getComponent(component2); 
    Point aux2Loc = aux2.getLocation(); 
    aux1.setLocation(aux2Loc); 
    aux2.setLocation(aux1Loc); 
    } 
    catch (java.lang.ArrayIndexOutOfBoundsException ex){ /* error! bad input to the function*/ 
     System.exit(1); 
    } 
} 

tôi cho rằng tôi neeed để có một sự kiện gọi exchangeComponents function() khi c dùng liếm trên một trong những hình ảnh trên jPanel1 nhưng làm thế nào tôi nên làm điều đó? và cách kiểm tra thành phần (hình ảnh) nào người dùng đã chọn? Tôi chỉ biết rằng khi tôi tạo ra một nút nếu một nhấp chuột vào nó (từ IDE) một sự kiện như

private void button1ActionPerformed(java.awt.event.ActionEvent evt) { 
// some code.. 
} 

được tạo ra và mã tôi điền vào được thực thi.

Cảm ơn bạn trước vì bất kỳ gợi ý nào.

Trả lời

4

Bạn cần phải thêm người nghe chuột tương tự cho tất cả các bạn JLabels hoặc bất cứ điều gì bạn có chứa các hình ảnh của bạn, như:

img1.addMouseListener(this); 
img2.addMouseListener(this); 

, vv, Sau đó phát hiện mà JLabel bạn nhấp với MouseEvent.getSource();, như thế này

boolean hasclicked1=false; 
JLabel click1label=null; 

public void mouseClicked(MouseEvent me){ 
    if(!hasclicked1){ //clicked first pic 
    hasclicked1 = true; 
    click1label = (JLabel) me.getSource(); 
    } else { //clicked second pic 
    hasclicked1 = false; 
    exchangeComponents(click1label, (JLabel) me.getSource(), /*your jpanel here*/); 
    } 
    //now change exchangeComponents so it uses JLabels as parameters 
public void exchangeComponents(JLabel component1, JLabel component2, JPanel jpanel){ 
    try{ 
    Component aux1 = component1; 
    Point aux1Loc = aux1.getLocation(); 
    Component aux2 = component2; 
    Point aux2Loc = aux2.getLocation(); 
    aux1.setLocation(aux2Loc); 
    aux2.setLocation(aux1Loc); 
    } catch (java.lang.ArrayIndexOutOfBoundsException ex) { /* error! bad input to the function*/ 
    System.exit(1); 
    } 
} 

Nếu bạn không sử dụng JLabels cho những hình ảnh tuy nhiên, thay JLabel trong mã với bất cứ điều gì bạn đang sử dụng ...

EDIT: Xin lỗi, tôi không nghĩ rằng tôi đã làm điều này không rõ ràng, nhưng lớp học của bạn với phương thức exchangeComponents phải triển khai MouseListener. Sau đó, trong sự kiện mouseClicked đặt mã tôi đã cho nó. Đảm bảo bao gồm các biến số hasclicked1click1label trong lớp học của bạn. Biến bạn thành lớp học như thế này

public class ComponentExchanger implements MouseListener { 
boolean hasclicked1=false; 
JLabel click1label=null; 
JPanel mainPanel; 
public ComponentExchanger(){ 
    //create JFrame, JPanel, etc. 
    JFrame f=new JFrame(); 
    //etc. 
    mainPanel=new JPanel(); 
    f.add(mainPanel); 
    //set layout of panel, etc. 
    for(int i=0;i<9;i++){ 
     JLabel l=new JLabel(/*label image here*/); 
     Point loc=new Point(/*coordinates here*/); 
     l.setLocation(loc); 
     mainPanel.add(l); 
     /*more code*/ 
     f.setVisible(true); 
    } 
} 

public static void main(String args[]){ 
    new ComponentExchanger(); 
} 


public void mouseClicked(MouseEvent me){ 
    if(!hasclicked1){ //clicked first pic 
    hasclicked1 = true; 
    click1label = (JLabel) me.getSource(); 
    } else { //clicked second pic 
    hasclicked1 = false; 
    exchangeComponents(click1label, (JLabel) me.getSource(), mainPanel); 
    } 
    //now change exchangeComponents so it uses JLabels as parameters 
public void exchangeComponents(JLabel component1, JLabel component2, JPanel jpanel){ 
    try{ 
    Component aux1 = component1; 
    Point aux1Loc = aux1.getLocation(); 
    Component aux2 = component2; 
    Point aux2Loc = aux2.getLocation(); 
    aux1.setLocation(aux2Loc); 
    aux2.setLocation(aux1Loc); 
    } catch (java.lang.ArrayIndexOutOfBoundsException ex) { /* error! bad input to the function*/ 
    System.exit(1); 
    } 
} 

//Also, you will need to include the other mouselistener implemented methods, just 
//leave them empty 
} 
+0

Cảm ơn bạn. Nó rất rõ ràng .. nhưng với img1.addMouseListener (điều này); Tôi vượt qua hình thức itselft và nó nói "Lỗi: MouseListener dự kiến". Vậy cái gì? – dragonmnl

+0

tốt, tôi đã làm nó (thực hiện một lớp getComponent thực hiện MouseListener) và sử dụng img1.addMouseListener (new ComponentListener()). Vấn đề bây giờ là .. Tôi đã thêm người nghe cho mỗi thành phần nhưng khi tôi nhấp vào bất kỳ thành phần nào (Hình ảnh) sự kiện không được kích hoạt ở tất cả – dragonmnl

+0

Xin lỗi, tôi không nghĩ rằng tôi đã làm rõ điều đó, nhưng lớp học của bạn cần thực hiện MouseListener, sau đó bạn cần phải thêm người nghe vào từng thành phần của bạn đang được chuyển xung quanh. @dragonml – DankMemes

1

Trước hết, để kỹ thuật, đó là phương pháp không hoạt động. Có một số cách bạn có thể thực hiện việc này. Bạn có thể tiếp tục với actionListener, nhưng sau đó bạn có thể sẽ cần các nút hoặc một cái gì đó. Hoặc bạn có thể sử dụng MouseListener và phát hiện các nhấp chuột trên một vùng nhất định của bảng điều khiển. Đối với thuật toán chuyển đổi, có thể là một mảng gồm 2 hình ảnh. Có một biến tăng lên 1 lần mỗi nhấp chuột. Khi biến là 2, nó sẽ đặt lại về 0.

clicks++; //every time the mouse is clicked; clicks starts out at 0 
if(clicks == 2){ 
clicks = 0; //at the end of the listener method 
} 

Khi lần đầu tiên nhấp vào hình ảnh được nhấp vào khe mảng đầu tiên, bởi vì người dùng đã nhấp một lần.

clickImage = imageArray[clicks]; 

Khi nhấp chuột thứ hai, hình ảnh được nhấp khác đi vào khe mảng thứ hai, vì đã phát hiện 2 nhấp chuột. Trong trường hợp này, phương thức exchangeComponents của bạn sẽ đi vào cuối phương thức listener, với các đối số là imageArray [1], imageArray [2],.

Bạn có thể áp dụng điều này cho int hoặc bất cứ điều gì, chỉ cần lưu giá trị trong một mảng và sử dụng biến gia tăng và đặt lại.

Các vấn đề liên quan