我想创建一个半透明的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, …Run Code Online (Sandbox Code Playgroud) 我有一个应用程序在几个地方使用禁用的JTextFields是透明的 - 允许显示背景而不是文本字段的正常背景.
运行新的Nimbus LAF时,这些字段是不透明的(尽管设置了setOpaque(false)),并且我的UI被破坏了.好像LAF忽略了不透明的属性.明确地设置背景颜色在几个地方都很困难,并且由于背景图像实际上不起作用而不是最佳 - 它仍然在顶部绘制LAF默认背景,留下类似边框的外观(下面的启动画面具有明确设置背景以匹配图像).
关于如何让Nimbus不为JTextField绘制背景的任何想法?
注意:我需要一个JTextField而不是JLabel,因为我需要线程安全的setText()和包装功能.
注意:我的后备位置是继续使用系统LAF,但Nimbus确实看起来好多了.
见下面的示例图片.
这种行为的意外是由于对Nimbus错误报告中的setOpaque()意图做错误的解释:
这是Swing的原始设计以及它多年来一直令人困惑的问题.问题是setOpaque(false)在退出LAF时产生了副作用,即隐藏背景并不是真正的背景.可以说,我有透明部分和swing的组件应该在其后面绘制父组件.
不幸的是,Nimbus组件似乎也不尊重setBackground(null),否则这将是停止背景绘制的推荐方法.设置完全透明的背景对我来说似乎不直观.
在我看来,setOpaque()/ isOpaque()是一个错误的公共API选择,应该只有:
public boolean isFullyOpaque();
Run Code Online (Sandbox Code Playgroud)
我这样说,因为isOpaque()== true是与Swing的契约,组件子类将负责绘制它的整个背景 - 这意味着父级可以跳过绘制该区域(如果需要)(这是一个重要的性能增强).外部的东西不能直接改变这个合同(合法地),其履行可以编码到组件中.
因此,不应使用setOpaque()设置组件的不透明度.相反,像setBackground(null)这样的东西会导致许多组件"没有背景",因此变得不完全不透明.举例来说,在理想的世界中,大多数组件应该具有如下所示的isOpaque():
public boolean isOpaque() { return (background!=null); }
Run Code Online (Sandbox Code Playgroud)
我需要创建一个看不见的面板,但其中的组件(例如,JTextArea,JButton等)应该是可见的.当我点击隐形面板时,它应该变得可见.
我只能使用JRE 1.4,仅此而已.:(
知道如何创建这样一个透明面板???
任何人都可以解释为什么Nimbius以不同于其他java LaF的方式处理setOpaque().它破坏了我的代码,因为通常透明的组件不再是.
编辑:问题似乎只涉及JTextAreas(这是我需要的)或类似的组件.
编辑编辑:这是实际应用程序的屏幕.在应用trashgod的解决方案时,背景仍然无法显示.

编辑编辑编辑:
我尝试了trashgod的建议来覆盖paint().我辛苦工作了好几个小时,无法让它发挥作用.我能够显示背景,但JinternalFrame无法移动,调整大小并选择其文本.调用super.paint(g)无法解决问题.有没有一种简单的方法可以让我失踪?
我采取了一种新方法.JInternalFrame内部是一个JLayeredPane.
第0层 - JLabel
第1层 - JTextArea
移动或调整JInternalFrame时:
因为我无法让JInternalFrame完全透明.我模拟了它的透明度.唯一的问题是,与此相关的开销很大.有什么想法吗?

package newpackage;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
import javax.swing.UIManager;
/**
* Example of how to create a transparent internal frame.
* @author dvargo
*/
public class TransparentInternalFrame extends JInternalFrame {
JLayeredPane container;
/**
* Defualt constructor to set the frame …Run Code Online (Sandbox Code Playgroud) 我正在使用Java Netbeans GUI Builder来制作GUI.我想给按钮一个透明(有光泽)的外观.我正在使用
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
Run Code Online (Sandbox Code Playgroud)
这也给了GUI很好的外观,但按钮仍然是相同的无聊按钮.
那么,如何给按钮一个透明的外观呢?