繁体   English   中英

具有透明背景的可滚动JFrame

[英]Scrollable JFrame with transparent background

我有一个带有JFrame窗口的大型java程序,我需要创建一个透明的背景,但这只有在没有我的滚动窗格的情况下才能实现(参见下面的测试程序和图片):

//TransparentWindow.java

import java.awt.*;
import javax.swing.*;

public class TransparentWindow extends JFrame
{
    JMenuBar menuBar;
    TransparentCanvas canvas;
    JComponent pane;
    JScrollPane scrollPane;

    public TransparentWindow() 
    {
      setBackground(new Color(0,0,0,0));
      setSize(new Dimension(500,500));
      setLocationRelativeTo(null); //set location at the center
      setTitle("Transparency");
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      menuBar = new JMenuBar();
      setJMenuBar(menuBar);
      JMenu help = new JMenu("Help");
      menuBar.add(help);
      canvas = new TransparentCanvas();
      pane = (JComponent)this.getContentPane();
      pane.add(canvas);
      //scrollPane = new JScrollPane(canvas);
      //pane.add(scrollPane, BorderLayout.CENTER);
    }

    public static void main(String[] args) 
    {
      JFrame.setDefaultLookAndFeelDecorated(true);

      TransparentWindow transparentWindow = new TransparentWindow();
      transparentWindow.setVisible(true);
    }

    class TransparentCanvas extends JComponent 
    {
      public TransparentCanvas()
      {
        super();            
        setPreferredSize(new Dimension(500,500));
      }

      @Override
      public void paintComponent(Graphics g) 
      {
        super.paintComponent(g);
        Graphics2D g2D = (Graphics2D)g;
        g2D.setColor(new Color(240, 240, 240, 128));
        g2D.fillRect(0, 0, getWidth(), getHeight());
        g2D.setColor(Color.blue);
        g2D.fillOval(200, 150, 100, 100);
        g2D.dispose();
      }
    }
}

透明窗口

透明的窗户

使用JScrollPane (通过取消注释上面构造函数末尾的两行),您将获得不透明的颜色(请参见下图):

不透明的窗户

不透明的窗户

并且调用setUndecorated(true)也不会使它工作。 (顺便说一句,我需要使用Java 7,因为其他一些应用程序。)

请帮忙。 在此先感谢您的时间!

大多数Swing组件都是不透明的,但JScrollPane有点不同,它实际上是一个复合组件,由JScrollPaneJViewPort (和滚动条)组成,用于显示viewComponent的一部分。

为了使它按照您希望的方式工作,您需要使JScrollPaneJViewPort透明,例如

透明

scrollPane = new JScrollPane(canvas);
scrollPane.setOpaque(false);
scrollPane.getViewport().setOpaque(false);
pane.add(scrollPane, BorderLayout.CENTER);

完全可运行的例子......

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JScrollPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TransparentWindow extends JFrame {

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                TransparentWindow transparentWindow = new TransparentWindow();
                transparentWindow.setVisible(true);
                transparentWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                transparentWindow.setVisible(true);
            }
        });
    }

    JMenuBar menuBar;
    TransparentCanvas canvas;
    JComponent pane;
    JScrollPane scrollPane;

    public TransparentWindow() {
        setUndecorated(true);
        setBackground(new Color(0, 0, 0, 0));
        setSize(new Dimension(500, 500));
        setLocationRelativeTo(null); //set location at the center
        setTitle("Transparency");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        menuBar = new JMenuBar();
        setJMenuBar(menuBar);
        JMenu help = new JMenu("Help");
        menuBar.add(help);
        canvas = new TransparentCanvas();
        pane = (JComponent) this.getContentPane();
        pane.add(canvas);
        scrollPane = new JScrollPane(canvas);
        scrollPane.setOpaque(false);
        scrollPane.getViewport().setOpaque(false);
        pane.add(scrollPane, BorderLayout.CENTER);
    }

    class TransparentCanvas extends JComponent {

        public TransparentCanvas() {
            super();
            setPreferredSize(new Dimension(500, 500));
        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2D = (Graphics2D) g;
            g2D.setColor(new Color(240, 240, 240, 128));
            g2D.fillRect(0, 0, getWidth(), getHeight());
            g2D.setColor(Color.blue);
            g2D.fillOval(200, 150, 100, 100);
            g2D.dispose();
        }
    }
}
panel.setBackground( new Color(r, g, b, a) );

“a”是不透明度的alpha设置。

来自这个答案的资源

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM