[英]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
有點不同,它實際上是一個復合組件,由JScrollPane
和JViewPort
(和滾動條)組成,用於顯示viewComponent
的一部分。
為了使它按照您希望的方式工作,您需要使JScrollPane
和JViewPort
透明,例如
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();
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.