我正在使用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..
}
已创建,我填写的代码已执行。
提前感谢您的任何提示。
答案 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事件中输入我给它的代码。确保在您的班级中包含变量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 :(得分: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] ,.
您可以将此应用于整数或其他,只需将值保存在数组中并使用递增和重置变量。