JPanel中重叠的组件

时间:2013-12-18 14:52:26

标签: java swing jpanel leap-motion

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

有没有办法让我的Point始终位于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 个答案:

答案 0 :(得分:2)

  

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

当组件位于同一面板上时。绘画的顺序是首先绘制组件(即调用paintComponent()方法)。然后绘制面板的子组件(即按钮被绘制)。这就是Swing如何实现组件之间的父/子关系。

尝试使用两个面板。主面板将有一个BorderLayout。然后你可以使用:

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

另一种选择是尝试使用OverlayLayout。它允许您将两个组件堆叠在一起,尽管我必须承认在使用此布局时我在控制组件的确切位置时遇到问题。基本代码是:

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

使用OverlayLayout,您可能会遇到按钮的奇怪绘画问题。如果是,请查看建议以覆盖Overlap Layout中的isOptimizedDrawingEnabled()

答案 1 :(得分:0)

 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)显示在应用程序窗口上,点始终在顶部。

如果我在这里遗漏了某些东西,请纠正我。谢谢!