所以我有一个内部边框的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);
答案 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()方法。