我的框架中显示了一些Graphics2D图形,然后我在整个框架中添加了一个JPanel,这样我就可以在面板的任何位置添加一个mouselistener点击。但是,图形消失了,我假设被框架阻挡了。我尝试将面板设置为可见false,但是没有做任何事情。如何让我的mouselistener监听整个窗口,并仍然显示我的图形?
编辑: 下面是一些代码:编辑:(还有一些)
//adding the panel and mouselistener
JPanel allPanel = new JPanel();
allPanel.addMouseListener(this);
frame.add(allPanel);
//...
//drawing some of the graphics
public void draw() {
frame.add(new CustomPaintComponent());
// Display the frame
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setVisible(true);
JPanel allPanel = new JPanel();
allPanel.addMouseListener(this);
frame.add(allPanel);
}
static class CustomPaintComponent extends Component {
private static final long serialVersionUID = 1L;
public void paint(Graphics g) {
Graphics2D g2d = (Graphics2D)g;
g2d.fillRoundRect(10, 10, 50, 50, 10,10);
//...
答案 0 :(得分:4)
三个问题跳出来......
首先,JFrame
使用BorderLayout
作为其默认布局管理器,这意味着只有一个组件可以占用其可用的五个位置中的任何一个。使用add(Component)
,您可以将每个组件添加到CENTRE
位置,覆盖您添加到其中的第一个组件...
其次,默认情况下JPanel
是不透明的,这意味着,即使你确实让两个组件占据相同的空间,顶部组件也会阻挡较低的组件
第三,您应该使用paintComponent
代替paint
请查看Performing Custom Painting了解详情
解决方案可以是将MouseListener
直接添加到自定义组件
另一个选择是在下部组件上使用BorderLayout
,使顶部组件透明(使用setOpaque(false)
)并将其直接添加到下部组件...
答案 1 :(得分:4)
我相信你的问题是JFrame
只能添加一个组件(默认情况下)。您添加了一个CustomPaintComponent
,用于绘制图形。然后,您添加JPanel
,自动删除CustomPaintComponent
您是否尝试在JPanel
之上绘制自定义绘图?如果是这种情况,只需将代码移到JPanel
(但不是使用CustomPaintComponent
,而是将其放在JPanel的paintComponent(Graphics g)
方法中)