簡體   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