我有这个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
只有在我将鼠标滚到它应该的位置后才会出现。我做错了什么?
答案 0 :(得分:4)
你永远不会打电话
super.paint(g);
绘制容器子组件。
不要在JFrame
等顶级容器中进行自定义绘画。而是将绘图功能移动到JComponent
的子类。覆盖paintComponent
而不是paint
并调用super.paintComponent(g)
。这利用了Swing双缓冲机制的改进性能。
答案 1 :(得分:2)
在添加完所有内容后,在repaint
上呼叫JFrame
。此外,您需要使用super.paint(g)
方法拨打paint
。