当前位置: 首页 > 知识库问答 >
问题:

JPanel中的重叠组件

储法
2023-03-14

我在同一个JPanel上有一个JButton和一个Point(由飞跃运动控制的运动)。但是,它们与顶部的JButton重叠。

有没有办法让我的点始终在JPanel应用程序窗口中的顶部?

这是一个代码片段:

public leapPanel()
{

    setLayout(null);        //18-12-13
    setBackground(Color.WHITE);
    setVisible(true);       //18-12-13
    button = new JButton();
    button.setBounds(100, 150, 100, 100);
    button.setBackground(Color.BLACK);
    add(button);

    points[nPoints] = new Point(PWIDTH/2, PHEIGHT/2);
    nPoints++;

    listener = new leapListener(this);
    controller = new Controller();
    controller.addListener(listener);       
}   

public Dimension getPreferredSize()
{   
    return new Dimension(PWIDTH, PHEIGHT); 
}

public void paintComponent(Graphics shape)
{
    super.paintComponent(shape);
    Graphics2D shaped = (Graphics2D)shape;
    shaped.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
    RenderingHints.VALUE_ANTIALIAS_ON);
    for(int i=0; i<nPoints; i++)
    {
        shaped.setColor(Color.ORANGE);
        shaped.fillOval(points[i].x, points[i].y, 12, 12);
    }
}

private Point2D.Float calcScreenNorm(Hand hand, Screen screen)
/* The dot position is calculated using the screen position that the
   user's hand is pointing at, which is then normalized to an (x,y)
   value between -1 and 1, where (0,0) is the center of the screen.
*/
{
    Vector palm = hand.palmPosition();
    Vector direction = hand.direction();
    Vector intersect = screen.intersect(palm, direction, true);
          // intersection is in screen coordinates

    // test for NaN (not-a-number) result of intersection
    if (Float.isNaN(intersect.getX()) || Float.isNaN(intersect.getY()))
          return null;

    float xNorm = (Math.min(1, Math.max(0, intersect.getX())) - 0.5f)*2;      // constrain to -1 -- 1
    float yNorm = (Math.min(1, Math.max(0, (1-intersect.getY()))) - 0.5f)*2; 

    return new Point2D.Float(xNorm, yNorm);
}  // end of calcScreenNorm()

共有2个答案

孟杰
2023-03-14
 JPanel main = new JPanel();
    main.setLayout(new OverlayLayout(main));
    //main.setBackground(Color.WHITE);
    setSize(800, 600);  //18-12-13
    Container con = getContentPane();
    con.setBackground(Color.WHITE);  


    BPanel = new buttonPanel();
    panel = new leapPanel();
    main.add(BPanel);
    main.add(panel);    
    con.add(main);

这只允许我在应用程序窗口上只显示BPanel。我需要的是既有点(面板)和按钮(BPanel)显示在应用程序窗口上,点总是在顶部。

如果我在这里遗漏了什么,请纠正我。谢谢!

丁沛
2023-03-14

我在同一个JPanel上有一个JButton和一个点(它的运动由跳跃运动控制)。

当组件位于同一面板上时,则不然。绘制的顺序是首先绘制组件(即调用您的油漆组件()方法)。然后绘制面板的子组件(即绘制按钮)。这就是 Swing 实现组件之间的父/子关系的方式。

尝试使用两块面板。主面板将有一个边界布局。那么你可以使用:

main.add(button, BorderLayout.NORTH);
main.add(leapPanel, BorderLayout.CENTER);

另一种选择是尝试使用重叠布局。它允许你将两个组件堆叠在另一个之上,尽管我必须承认当使用这种布局时,我在控制组件的确切位置上有问题。基本代码是:

JPanel main = new JPanel();
main.setLayout( new OverlayLayout(main) );
JPanel buttonPanel = new JPanel();
buttonPanel.add( button );
main.add(buttonPanel);
main.add(leapPanel);

使用OverlayLayout,您可能会遇到奇怪的按钮绘制问题。如果是这样的话,那么请检查从重叠布局中覆盖< code > isotimizedrawingenabled()的建议。

 类似资料:
  • 问题内容: 我真的是Java Java编程的新手,我做了很多研究,但找不到这个问题的答案。 我有一个简单的用一个菜单,这里面我有一个日志的形式(分别为用户输入自己的用户名和密码),然后我想改变这种状况到另一这取决于用户想做的事情。 最好的方法是什么?我认为堆叠是可以的。但是在Netbeans中添加新内容后,它们不会堆叠。我读过某个地方应该使用Z排序或类似的命令,但在设计器视图中找不到它。 好吧,非

  • 我有一个程序,有多个层次,在底层我有一个JPanel,我把背景图像放在上面。除此之外,我还有一个JLayeredPane,其中包含一些可拖动的组件。我的问题是,当用户上传了背景图像时,可拖动的组件确实滞后了,我猜这是因为swing在拖动时一直在重新绘制背景图像。我的问题是,如果它无论如何,以确保图像没有重新绘制的所有时间?我在其中绘制图像的代码如下所示:

  • 问题内容: 我在Postgres中有下表,在两列和中有重叠的数据。 从前6行可以看到,两列中的数据值4,5,6和7相交/重叠,需要将其划分为一组。第7-16行和第17-18行将分别标记为组2和3。 结果输出应如下所示: 问题答案: 假设所有对在它们的镜像的组合中也存在和。但是以下解决方案也可以在没有镜像重复对象的情况下正常工作。 简单的情况 所有连接都可以 按单个升序排列 ,不可能出现像我在小提琴

  • 我正在处理Firebase Remote Config,想知道当您对Firebase参数有重叠的条件时,在幕后会发生什么。例如,假设我对一个参数有两个条件: 如果用户在Android设备上,则返回true。 如果用户使用的是Android设备,并且该设备是Samsung设备,则返回false。 如果用户是从三星设备查询,那么Firebase会为这个参数返回什么?大概,这将取决于Firebase首先

  • 我使用子JPanel构造JScrollPane,然后尝试将JScrollPane添加到父JPanel中,希望有一个可滚动的自定义JPanel。 我有一个大的细白线前面的所有我的组件,他们是没有滚动。有什么想法吗?