我有一个带有一些标签的JTabbedPane,标签旁边还有很多未使用的额外空间。所以我正在尝试使用它并在那里放置一些按钮(就像在Eclipse中一样)。我把按钮放在GlassPane上:
JPanel glasspane = getPanelWithButtons();
// panel with FlowLayout.RIGHT
frame.setGlassPane(glasspane);
glasspane.setOpaque(false);
glasspane.setVisible(true);
这是有效的,我仍然可以点击我的gui的其他元素(我发现的大多数搜索结果都是关于如何阻止这个)。到目前为止唯一的问题是当鼠标悬停在JSplitPane的条上时,鼠标指针不会改变为该双端水平箭头。我怎样才能恢复这种行为?
修改
我发现没有显示来自玻璃窗格下任何组件的鼠标更改事件。这些组件会将鼠标光标更改为手形光标,变焦镜头等。这些鼠标指针更改都不会产生任何影响。我想这是因为在玻璃窗格中,需要对玻璃窗格进行鼠标指针更改,但我不想手动更改所有鼠标指针。
答案 0 :(得分:7)
好。我弄清楚该怎么做。
虽然我花了5个多小时来理解背后的所有事情,但解决方案非常简单。
只是覆盖'公共布尔包含(int x,int y)'玻璃面板的方法。
public static void main(String[] args)
{
final JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setSize(800, 600);
final JSplitPane panel = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, new JPanel(), new JPanel());
frame.getContentPane().add(panel, BorderLayout.CENTER);
final JPanel glassPane = new JPanel(){
@Override
public boolean contains(int x, int y)
{
Component[] components = getComponents();
for(int i = 0; i < components.length; i++)
{
Component component = components[i];
Point containerPoint = SwingUtilities.convertPoint(
this,
x, y,
component);
if(component.contains(containerPoint))
{
return true;
}
}
return false;
}
};
glassPane.setOpaque(false);
JButton button = new JButton("haha");
button.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
System.out.println("haha");
}
});
glassPane.add(button);
glassPane.setBorder(BorderFactory.createLineBorder(Color.red));
frame.setGlassPane(glassPane);
//try to comment out this line to see the difference.
glassPane.setVisible(true);
frame.setVisible(true);
}
答案 1 :(得分:0)
好。我找到了问题的解决方案“在标签旁边放置按钮”。我不再使用玻璃窗格,而是直接放置按钮:
buttonpanel.setBounds(...);
frame.getLayeredPane().add(buttonpanel, 1);
这可以解决我的问题。它有点复杂,但涉及手工布局和监听帧大小调整事件。
由于我仍然想知道如何使用玻璃窗格来实现这一点,我不接受这个答案。也许有人想出一个玻璃窗格的解决方案。