开发者社区 问答 正文

在JPanel顶部绘制的JMenuBar

我正在制作一个简单的绘图应用程序。我有一个扩展JFrame的类和一个扩展JMenuBar的类。我设置了一个扩展JPanel的类,作为JFrame的内容窗格,并绘制了它的paintComponent方法。问题是,当我从Window的redisplay方法调用DrawPane的repaint方法时,我的JMenuBar也被绘制在JPanel内部,如下所示:

它不像原始版本那样具有交互性,我可以在上面画图,这意味着它位于内容窗格中。

据我所读,JMenuBar与JFrame的contentPane不重叠。为什么会这样呢?

这是我的代码:

public class Window extends JFrame {

    private DrawPane drawPane;
    private EventHandler eventHandler;
    private FrameMenu frameMenu;

    public Window(String title, int w, int h)
    {
        super(title);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        eventHandler = new EventHandler();
        frameMenu = new FrameMenu();
        setJMenuBar(frameMenu);     
        drawPane = new DrawPane();
        drawPane.setPreferredSize(new Dimension(w,h));      
        drawPane.addMouseListener(eventHandler);
        addKeyListener(eventHandler);
        setContentPane(drawPane);
        pack();
        setVisible(true);
    }

    public void redisplay()
    {
        drawPane.repaint();
    }
}

我有一个静态的点ArraList,可以在DrawPane的paintComponent方法中进行绘制。

public class DrawPane extends JPanel {

    @Override
    public void paintComponent(Graphics g)
    {
        g.setColor(Color.red);

        int c=0;
        Point prev = new Point(0,0);
        for(Point p:Source.vertices)
        {
            g.fillRect(p.x-2, p.y-2, 4, 4);

            if(c++ > 0)
            {
                g.drawLine(p.x, p.y, prev.x, prev.y);
            }

            prev = p;
        }

    }
}

和JMenuBar:

public class FrameMenu extends JMenuBar implements ActionListener {

    JMenuItem newItem = new JMenuItem("New Line Connection");
    JMenuItem newBezItem = new JMenuItem("New Bezier Curve");
    JMenu fileMenu = new JMenu("File");

    JMenuItem sizeItem = new JMenuItem("Canvas Size");
    JMenu windowMenu = new JMenu("File");

    public FrameMenu()
    {
        //setting up hierarchy and action listeners..
    }

    public void actionPerformed(ActionEvent event) {
        //menu interactions...
    }

}

展开
收起
几许相思几点泪 2019-12-23 17:48:58 661 分享 版权
阿里云 AI 助理回答

从你的描述来看,问题可能是由于DrawPanepaintComponent方法在绘制时没有正确处理其自身的绘图区域,导致覆盖了整个窗口内容,包括原本位于顶部的JMenuBar。尽管JMenuBar默认是与ContentPane不重叠的,但如果ContentPane的绘图逻辑没有限制在其自身边界内,就可能出现这种视觉上的重叠现象。

为了解决这个问题,你需要确保在DrawPanepaintComponent方法中只在其自己的边界范围内进行绘图。你可以通过调用getBounds()getSize()方法来获取DrawPane的实际大小,并基于这些尺寸来限制绘图操作,避免影响到其他组件。

修改你的DrawPane类中的paintComponent方法如下:

public class DrawPane extends JPanel {

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g); // 调用超类方法,以确保正确的绘图准备(如背景填充等)

        Dimension size = getSize(); // 获取DrawPane的实际大小
        int width = size.width;
        int height = size.height;

        g.setColor(Color.red);

        int c=0;
        Point prev = new Point(0,0);
        for(Point p:Source.vertices)
        {
            // 确保绘图点在面板范围内
            int x = Math.max(0, Math.min(p.x-2, width));
            int y = Math.max(0, Math.min(p.y-2, height));

            g.fillRect(x, y, 4, 4);

            if(c > 0)
            {
                // 同样确保连线也在面板范围内
                g.drawLine(x, y, prev.x, prev.y);
            }

            prev = p;
        }
    }
}

这段代码首先调用了super.paintComponent(g),这是很重要的,因为它会处理基础的绘画操作,比如清除背景。然后,它使用当前组件的尺寸来限制所有绘图操作都在这个区域内,这样就不会意外地绘制到JMenuBar上去了。

如果问题依然存在,检查是否有其他地方可能影响到布局或绘画流程,例如是否错误地设置了布局管理器或者在其他地方进行了不当的绘画操作。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答