在JPanels限制内移动JLabel(认为这是一个数学问题)JAVA

在JPanels限制内移动JLabel(认为这是一个数学问题)JAVA,java,swing,user-interface,jpanel,jlabel,Java,Swing,User Interface,Jpanel,Jlabel,此外,这也可能有助于其他想要移动jlabel的人 因此,情况如下: 1个JPanel,其中包含一个项目 1 JLabel,其中有一个Img作为图标 我想在面板周围移动JLabel,但不要超出面板的边界(这样用户可以看到屏幕上的所有图像) 代码如下: 我在那里: int randH = 0; int randW = 0; int targetHeight = 0; int targetWidth = 0; 然后,当面板根据加载的(目标/IMG)打开时: targetHeight = jL

此外,这也可能有助于其他想要移动jlabel的人

因此,情况如下:

  • 1个JPanel,其中包含一个项目
  • 1 JLabel,其中有一个Img作为图标
  • 我想在面板周围移动JLabel,但不要超出面板的边界(这样用户可以看到屏幕上的所有图像)
  • 代码如下: 我在那里:

    int randH = 0;
    int randW = 0;
    int targetHeight = 0;
    int targetWidth = 0;
    
    然后,当面板根据加载的(目标/IMG)打开时:

        targetHeight = jLabel1.getHeight();
        targetWidth = jLabel1.getWidth();
    
    然后,单击标签时,我调用此代码来移动标签:

                    int posH = jPanel1.getHeight() - targetHeight;
                    int posW = jPanel1.getWidth() - targetWidth;
    
                    randH = new Random().nextInt(posH) - jLabel1.getHeight();
                    randW = new Random().nextInt(posW) - jLabel1.getWidth();
    
                    if (randH <= 0) {
    
                        int num = (int) (Math.random() * 5);;
                        randH = num;
                    }
    
                    if (randW <= 0) {
    
                        int num = (int) (Math.random() * 5);;
                        randW = num;
                    }
                    if (randH >= posH) {
    
                        int num = (int) (Math.random() * 5);;
                        randH = posH - num;
                    }
    
                    if (randW >= posW) {
    
                        int num = (int) (Math.random() * 5);;
                        randW = posW - num;
                    }
                    jPanel1.setLayout(null);
                    jLabel1.setBounds(new Rectangle(new Point(200, 300), jLabel1.getPreferredSize()));
                    jLabel1.setLocation(randW, randH);
    
                    jLabel1.setVisible(true);
    
    intposh=jPanel1.getHeight()-targetHeight;
    int posW=jPanel1.getWidth()-targetWidth;
    randH=newrandom().nextInt(posH)-jLabel1.getHeight();
    randW=newrandom().nextInt(posW)-jLabel1.getWidth();
    if(randH=posW){
    int num=(int)(Math.random()*5);;
    randW=posW-num;
    }
    jPanel1.setLayout(空);
    jLabel1.setBounds(新矩形(新点(200300),jLabel1.getPreferredSize());
    jLabel1.设置位置(随机、随机);
    jLabel1.setVisible(true);
    
    因此,有时当IMG的值大于JPanel的维度时,IMG部分不在面板中


    有什么原因吗?

    所以在检查完所有内容并感谢所有人的帮助之后

    randH = new Random().nextInt((posH - 0) + 1) + 0;
    
    似乎已经把我带到了我需要的地方

    posH = is the max value
    0 = is the min value 
    +1 = include max
    +0 = include min
    
    为了进一步解释,下面的代码是为了确保IMG没有紧靠面板边框,因此图像和边框之间至少有5个像素

                    if (randH <= 0) {
    
                        int num = (int) (Math.random() * 5);;
                        randH = num;
                    }
    
                    if (randW <= 0) {
    
                        int num = (int) (Math.random() * 5);;
                        randW = num;
                    }
                    if (randH >= posH) {
    
                        int num = (int) (Math.random() * 5);;
                        randH = posH - num;
                    }
    
                    if (randW >= posW) {
    
                        int num = (int) (Math.random() * 5);;
                        randW = posW - num;
                    }
    
    if(randH=posW){
    int num=(int)(Math.random()*5);;
    randW=posW-num;
    }
    

    就我所知,这可能做得不好:D

    认为这是一个数学问题-进行一些调试并显示计算的中间值。然后当你得到一个不期望的值时,你就解决了这个问题。我试过了,99.9%的时间都很好。当我发现不是时,我没有检查值:die,我检查似乎很好,然后我停止检查,结果你的代码中有“随机”逻辑。因此,您需要确定为什么随机逻辑生成的值太大。我不明白你为什么有两套随机逻辑。如果有宽度为100的面板和宽度为20的图像,则标签的位置可以是0-80。所以你在这个范围内生成一个数字。所以它绘制JLabel的方式基本上是从左上角开始的,所以我得到高度和宽度,然后需要去掉IMG的大小,这样整个图像都在panels视图中。如果我不这样做,通常会将IMG置于视图之外,解决此JLabel移动“问题”的方法是直接在绘图JPanel上绘制图像。Oracle教程将向您展示如何使用Oracle。