【问题标题】:Graphics are blocked out when I add a JPanel to the frame (java)当我将 JPanel 添加到框架时,图形被屏蔽(java)
【发布时间】:2014-01-13 02:01:27
【问题描述】:

我在我的框架中显示了一些 Graphics2D 图形,然后我在整个框架中添加了一个 JPanel,以便我可以在面板中的任意位置单击鼠标侦听器。但是,图形消失了,我假设被框架挡住了。我尝试将面板设置为可见错误,但这没有做任何事情。如何让我的 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);

      //...

【问题讨论】:

  • 你能告诉我们更多关于你的问题吗?也许你可以给一些代码。
  • 了解还有什么会有所帮助?我认为我的代码不会有太大帮助,但我可以添加一点。
  • 就目前而言,我不知道您的问题是什么。你说你的frame中有图形显示,但是它是怎么显示的呢?
  • 我编辑添加代码以显示图形的显示方式
  • 图形在框架的什么位置显示?在paint 方法中?在paintComponent 方法中?

标签: java swing jpanel graphics2d mouselistener


【解决方案1】:

三个问题跳出来……

首先,JFrame 使用BorderLayout 作为其默认布局管理器,这意味着只有一个组件可以占据其可用的五个位置中的任何一个。通过使用add(Component),您可以将每个组件添加到CENTRE 位置,覆盖您添加到其中的第一个组件...

其次,JPanel 默认是不透明的,也就是说,即使你确实让两个组件占据了相同的空间,顶部的组件也会挡住下面的组件

第三,您应该使用paintComponent 而不是paint

查看Performing Custom Painting了解更多详情

解决方案可能是将MouseListener 直接添加到自定义组件中

另一种选择是在下部组件上使用BorderLayout,使顶部组件透明(使用setOpaque(false))并将其直接添加到下部组件...

【讨论】:

  • 如何将 MouseListener 添加到自定义组件中?
  • customComponent.addMouseListener(...)?
  • 这就是我的想法,但我在我的绘画方法中尝试了 customComponent.addMouseListener(this) 但它没有用。我是不是做错了什么?
  • “我做错了什么吗?” - 是的,在任何paint 方法中什么都不做,除了绘画,不要修改组件的状态。在创建组件实例后添加侦听器,假设您想要一个“外部”侦听器,或者在构造函数中假设您想要一个“内部”侦听器
  • 特别接受了“解决方案可能是将 MouseListener 添加到自定义组件”的答案
【解决方案2】:

我相信您的问题是JFrame 只能添加一个组件(默认情况下)。您添加一个CustomPaintComponent,它会绘制您的图形。然后,添加JPanel,它会自动删除CustomPaintComponent

您是否要在JPanel 上绘制自定义绘图?如果是这种情况,只需将该代码移至JPanel(但不要使用CustomPaintComponent,而是将其放在JPanel 的paintComponent(Graphics g) 方法中)

【讨论】:

    猜你喜欢
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-06
    • 1970-01-01
    相关资源
    最近更新 更多