setLocation()和setBounds()方法用于JButton在特定情况下不起作用



我在这个论坛上发现了类似的问题,但它们并不是我的问题。我有一个带有绝对布局的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打电话,否则它是其自己的问题

最新更新