Border影响组件位置java

时间:2013-12-24 17:04:01

标签: java position components border

所以我有一个内部边框的JPanel(它根据MouseEnter / MouseExit切换,作为一种翻转效果)。我也有一个JLabel。问题是JLabel似乎相对于边界定位 - 而不是JPanel的实际边缘。因此,每当我将鼠标移到面板上时,标签就会移动几个像素。我宁愿它保持静止。

所以我想我的问题是,在不影响面板内组件位置的情况下,更改面板边框的最佳方法是什么?

这是面板的鼠标滑块:

panel.addMouseListener(new MouseAdapter() {

        @Override
        public void mouseEntered(MouseEvent e) {
            panel.setBorder(BorderFactory.createBevelBorder(1, Color.BLACK, Color.BLACK));
        }

        @Override
        public void mouseExited(MouseEvent e) {
            panel.setBorder(null);
        }

    });

只需使用borderlayout添加JLabel:

panel.setLayout(new BorderLayout());
JLabel label = new JLabel("testlabel");
panel.add(label,BorderLayout.PAGE_END);

1 个答案:

答案 0 :(得分:1)

当未使用斜角边框时,您可以尝试使用EmptyBorder。给它与斜角边界相同的宽度/高度。

我不会对布局或经理进行大量的讨论,但这就是我想要的。

修改

由于您似乎可能希望使用叠加效果而不是边框​​,因此您可以创建自定义JPanel类,并在paintComponent(Graphics g)方法中包含一些代码来绘制此叠加层。

类似于:

public class OverlayBorderJPanel extends JPanel
{
    boolean containsMouse = false; //set to true by mouseListener when contains
    BufferedImage overlay = //you would need to load an image border here, 
                            //rather than having a java created border
                            //You could have alpha so it is half see-through

    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);

        if (containsMouse)
        {
            g.drawImage(//use 0,0 position with panel width/height)
        }
    }
}

我认为它可以使用类似的东西,但你可能需要在监听器中调用面板的repaint()方法。