Java JButton仅在鼠标在其上滚动后显示

Java JButton仅在鼠标在其上滚动后显示,java,swing,jbutton,paint,repaint,Java,Swing,Jbutton,Paint,Repaint,我有一个GUI类: import java.awt.*; import javax.swing.*; public class Exp2 extends JFrame { public Exp2 () { setLayout(new FlowLayout()); setSize(360, 360); setVisible(true); setDefaultCloseOperation(EXIT_ON_CLOSE);

我有一个GUI类:

import java.awt.*;
import javax.swing.*;
public class Exp2 extends JFrame {
    public Exp2 () {
        setLayout(new FlowLayout());
        setSize(360, 360);
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        JPanel panel1 = new JPanel();
        JPanel panel2 = new JPanel();
        add(panel2);
        add(panel1);
        panel1.paint(null);
        JButton button1 = new JButton("Run");
        panel2.add(button1, BorderLayout.PAGE_END);
    }
    public void paint(Graphics g) {
        g.setColor(Color.green);
        g.fillRect(50, 50, 20, 20);
    }
}
与这一主要课程一起:

import javax.swing.JFrame;
class Exp1 extends JFrame {
    public static void main(String[] args) {
        Exp2 box = new Exp2();
    }
}

但是JButton
button1
只有在我将鼠标滚动到应该的位置后才会出现。我做错了什么?

添加完所有内容后,在
JFrame
上调用
repaint
。此外,您需要从
paint
方法调用
super.paint(g)

添加所有内容后,在
JFrame
上调用
重新绘制。另外,您需要从
paint
方法调用
super.paint(g)

您从不调用

super.paint(g);
它绘制容器子组件

不要在顶级容器(如
JFrame
)中进行自定义绘制。而是将绘制功能移动到
JComponent
的子类。这里重写
paintComponent
而不是
paint
并调用
super.paintComponent(g)
。这充分利用了回转双缓冲机构性能的改进

请参阅:

您从未打过电话

super.paint(g);
它绘制容器子组件

不要在顶级容器(如
JFrame
)中进行自定义绘制。而是将绘制功能移动到
JComponent
的子类。这里重写
paintComponent
而不是
paint
并调用
super.paintComponent(g)
。这充分利用了回转双缓冲机构性能的改进


请参阅:

顺便说一句,您应该覆盖
paintComponent
,而不是
paint
。1)不要延伸框架或其他顶级容器。而是创建并使用一个实例。2) 不要设置顶级容器的大小。相反,要布局内容&调用
pack()?编程不是靠魔法,尝试“最后一件事”通常不会解决问题。@AndrewThompson我刚刚用Java启动了GUI,我发现了一个使用
paint(null)
的教程。顺便说一下,你应该覆盖
paintComponent
,而不是
paint
。1)不要扩展框架或其他顶级容器。而是创建并使用一个实例。2) 不要设置顶级容器的大小。相反,要布局内容&调用
pack()?编程不是靠魔法,尝试“最后一件事”通常不会解决问题。@AndrewThompson我刚刚用Java启动了GUI,我发现一个教程使用了
paint(null)
+1,用于直接解决问题的repaint()@更好的方法是首先将所有组件添加到框架中。然后调用pack()和setVisible(true)。让Swing确定帧的首选大小,而不是选择一些随机数。对于直接解决问题的repaint(),不应该重写JFrame.+1的paint()方法@更好的方法是首先将所有组件添加到框架中。然后调用pack()和setVisible(true)。让Swing确定帧的首选大小,而不是选择一些随机数。您不应该重写JFrame的paint()方法。