将JPanel添加到框架时,图形被阻止(java)

时间:2014-01-13 02:01:27

标签: java swing jpanel graphics2d mouselistener

我的框架中显示了一些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);

      //...

2 个答案:

答案 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)方法中)