2012-05-14 2 views
0

У меня есть подкласс JFrame (он содержит JButton, Title и Jpanel), и я добавил JPanel к нему. Jpanel занимает центральную часть границы. Я хочу сделать JPanel прозрачным (он должен видеть через окно Frame).Как добавить непрозрачные компоненты в прозрачный JFrame в java 1.5?

Как я делаю это для Java 1.5, я использовал JFrame.setOpacity (0.0f), чтобы установить прозрачность Jframe. Делая это, все компоненты JFrame (т.е. кнопка, Title ahd jPanel) используют тот же альфа-уровень. Но я хочу, чтобы только JPanel был прозрачным.

Я экспериментировал с JLayeredPane, изменив Z-порядок с тем же результатом.

Я открыт для использования внешних библиотек, таких как JNA (JNA windowsUtil также выполняет то же самое, что и метод setOpacity()) и использует классы java7 или java6 в качестве внешних библиотек для моего приложения.

Я даже прошел через некоторые ранее заданные вопросы без помощи:

Opaque components on transparent Java windows

Java: Transparent Windows with non-transparent components?

Re-paint on translucent frame/panel/component.

+0

Если вы используете утилиты JNA, вы * можете * получить желаемый эффект, установив альфа-маску в окне с указанием желаемого уровня непрозрачности, а затем поместите свои непрозрачные биты в тяжеловесный компонент в оригинале окно. Работает ли это в значительной степени, зависит от того, как прозрачность каскадирует иерархию окон на данной платформе. – technomage

+0

BTW, утилиты JNA обеспечивают установку глобального альфа-окна, битовой маски окна и альфа-маски. Последнее, скорее всего, будет работать на то, что вы пытаетесь сделать. Вы вряд ли получите код java [67] для работы с более ранней версией JVM. – technomage

ответ

1

Используйте ЮНА, чтобы начать с совершенно прозрачным окном. Любые пиксели, написанные в этом окне, сохранят свой альфа-компонент.

JFrame f = ... 
WindowUtils.setWindowTransparent(f, true); 
// ensure JPanel content pane doesn't paint its (solid) background 
f.getContentPane().setOpaque(false); 
// Any other added components will be painted normally 
f.getContentPane().add(new JButton("I'm opaque")); 

Это должно доставить желаемые результаты.

Если вы хотите, чтобы ваш контейнер был полупрозрачным или другими комбинациями непрозрачности, вам нужно прояснить желаемые результаты.

+1

Спасибо, что помогли мне ... Но я боюсь, что вышеупомянутый не работает. Как вы знаете, JButton - это легкий объект, он берет его альфа-значение из окна своего предка. –

+0

Я видел ваше сообщение: http: //rabbit-hole.blogspot.in/2007/04/alpha-mask-transparency.html. Можете ли вы дать мне ссылку на исходный код этой статьи. И можете ли вы предоставить информацию о том, что маскирует на самом деле в JNA. –

+1

Этот код включен в проект JNA. Обычно LAF кнопки будет рисовать область содержимого кнопки и оставлять ее фоновое изображение до родителя. Если ваша кнопка не полностью отображает область содержимого, вам необходимо либо изменить ее так, чтобы она выполнялась, либо использовать setOpaque (true) на ней (чтобы получить значение по умолчанию bg), либо дать ей родитель, который рисует свой фон. – technomage

0

Вот небольшой пример с двумя метками. Один из них полностью непрозрачен, а другой полупрозрачен. Это может работать, а также с JPanel, но для демонстрационных целей-, более examplative с JLabel: WindowUtils.setWindowTransparent() метод

import java.awt.BorderLayout; 
import java.awt.Color; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.SwingUtilities; 

import com.sun.awt.AWTUtilities; 

public class Test3 { 

    protected static void initUI() { 
     JFrame frame = new JFrame("test"); 
     frame.setUndecorated(true); 
     AWTUtilities.setWindowOpaque(frame, false); 
     JLabel label = new JLabel("Hello NOT transparent label"); 
     label.setOpaque(true); 
     label.setBackground(new Color(255, 0, 0)); 
     JLabel transLabel = new JLabel("Hello transparent label"); 
     transLabel.setOpaque(true); 
     transLabel.setBackground(new Color(255, 0, 0, 50)); 
     frame.setLocationByPlatform(true); 
     frame.getContentPane().add(label); 
     frame.getContentPane().add(transLabel, BorderLayout.SOUTH); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       initUI(); 
      } 
     }); 
    } 
} 
+0

Благодарим вас за ответ. Как я уже сказал, я хотел сделать приложение для java1.5 (которые не имеют метода AWTUtilities.setWindowOpaque), поэтому попытался использовать класс jre1.6u10 как librabries зависимости, но он имеет проблемы с дублированием классов из jre1.5. Итак, вы можете помочь мне, если есть какие-то альтернативы ...... –

+0

@ user1371881 Я думаю, что вам не повезло. См. Также этот пост: http://stackoverflow.com/questions/1416869/how-to-distribute-awtutilities –

+0

Я уже видел это сообщение ... и попытался со своей стороны избавиться от зависимостей, изменив имена классов, но есть много изменений в jre1.6u10 wrt jre1.5. Итак, я отказался от этого процесса и искал альтернативы родной библиотеки, такие как JNA (что на самом деле не помогает). Есть некоторые веб-сайты Capture для экрана, такие как www.screencast-o-matic.com, которые делают самонаведение даже с jre1.5. Так должен быть какой-то способ –

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