2011-01-21 2 views
4

Я знаю, что аналогичный вопрос был posted before, но не было ответа или примера кода.Прозрачный JPanel поверх холста (VLCJ)

Мне нужна прозрачная JPanel поверх холста. Код размещен ниже не работает

import java.awt.BorderLayout; 
import java.awt.Canvas; 
import java.awt.Color; 
import java.awt.Graphics; 
import javax.swing.JFrame; 
import javax.swing.JLayeredPane; 
import javax.swing.JPanel; 

public class Main { 
    private static class Background extends Canvas{ 
     @Override 
     public void paint(Graphics g) { 
      super.paint(g); 
      g.setColor(Color.RED); 
      g.drawOval(10, 10, 20, 20); 
     } 
    } 

    private static class Transparent extends JPanel { 

     public Transparent() { 
      setOpaque(false); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      g.setColor(Color.GREEN); 
      g.drawOval(20, 20, 20, 20); 
     } 
    } 

    public static void main(String[] args){ 
     JFrame frame = new JFrame(); 
     JLayeredPane layered = new JLayeredPane(); 
     Background b = new Background(); 
     Transparent t = new Transparent(); 

     layered.setSize(200, 200); 
     b.setSize(200, 200); 
     t.setSize(200, 200); 

     layered.setLayout(new BorderLayout()); 
     layered.add(b, BorderLayout.CENTER, 1); 
     layered.add(t, BorderLayout.CENTER, 0); 

     frame.setLayout(new BorderLayout()); 
     frame.add(layered, BorderLayout.CENTER); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(200, 200); 
     frame.setVisible(true); 
    } 
} 

Используя свойство GlassPane всего кадра самое последнее решение (крайне нежелательно)

ответ

2

Вы, вероятно, не будет в состоянии получить эту работу, потому что вы смешиваете тяжелые и легкие компоненты вместе.

Раньше было невозможно рисовать легкие панели над тяжеловесными компонентами, такими как Холст. Поскольку JDK 6 Update 12 и JDK 7 build 19 Java исправили это, и вы можете наложить 2 правильно, но в нем есть ограничения. В частности, в вашем случае компонент Swalling Swing не может быть прозрачным.

Хорошее описание для этого, включая более новое поведение, можно найти на этой странице: Mixing Heavyweight and Lightweight Components Проверьте раздел с ограничениями по конкретной проблеме.

Я не думаю, что использование GlassPane поможет, так как это также легкий вес.

Если вы измените класс BackGround для расширения JPanel вместо Canvas, вы получите нужное поведение.

+1

Да, я читал о проблеме с тяжелым весом/облегчением, но я вынужден использовать холст ... Сейчас я изучаю SWT, но я предпочитаю SWING. – FearUs

0

Хотя AWT ограничен, не должно быть слишком сложно реализовать что-то подобное с AWT, расширив класс Container или Component.

Смежные вопросы