我在这个论坛上发现了类似的问题,但它们并不是我的问题。我有一个带有绝对布局的jpanel,在该面板上,我有两个jbuttons。一个称为 SwapButton ,它交换了同一面板上的两个按钮的位置,另一个按钮是 opentbutton ,它打开图像对该图像进行一些处理,并在该图像上进行一些处理同一面板,然后调用 swapbutton.doclick()。
OpenButton执行的动作代码:
private void openButtonActionPerformed(java.awt.event.ActionEvent evt) {
FileDialog filedialog = new FileDialog(GameFrame.this,"Open File",FileDialog.LOAD);
filedialog.setVisible(true);
try{
if(filedialog.getFile() != null){
filename = filedialog.getDirectory() + filedialog.getFile();
file = new File(filename);
File deleteFile = new File(defaultPath.toString());
deleteFile.delete();
Files.copy(file.toPath(),defaultPath);
file = new File(defaultPath.toString());
imageSelected = true;
newGame = true;
cropImage();
setImage();
}
}
catch(IOException e){}
if(imageSelected){
setCombination();
swapButton.doClick();
moves = 0;
msgLabel.setText("");
}
}
Swapbutton执行的动作代码:
private void swapButtonActionPerformed(java.awt.event.ActionEvent evt) {
int n = Integer.valueOf(numText.getText()); //gets value from a text area
swapButton(n);
}
Swapbutton方法的代码:
void swapButton(int i)
{
javax.swing.JButton button1 = buttonList[i], button2 = emptyButton;
int x1 = button1.getX(), y1 = button1.getY();
int x2 = button2.getX(), y2 = button2.getY();
button1.setLocation(x2, y2);
button2.setLocation(x1, y1);
int p1 = pos[i], p2 = pos[8];
pos[i] = p2;
pos[8] = p1;
arr[p1] = 8;
arr[p2] = i;
moves++;
}
我为目的的单独方法编码了Swapbutton执行的动作。
问题是,当我单击 opentbutton 时,该按钮的所有操作都可以正常工作,并且 swapbutton.doclick()也被调用,但是按钮的位置在我的jpanel中保持不变,而不是调用 setLocation() swapbutton()方法中的方法。但是,当我单击 swapbutton 时, swapbutton()方法中的所有操作都很好。我还尝试调用 swapbutton.doclick()从代码的其他区域进行调用,并且效果很好。
我打印了 setLocation()方法 swapbutton()方法,使用 getLocation()这些按钮的新位置,但我的Jframe中这些按钮的位置没有变化。我还尝试使用 setBounds()和 getBounds()方法并获得了相同的结果。
有些错误吗?还是我做了一些问题?
首先,绝对布局没有布局管理器或null布局管理器。这绝对是不推荐的。对于任何开始或中间的摆动程序员,您本质上应该永远不要使用绝对的布局。如果我这样做,我可能会创建自己的java.aw.awt.layoutmanager界面的自定义实现,并将该实现一个Swap()方法。这将使我的自定义布局管理器中所有封装的位置交换内容。但这不是你问的。
很难没有更多详细信息回答您的问题,但是您是否需要调用Swapbutton的Doclick()方法?如果对用户来说,看到按钮似乎在屏幕上将按钮似乎很重要,您会称呼这一点。[doclick()的默认屏幕推拉长度为68毫秒,顺便说一句,在此期间,EDT*将被冷冻。方法直接。这样, openbutton 的东西不取决于 swapbutton 的侦听器的时间的时间。
如果您将Swapbutton.doclick()替换为SwapButtonActionPerformed()是否可以更好地工作?
其他要注意的东西是,您正在执行所有这些位置交换事件派遣线程(EDT)上的内容。从您的描述中,没有迹象表明您不是在EDT上运行,但是我们无法确定而不看到其余的代码。因此SSCCE的有用性
*脚注:除非您不从EDT打电话,否则它是其自己的问题