Paw*_*pta 12 java swing jframe
我想创建一个半透明的JPanel.我通过简单地使用颜色构造函数的RGBA值来完成它,但问题是当我使用事件处理没有正确地进行操作时.我的要求是一个半透明的Jpanel,当鼠标进入它时,此面板的边框变得可见,如果鼠标退出边框,则不可见.我通过遵循代码完成了这个,但问题是它不能正常工作的透明背景(RGBA),但它适用于RGB颜色.
import javax.swing.*;
import javax.swing.border.*;
import java.awt.*;
import java.awt.event.*;
public class MDCW extends JFrame {
private JPanel contentPane;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
MDCW frame = new MDCW();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public MDCW() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 1013, 551);
contentPane = new JPanel();
contentPane.setBackground(new Color(0, 139, 139));
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
final JPanel panel = new JPanel();
panel.setBackground(new Color(0, 0, 0,50));
panel.addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
panel.setBorder(new LineBorder(new Color(255, 255, 255), 5));
}
@Override
public void mouseExited(MouseEvent e) {
panel.setBorder(null);
}
});
panel.setBounds(360, 155, 215, 215);
contentPane.add(panel);
final JPanel panel_1 = new JPanel();
panel_1.setBackground(new Color(0, 0, 0));
panel_1.addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
panel_1.setBorder(new LineBorder(new Color(255, 255, 255), 5));
}
@Override
public void mouseExited(MouseEvent e) {
panel_1.setBorder(null);
}
});
panel_1.setBounds(84, 155, 215, 215);
contentPane.add(panel_1);
}
}
Run Code Online (Sandbox Code Playgroud)
Kev*_*eid 21
JPanel不支持半透明背景.处理此问题需要两个步骤:
首先,要有任何正确运作的透明度,你必须 setOpaque(false)
在面板上; 否则你会有毛刺,因为假设一个不透明的面板完全覆盖其边界下面的东西.
但是,如果opaque
是false
,面板也根本不绘制其背景(!),因此您必须在paintComponent中绘制背景.
这是一个直接替换类,它将处理这两个步骤.
private class TransparentPanel extends JPanel {
{
setOpaque(false);
}
public void paintComponent(Graphics g) {
g.setColor(getBackground());
Rectangle r = g.getClipBounds();
g.fillRect(r.x, r.y, r.width, r.height);
super.paintComponent(g);
}
}
Run Code Online (Sandbox Code Playgroud)
我已经检查过,如果我将第一个面板创建更改为:
final JPanel panel = new TransparentPanel();
Run Code Online (Sandbox Code Playgroud)
它很容易做到这样:
// initialise JPanel
JPanel somePanel = new JPanel(new GridBagLayout());
somePanel.setBackground(new Color(0,0,0,x);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,x是你正在寻找的透明度水平0是不可见的,100是固体.
例如:
somePanel.setBackground(new Color(0,0,0,55)
Run Code Online (Sandbox Code Playgroud)
请参阅:http : //docs.oracle.com/javase/7/docs/api/java/awt/Color.html http://docs.oracle.com/javase/7/docs/api/javax/swing/JComponent html的
归档时间: |
|
查看次数: |
27099 次 |
最近记录: |