我正在制作一个简单的绘图应用程序。我有一个扩展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...
}
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
从你的描述来看,问题可能是由于DrawPane
的paintComponent
方法在绘制时没有正确处理其自身的绘图区域,导致覆盖了整个窗口内容,包括原本位于顶部的JMenuBar
。尽管JMenuBar
默认是与ContentPane
不重叠的,但如果ContentPane
的绘图逻辑没有限制在其自身边界内,就可能出现这种视觉上的重叠现象。
为了解决这个问题,你需要确保在DrawPane
的paintComponent
方法中只在其自己的边界范围内进行绘图。你可以通过调用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
上去了。
如果问题依然存在,检查是否有其他地方可能影响到布局或绘画流程,例如是否错误地设置了布局管理器或者在其他地方进行了不当的绘画操作。