Java repaint()方法会导致出现第二个非功能性JMenuBar吗?

Java repaint()方法会导致出现第二个非功能性JMenuBar吗?,java,swing,repaint,jmenubar,Java,Swing,Repaint,Jmenubar,我正在创建一个程序,用户可以在其中画线并删除它们。我可以创建我的窗口并创建一个功能正常的JMenuBar。未启用绘图功能时,一切正常。但是,当启用绘图功能时,第二个JMenuBar将绘制在原始JMenuBar的下方。此菜单栏不起作用,有时在绘制时,屏幕上的所有图形也会重新绘制到较低的位置。以任何方式重新调整窗口大小都可以解决这些问题 我会发布图片,但是,你知道,我是一个新用户,不能 我已经能够将问题缩小到paint()方法中的某一点。需要知道:当拖动鼠标时,会调用repaint()方法。它使用m

我正在创建一个程序,用户可以在其中画线并删除它们。我可以创建我的窗口并创建一个功能正常的JMenuBar。未启用绘图功能时,一切正常。但是,当启用绘图功能时,第二个JMenuBar将绘制在原始JMenuBar的下方。此菜单栏不起作用,有时在绘制时,屏幕上的所有图形也会重新绘制到较低的位置。以任何方式重新调整窗口大小都可以解决这些问题

我会发布图片,但是,你知道,我是一个新用户,不能

我已经能够将问题缩小到paint()方法中的某一点。需要知道:当拖动鼠标时,会调用repaint()方法。它使用my paint()方法,该方法在我的Line类中调用paintObject(Graphics g)方法。JMenuBar错误出现在top类中paint方法的末尾

public void paint(Graphics g)//paint() in the top class
{            
    for(int i = 0; i < objs.size(); i++)//Loop that finds all Tool(Line) objects that
        ((Tools)objs.get(i)).paintObject(g);//have been drawn, and redraws them.
    //This part of the code completes successfully with no error.

}//ERROR OCCURS HERE!!!!!!
public void paint(Graphics g)//top类中的paint()
{            
for(int i=0;i

我不知道为什么会这样。作为旁注,屏幕上还有一个JTextField,在突出显示之前不会出现。谢谢你至少读了这么多

Edit:我要冒险一试,我敢打赌你实际上是直接在顶层窗口(JFrame、JApplet或JDialog…)上绘图,并且还向该窗口添加了鼠标侦听器——因此组件的绘图被翻译了一点


解决方案是在尝试类似这样相当复杂的事情之前,先看一下教程。他们将告诉您如何正确绘制,包括我在评论中给出的建议,例如使用JComponent或JPanel的
paintComponent
方法绘制,并调用super.paintComponent(g)方法作为paintComponent覆盖的第一个方法调用。

您需要讲述更多。据我们所知,您可能正在做一些非常错误的事情,例如直接在顶层窗口中绘制,如JFrame或JApplet。我假设您没有在JPanel或JComponent中正确地进行绘制,如果是这样,请使用paintComponent方法而不是绘制。另外,你还想发布一个截图,这样我们可以更好地测试你的代码。请发布一个截图。注意,你应该打电话给super.paint(g)@mishanesterenko:他甚至不应该用
paint
方法绘图。嘿,看看这个!paintComponent()方法解决了这个问题(我使用的paintComponent()方法与我正在阅读的所有API完全混淆。在教程中,我没有意识到它是不同的)!谢谢我只是想澄清一下,我在画JPanel。这也修复了文本框不显示的问题。再次感谢@user1161539:很高兴你能让它工作,但这很奇怪,因为我不知道JMenuBar怎么会被JPanel的绘画方法所吸引。您是否通过
setJMenuBar(…)
方法将JMenuBar添加到JFrame?或者它被添加到了JPanel中?更新:我在另一台计算机(同一个操作系统,同一个编译器)上测试了未修复的版本,但问题并不存在。为了回答您的问题:是的,我通过setJMenuBar(…)方法将它添加到了框架中。