单击jPanel(Java)时如何调用函数?

时间:2012-04-01 18:25:07

标签: java events components jpanel

我正在使用Java中的Netbeans IDE。

我有一张带有一个JPanel的表单。 每个JPanel都有一个gridLayout 3x3,每个地方都有一个代表数字[0,1,2,3,4,5,6,7,8]的图像(图像创建时使用的是自定义类,而不仅仅是拟合实验室中的图像。)

我希望能够在用户单击时在面板中交换两个图像(首先单击:无操作,第二次单击:切换jPanel组件中的两个图像)。

我已经创建了一个函数exchangeComponents和一个测试代码(如:

exchangeComponents (0,8,jPanel1)

正确交换位置1(第1行,第1列)和第2列(第3行,第3列)的图像。

创作的功能如下:

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);
   }
}

我想我需要有一个事件,当用户点击jPanel1上的一个图像时调用函数exchangeComponents()但是我应该怎么做?以及如何检查用户选择的组件(图像)? 我只知道当我创建一个Button时,如果点击它(来自IDE)就像

这样的事件
 private void button1ActionPerformed(java.awt.event.ActionEvent evt) {  
// some code..
}

已创建,我填写的代码已执行。

提前感谢您的任何提示。

2 个答案:

答案 0 :(得分:5)

您需要为所有JLabel或您拥有的图像容器添加相同的鼠标侦听器,例如:

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

等,然后检测您使用MouseEvent.getSource();点击了哪个Jlabel,就像这样

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);
  }
}

如果您没有使用JLabel作为图像,请将代码中的JLabel替换为您正在使用的任何内容...

编辑:抱歉,我认为我不清楚这一点,但是使用方法exchangeComponents的类必须实现MouseListener。然后,在mouseClicked事件中输入我给它的代码。确保在您的班级中包含变量hasclicked1click1label。让你上课类似

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
}

答案 1 :(得分:1)

首先,技术上它的方法不是功能。 有几种方法可以做到这一点。你可以继续使用actionListener,但是你可能需要按钮或其他东西。 或者您可以使用MouseListener,并检测面板特定区域的点击次数。 对于切换算法,可能是2个图像的阵列。有一个变量每次点击增加1。当变量为2时,它将重置为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
}

第一次单击时,单击的图像进入第一个数组插槽,因为用户单击了一次。

clickImage = imageArray[clicks];

在第二次单击时,另一个单击的图像将转到第二个阵列插槽,因为已检测到2次单击。在这种情况下,您的exchangeComponents方法将在侦听器方法的末尾,参数为imageArray [1],imageArray [2] ,.

您可以将此应用于整数或其他,只需将值保存在数组中并使用递增和重置变量。