Статьи

Прозрачный JFrame с использованием JNA

В статье Сделать JFrame прозрачным я показал способ сделать прозрачным фрейм с помощью класса AWTUtilities. Но использование этого класса приводит к ошибке времени компиляции ограничения доступа, разрешение в Eclipse также показано в этом посте. Теперь вот версия с использованием Java. Я использовал библиотеку Java Native Access (JNA) для вызова нативных функций для достижения цели.

Что такое собственный доступ к Java (JNA) ?

JNA обеспечивает программам Java легкий доступ к собственным разделяемым библиотекам (DLL в Windows) без написания чего-либо, кроме кода Java — не требуется JNI или собственный код. JNA позволяет напрямую вызывать собственные функции, используя вызовы естественного метода Java.

Код

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import javax.swing.JFrame;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
 
import com.sun.jna.platform.WindowUtils;
 
public class TransparentFrame extends JFrame {
   public TransparentFrame() {
      setTitle('Transparent Frame');
      setSize(400,400);
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      JSlider slider = new JSlider(JSlider.HORIZONTAL, 30, 100, 100);
 
      slider.addChangeListener(new ChangeListener() {
         @Override
         public void stateChanged(ChangeEvent e) {
            JSlider slider = (JSlider) e.getSource();
            if(!slider.getValueIsAdjusting()){
               WindowUtils.setWindowAlpha(TransparentFrame.this, slider.getValue()/100f);
            }
         }
      });
      add(slider);
      setVisible(true);
   }
   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
  @Override
  public void run() {
     new TransparentFrame();
  }
      });
   }
}

Здесь класс WindowUtils представлен в JNA jar (platform.jar). Метод setWindowAlpha класса WindowUtils используется, чтобы сделать окно прозрачным. Первым аргументом этого метода является ваш фрейм / окно, а вторым аргументом является альфа-значение. Этот класс также имеет метод setWindowTransparent, который также можно использовать для прозрачности окна.

зависимости

Для запуска этой программы вам понадобятся следующие 2 jar: (Оба файла jar доступны для загрузки на GitHub для JNA .)

  • jna.jar
  • platform.jar

Чтобы запустить приведенный выше код в Windows, вам нужно установить системное свойство «sun.java2d.noddraw» перед вызовом функции WindowUtils.

1
System.setProperty('sun.java2d.noddraw', 'true');

Выход

Дополнительные замечания

Я проверил этот код на следующих машинах:

  • Windows XP с пакетом обновления 3 (32 бита)
  • Windows 7 (32 бит)
  • Cent OS 5 (32 бит)

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

Приятного кодирования и не забудьте поделиться!

Ссылка: Прозрачный JFrame с использованием JNA от нашего партнера JCG Харш Равал в блоге harryjoy .