Как вызвать функцию, когда я нажимаю на jPanel (Java)? - PullRequest
5 голосов
/ 01 апреля 2012

Я работаю с IDE Netbeans в Java.

У меня есть форма с одним 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);
   }
}

Полагаю, мне нужно событие, которое вызывает функцию exchangeComponents (), когда пользователь нажимает на одно из изображений на jPanel1, но как мне это сделать? а как проверить какие компоненты (изображения) выбрал пользователь? Я просто знаю, что когда я создаю кнопку, если нажать на нее (из IDE) событие, подобное

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

создан и код, который я заполняю, выполняется.

Заранее благодарим за любую подсказку.

Ответы [ 2 ]

5 голосов
/ 01 апреля 2012

Вам необходимо добавить один и тот же прослушиватель мыши для всех ваших JLabels или любого контейнера, который у вас есть для ваших изображений, например:

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

и т. Д., А затем определить, на какой Jlabel вы нажали MouseEvent.getSource();, например,this

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

Если вы не используете JLabels для изображений, замените JLabel в коде тем, что вы используете ...

РЕДАКТИРОВАТЬ: Извините,Я не думаю, что я сделал это неясным, но ваш класс с методом exchangeComponents должен реализовать MouseListener.Затем в событие mouseClicked поместите код, который я дал для него.Обязательно включите переменные hasclicked1 и click1label в ваш класс.Заставить вас заняться чем-то вроде этого

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 голос
/ 01 апреля 2012

Прежде всего, если быть техническим, то это методы , а не функции. Есть несколько способов сделать это. Вы можете использовать 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],.

Вы можете применить это к целым числам или к чему угодно, просто сохраните значение в массиве и используйте переменную с приращением и сбросом.

...