怎样实现半透明的JPanel?

AlstonWilliams 2015-08-26 09:36:42
我打算在一个JPanel中,再添加一个半透明的JPanel,自己指定这个JPanel的位置,高度与宽度。自己尝试了好长时间,也搜索了好长时间,但是效果总是有偏差。下面是最接近实现效果的了。可是依然有些偏差。实际的JPanel的大小,比我指定的要小一些。请问我代码哪里错了呢?或者请指教我该怎么来实现。不胜感激。
下面是我写的代码:

public class TranslucenceJPanel extends JPanel {

private float transparency;

public TranslucenceJPanel(){
}



/**set the transparency
*
* @param transparency:the transparency you want to set
*
* @return void
*/
public void setTransparent(float transparency) {
this.transparency = transparency;
}

@Override
protected void paintComponent(Graphics g){
super.paintComponent(g);

Graphics2D graphics2d = (Graphics2D) g.create();
graphics2d.setComposite(AlphaComposite.SrcOver.derive(transparency));

graphics2d.fill(getBounds());
graphics2d.dispose();
}
}

...全文
329 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
AlstonWilliams 2015-08-26
  • 打赏
  • 举报
回复
引用 3 楼 geminit2011 的回复:

package trans;

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class TranslucenceJPanel extends JPanel {
	
	private float transparency = .1f;
	
	public TranslucenceJPanel(){
	}
	
	
	
	/**set the transparency
	 * 
	 * @param transparency:the transparency you want to set
	 * 
	 * @return void
	 */
	public void setTransparent(float transparency) {
		this.transparency = transparency;
	}
	
	@Override
	protected void paintComponent(Graphics g){
		super.paintComponent(g);
		
		Graphics2D graphics2d = (Graphics2D) g.create();
		graphics2d.setComposite(AlphaComposite.SrcOver.derive(transparency));
		graphics2d.setColor(Color.green);
		graphics2d.fillRect(0, 0, 100, 100);
		graphics2d.dispose();
	}
	
	public static void main(String[] args) {
		JFrame frame = new JFrame();
		frame.setSize(new Dimension(800, 600));
		frame.setPreferredSize(new Dimension(800, 600));
		frame.add(new TranslucenceJPanel());
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
}
测试之后确认没有什么大问题; 1.setTransparent方法是否有调用; 2.graphics2d.fill()可以指定填充范围; 3.布局也可能是问题;
这是我调用那个类的代码,麻烦你帮我看一下好吗?

//主JPanel
		contentPane = new JPanel();
		contentPane.setOpaque(false);
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		contentPane.setLayout(null);
		setContentPane(contentPane);
		//列表panel
		listPanel = new TranslucenceJPanel();
		listPanel.setLayout(null);
		listPanel.setOpaque(false);
		listPanel.setBounds(46, 114, 315, 521);
		listPanel.setTransparent(0.5f);
		contentPane.add(listPanel);
Geminit 2015-08-26
  • 打赏
  • 举报
回复

package trans;

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class TranslucenceJPanel extends JPanel {
	
	private float transparency = .1f;
	
	public TranslucenceJPanel(){
	}
	
	
	
	/**set the transparency
	 * 
	 * @param transparency:the transparency you want to set
	 * 
	 * @return void
	 */
	public void setTransparent(float transparency) {
		this.transparency = transparency;
	}
	
	@Override
	protected void paintComponent(Graphics g){
		super.paintComponent(g);
		
		Graphics2D graphics2d = (Graphics2D) g.create();
		graphics2d.setComposite(AlphaComposite.SrcOver.derive(transparency));
		graphics2d.setColor(Color.green);
		graphics2d.fillRect(0, 0, 100, 100);
		graphics2d.dispose();
	}
	
	public static void main(String[] args) {
		JFrame frame = new JFrame();
		frame.setSize(new Dimension(800, 600));
		frame.setPreferredSize(new Dimension(800, 600));
		frame.add(new TranslucenceJPanel());
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
}
测试之后确认没有什么大问题; 1.setTransparent方法是否有调用; 2.graphics2d.fill()可以指定填充范围; 3.布局也可能是问题;
AlstonWilliams 2015-08-26
  • 打赏
  • 举报
回复
引用 1 楼 mg2flyingff 的回复:
我测试了一下,这段代码没有问题,应该是你布局的问题。
请问你是使用的什么布局啊,我是使用的绝对布局。可以将你的测试的代码贴出来借鉴一下吗?
0萌萌哒0 2015-08-26
  • 打赏
  • 举报
回复
我测试了一下,这段代码没有问题,应该是你布局的问题。
AlstonWilliams 2015-08-26
  • 打赏
  • 举报
回复
引用 3 楼 geminit2011 的回复:

package trans;

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class TranslucenceJPanel extends JPanel {
	
	private float transparency = .1f;
	
	public TranslucenceJPanel(){
	}
	
	
	
	/**set the transparency
	 * 
	 * @param transparency:the transparency you want to set
	 * 
	 * @return void
	 */
	public void setTransparent(float transparency) {
		this.transparency = transparency;
	}
	
	@Override
	protected void paintComponent(Graphics g){
		super.paintComponent(g);
		
		Graphics2D graphics2d = (Graphics2D) g.create();
		graphics2d.setComposite(AlphaComposite.SrcOver.derive(transparency));
		graphics2d.setColor(Color.green);
		graphics2d.fillRect(0, 0, 100, 100);
		graphics2d.dispose();
	}
	
	public static void main(String[] args) {
		JFrame frame = new JFrame();
		frame.setSize(new Dimension(800, 600));
		frame.setPreferredSize(new Dimension(800, 600));
		frame.add(new TranslucenceJPanel());
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
}
测试之后确认没有什么大问题; 1.setTransparent方法是否有调用; 2.graphics2d.fill()可以指定填充范围; 3.布局也可能是问题;
不好意思,因为你跟那位回复的差不多。我还以为是同一个人,就 只给他一个人分了。我想修改的时候发现已经结贴结束,改不了了。实在是不好意思,麻烦你了。
AlstonWilliams 2015-08-26
  • 打赏
  • 举报
回复
引用 1 楼 mg2flyingff 的回复:
我测试了一下,这段代码没有问题,应该是你布局的问题。
我已经解决了,原因是不能使用getBounds.Graphics早已经设置好了x,y坐标,如果用getBounds就把它加倍了。所以应当使用graphics2d.fillRect(0, 0, getWidth(), getHeight());
0萌萌哒0 2015-08-26
  • 打赏
  • 举报
回复
引用 2 楼 Mr_Pang 的回复:
[quote=引用 1 楼 mg2flyingff 的回复:] 我测试了一下,这段代码没有问题,应该是你布局的问题。
请问你是使用的什么布局啊,我是使用的绝对布局。可以将你的测试的代码贴出来借鉴一下吗?[/quote] 我的代码:

package test;

import java.awt.AlphaComposite;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JFrame;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class TestPanel extends JFrame {
	public TestPanel() {
		TranslucenceJPanel px = new TranslucenceJPanel();
		px.setTransparent(.5f);
		add(px, BorderLayout.CENTER);
		px.setPreferredSize(new Dimension(200, 200));
		setResizable(true);
		pack();
		setLocationRelativeTo(null);
		setVisible(true);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
	}
	public class TranslucenceJPanel extends JPanel {
		private float transparency;
		public TranslucenceJPanel() {
		}
		public void setTransparent(float transparency) {
			this.transparency = transparency;
		}
		@Override
		protected void paintComponent(Graphics g) {
			super.paintComponent(g);
			Graphics2D graphics2d = (Graphics2D) g.create();
			graphics2d.setComposite(AlphaComposite.SrcOver.derive(transparency));
			graphics2d.fill(getBounds());
			System.out.println(getBounds());
			graphics2d.dispose();
		}
	}
	public static void main(String[] args) {
		new TestPanel();
	}
}

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧