setopaque java_java中的setOpaque()

任何人都可以解释为什么Nimbius以与其他java LaF不同的方式处理setOpaque()。它破坏了我的代码,因为通常透明的组件不再是。java中的setOpaque()

编辑:问题似乎只处理JTextAreas(这是我需要)或类似的组件。

编辑编辑:这是实际应用程序的屏幕。当应用垃圾回收解决方案时,背景仍然不会显示。

Dd6Wm.jpg

编辑编辑编辑:

我试过trashgod的建议覆盖paint()方法。我为此付出了数小时的努力,并且无法实现它的工作。我能够获得背景以显示,但JinternalFrame无法移动,调整大小并选择文本。调用super.paint(g)无法解决问题。有没有简单的方法来做到这一点,我可能会失踪?

我采取了新的方法。 JInternalFrame内部是一个JLayeredPane。

层0 - 的JLabel

第1层 - 的JTextArea

当JInternalFrame处于移动或调整大小:

使本身不可见

注意到的是,其中的屏幕截图在容器其包含在中

用它拍摄的图像绘制JLabel

使其本身再次可见。

因为我无法让JInternalFrame完全透明。我模拟了它的透明度。唯一的问题是,与此有关的很多开销。有什么想法吗?

k8b0n.jpg

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 up

* @param container The container for the frame

* @param opacity The opacity of the frame

*/

public TransparentInternalFrame(JLayeredPane container, int opacity) {

super("", true, true, true, true);

this.container = container;

initComponents();

setSize(200, 200);

putClientProperty("JInternalFrame.isPalette", Boolean.TRUE);

scrollPane.setBackground(new Color(0, 0, 0, opacity));

scrollPane.getViewport().setBackground(new Color(0, 0, 0, opacity));

textArea.setBackground(new Color(0, 0, 0, opacity));

setBG();

}

/**

* Builds the GUI

*/

private void initComponents() {

layeredPane = new javax.swing.JLayeredPane();

imageLabel = new javax.swing.JLabel();

scrollPane = new javax.swing.JScrollPane();

textArea = new javax.swing.JTextArea();

imageLabel.setBounds(0, 0, 360, 260);

layeredPane.add(imageLabel, javax.swing.JLayeredPane.DEFAULT_LAYER);

scrollPane.setBorder(null);

textArea.setColumns(20);

textArea.setRows(5);

textArea.addKeyListener(new java.awt.event.KeyAdapter() {

public void keyPressed(java.awt.event.KeyEvent evt) {

textAreaKeyPressed(evt);

}

public void keyReleased(java.awt.event.KeyEvent evt) {

textAreaKeyReleased(evt);

}

public void keyTyped(java.awt.event.KeyEvent evt) {

textAreaKeyTyped(evt);

}

});

addComponentListener(new java.awt.event.ComponentAdapter() {

public void componentMoved(java.awt.event.ComponentEvent evt) {

frameMoved();

}

public void componentResized(java.awt.event.ComponentEvent evt) {

frameResized();

}

});

scrollPane.setViewportView(textArea);

scrollPane.setBounds(0, 0, 360, 260);

layeredPane.add(scrollPane, javax.swing.JLayeredPane.PALETTE_LAYER);

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());

getContentPane().setLayout(layout);

layout.setHorizontalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(layeredPane, javax.swing.GroupLayout.PREFERRED_SIZE, 362, javax.swing.GroupLayout.PREFERRED_SIZE));

layout.setVerticalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(layeredPane, javax.swing.GroupLayout.PREFERRED_SIZE, 261, javax.swing.GroupLayout.PREFERRED_SIZE));

}

/**

* The text will be blurred with out this

* @param evt

*/

private void textAreaKeyTyped(java.awt.event.KeyEvent evt) {

repaintAll();

}

/**

* The text will be blurred with out this

* @param evt

*/

private void textAreaKeyPressed(java.awt.event.KeyEvent evt) {

repaintAll();

}

/**

* The text will be blurred with out this

* @param evt

*/

private void textAreaKeyReleased(java.awt.event.KeyEvent evt) {

repaintAll();

}

/**

* Capture whats behind the frame and paint it to the image label

*/

private void setBG() {

setVisible(false);

Rectangle location = new Rectangle(this.getX() + container.getX(),

this.getY() + container.getY(),

(int) this.getSize().getWidth() + 8 + ((javax.swing.plaf.basic.BasicInternalFrameUI) getUI()).getNorthPane().getWidth(),

(int) this.getSize().getHeight() + ((javax.swing.plaf.basic.BasicInternalFrameUI) getUI()).getNorthPane().getHeight() + 4);

ImageIcon newIcon = new ImageIcon(createImage((JComponent) container, location));

setVisible(true);

imageLabel.setIcon(newIcon);

repaint();

}

/**

* Only need to update the image label if the frame is moved or resized

*/

private void frameResized() {

setBG();

textArea.repaint();

}

/**

* Only need to update the image label if the frame is moved or resized

*/

private void frameMoved() {

setBG();

for(Component x : container.getComponents())

{

//see if its a jinternalframe

if(x.getClass().getName().equals(this.getClass().getName()))

{

//cast it

TransparentInternalFrame temp = (TransparentInternalFrame)x;

//make sure its not the same one as this

if(x.getBounds().equals(this.getBounds()))

{

return;

}

//if they intersect

if(x.getBounds().intersects(this.getBounds()))

{

this.setVisible(false);

temp.setBG();

this.setVisible(true);

}

}

}

textArea.repaint();

}

private void repaintAll() {

textArea.repaint();

imageLabel.repaint();

layeredPane.repaint();

scrollPane.repaint();

scrollPane.getViewport().repaint();

textArea.repaint();

repaint();

}

/**

* Create a BufferedImage for Swing components.

* All or part of the component can be captured to an image.

*

* @param component Swing component to create image from

* @param region The region of the component to be captured to an image

* @return image the image for the given region

*/

public static BufferedImage createImage(JComponent component, Rectangle region) {

// Make sure the component has a size and has been layed out.

// (necessary check for components not added to a realized frame)

if (!component.isDisplayable()) {

Dimension d = component.getSize();

if (d.width == 0 || d.height == 0) {

d = component.getPreferredSize();

component.setSize(d);

}

layoutComponent(component);

}

BufferedImage image = new BufferedImage(region.width, region.height, BufferedImage.TYPE_INT_RGB);

Graphics2D g2d = image.createGraphics();

// Paint a background for non-opaque components,

// otherwise the background will be black

if (!component.isOpaque()) {

g2d.setColor(component.getBackground());

g2d.fillRect(region.x, region.y, region.width, region.height);

}

g2d.translate(-region.x, -region.y);

component.paint(g2d);

g2d.dispose();

return image;

}

public static void layoutComponent(Component component) {

synchronized (component.getTreeLock()) {

component.doLayout();

if (component instanceof Container) {

for (Component child : ((Container) component).getComponents()) {

layoutComponent(child);

}

}

}

}

private javax.swing.JLabel imageLabel;

private javax.swing.JScrollPane scrollPane;

private javax.swing.JLayeredPane layeredPane;

private javax.swing.JTextArea textArea;

public static void main(String args[])

{

try

{

UIManager.setLookAndFeel(

"com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");

}

catch (Exception e)

{

e.printStackTrace();

}

JFrame container = new JFrame();

container.setSize(800, 800);

JLayeredPane layerPanel = new JLayeredPane();

layerPanel.setSize(800, 800);

container.getContentPane().add(layerPanel);

layerPanel.setVisible(true);

JPanel colorPanel = new JPanel();

colorPanel.setSize(800,800);

colorPanel.setBackground(Color.red);

layerPanel.add(colorPanel);

layerPanel.setLayer(colorPanel, JLayeredPane.DEFAULT_LAYER);

TransparentInternalFrame frameA = new TransparentInternalFrame(layerPanel,0);

frameA.setVisible(true);

layerPanel.add(frameA);

layerPanel.setLayer(frameA, 1);

frameA.setSize(282,282);

TransparentInternalFrame frameB = new TransparentInternalFrame(layerPanel, 0);

frameB.setVisible(true);

layerPanel.add(frameB);

layerPanel.add(frameB,1);

frameB.setLocation(300, 300);

frameB.setSize(282,282);

container.repaint();

container.setVisible(true);

}

}

+0

重新格式化的代码;如果不正确请回复。 –

2010-11-04 23:53:47

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值