我一直试图在JApplet的顶部绘制一个'overlay'进行调试,但是要弄清楚;它不想。通过JApplet绘制JFrame的GlassPane
虽然!如果我将 JApplet更改为 JPanel,那么它工作得很好。
我找不到任何背后的逻辑推理,而不是JApplet本身扩展了Applet,它是一个AWT组件,JPanel扩展了JComponent,它是根组件的一部分。 (至于我而言)
这是怎么回事的动画图像:http://puu.sh/5NUV2/7aa1c26671.gif
这是我的工作代码:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JApplet;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class OverlayTest extends JFrame {
public static final Color OVERLAY_COLOR = new Color(200, 10, 10, 127);
public static void main(String[] args) {
new OverlayTest();
}
public JPanel overlay;
public Component applet;
public OverlayTest() {
this.setTitle("");
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setLayout(new BorderLayout());
this.setResizable(false);
this.applet = new JApplet() {
{
this.setBackground(Color.BLACK);
this.setPreferredSize(new Dimension(256, 256));
}
@Override
public void paint(Graphics g) {
g.setColor(this.getBackground());
g.fillRect(0, 0, this.getWidth(), this.getHeight());
g.setColor(Color.ORANGE);
g.drawRect(16, 16, this.getWidth() - 32, this.getHeight() - 32);
System.out.println("Painted applet");
}
};
this.overlay = new JPanel(null) {
{
this.setOpaque(false);
OverlayTest.this.setGlassPane(this);
this.setVisible(true);
}
@Override
public void paint(Graphics g) {
g.setColor(OVERLAY_COLOR);
g.fillOval(0, 0, this.getWidth(), this.getHeight());
System.out.println("Painted overlay");
}
};
this.add(this.applet, BorderLayout.CENTER);
this.pack();
this.setVisible(true);
}
}
自定义绘画通常在'paintComponent'方法内完成,未能履行绘画修饰(通过不调用'super.paintXxx')会导致任何问题 – MadProgrammer
请记住,'JApplet'是重量级组件),这可能是一个混合重量和轻量级组件的z顺序问题 – MadProgrammer