2013-12-15 25 views
0

我一直试图在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); 
    } 
} 
+0

自定义绘画通常在'paintComponent'方法内完成,未能履行绘画修饰(通过不调用'super.paintXxx')会导致任何问题 – MadProgrammer

+0

请记住,'JApplet'是重量级组件),这可能是一个混合重量和轻量级组件的z顺序问题 – MadProgrammer

回答

1

的可能出现的问题的列表.. 。

  1. JApplet是概念非常类似JFrame,它有一个JRootPane其中包含的内容和其他元素
  2. 这可能与z顺序问题与混合AWT和Swing组件
  3. 打破油漆链将没有帮助...

而不是试图设置帧的玻璃板,为什么不设置小程序?

+0

我忘了包括我已经尝试设置小程序,但小程序重绘的方式是分开的。所以如果我在它上面绘制一个透明的矩形,它将继续填充未被重绘的部分,直到它们看起来像它们是我绘制的颜色的不透明矩形。 – Dane

+0

这是因为你已经覆盖applet的'paint',这是做两件事1 - 因为你没有调用'super.paint',它没有绘制applet的任何内容(即'JRootPane ','contentPane','GlassPane','JLayeredPane'或'JMenuBar'),但即使你做了(称为'super.paint'); 2-你直接画了所有东西 – MadProgrammer

+0

我不需要任何绘制的applet的其他内容。我只是试图在它上面绘制一个玻璃窗格而不使它成为小程序玻璃窗格。 – Dane