java 怎么让JLabel和JPanel透明?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 怎么让JLabel和JPanel透明?相关的知识,希望对你有一定的参考价值。
import java.awt.*;
import javax.swing.*;
import java.util.*;
class ClockPaint extends JPanel implements Runnable
int x, y, r;
int h, m, s;//小时,分钟,秒
double rad = Math.PI / 180;
public ClockPaint(int x, int y, int r)
this.x = x;
this.y = y;
this.r = r;
Calendar now = new GregorianCalendar();
s = now.get(Calendar.SECOND) * 6;//获得秒转换成度数
m = now.get(Calendar.MINUTE) * 6;//获得分钟
h = (now.get(Calendar.HOUR_OF_DAY) - 12) * 30 + now.get(Calendar.MINUTE) / 12 * 6;//获得小时
Thread t = new Thread(this);
t.start();
public void paint(Graphics g)
//清屏
super.paint(g);
g.setColor(null);
Image img = new ImageIcon("c:/2.jpg").getImage();
g.drawImage(img, 0, 0, null);
//g.fillRect(0, 0, r * 3, r * 3);
//画圆
g.setColor(Color.WHITE);
g.drawOval(x, y, r * 2, r * 2);
//秒针
g.setColor(Color.RED);
int x1 = (int)((r - 10) * Math.sin(rad * s));
int y1 = (int)((r - 10) * Math.cos(rad * s));
g.drawLine(x + r, y + r, x + r + x1, y + r - y1);
//分针
g.setColor(Color.BLUE);
x1 = (int)((r - r / 2.5) * Math.sin(rad * m));
y1 = (int)((r - r / 2.5) * Math.cos(rad * m));
g.drawLine(x + r, y + r, x + r + x1, y + r - y1);
//时针
g.setColor(Color.CYAN);
x1 = (int)((r - r / 1.5) * Math.sin(rad * h));
y1 = (int)((r - r / 1.5) * Math.cos(rad * h));
g.drawLine(x + r, y + r, x + r + x1, y + r - y1);
//数字
g.setColor(Color.YELLOW);
int d = 29;
for (int i = 1; i <= 12; i++)
x1 = (int)((r - 10) * Math.sin(rad * d));
y1 = (int)((r - 10) * Math.cos(rad * d));
g.drawString(i + "", x + r + x1 - 4, x + r - y1 + 5);
d+=30;
//小点
d = 0;
for (int i = 0; i < 60; i++)
x1 = (int)((r - 2) * Math.sin(rad * d));
y1 = (int)((r - 2) * Math.cos(rad * d));
g.drawString(".", x + r + x1 - 1, x + r - y1 + 1);
d+=6;
//显示时间
Calendar now1 = new GregorianCalendar();
g.drawString(now1.get(Calendar.HOUR_OF_DAY) + ":" + now1.get(Calendar.MINUTE) + ":" + now1.get(Calendar.SECOND), 0, 10);
public void run()
while (true)
try
Thread.sleep(1000);
catch (Exception ex)
s+=6;
if (s >= 360)
s = 0;
m+=6;
if (m == 72 || m == 144 || m == 216 || m == 288)
h+=6;
if (m >= 360)
m = 0;
h+=6;
if (h >=360)
h = 0;
this.repaint();
public class Clock extends JFrame
public Clock()
ClockPaint cp = new ClockPaint(20, 20, 70);
// JButton bn = new JButton("xxxxxxxxx");
// JPanel pan = new JPanel();
// pan.add(bn);
// this.add(BorderLayout.NORTH, bn);
JLabel lab = new JLabel("xxxxxx");
// lab.add(bn);
// lab.setOpaque(false);
lab.setBackground(null);
this.add(BorderLayout.NORTH, lab);
this.add(cp);
this.setSize(300, 320);
this.setResizable(false);
this.setLocation(260, 120);
this.setTitle("小时钟");
this.setVisible(true);
public static void main(String[] s)
new Clock();
补充这里注释掉的,都是我尝试的..都不行...请问我该怎么做,为什么不行?
如下图..时钟上面的XXXXXX的背面怎么透明掉啊?
import java.awt.*;
public class BackGround extends JFrame
Container content;
Toolkit toolkit;
JLabel bkLabel = new JLabel(); // 背景图片标签
JLabel horseLabel = new JLabel();
JButton bButton;
int screenWidth, screenHeight, WIDTH, HEIGHT;
ImageIcon backImage, bImage;
BackGround()
content = getContentPane();
toolkit = Toolkit.getDefaultToolkit();
screenWidth = toolkit.getScreenSize().width;
screenHeight = toolkit.getScreenSize().height;
bImage = new ImageIcon("pic/logo.jpg");
//我的笨方法
JLabel image_lab = new JLabel(new ImageIcon("D:\\pic\\logo.jpg"));
//编译的时候会帮你把文件拷贝到classes目录下面去
//同时要达到LZ的效果很简单,两个Panel。直接覆盖的话,如果覆盖面板小于底层面板,当鼠标移动到底层面板区域。则显示了,所以建议加上 //setEnabled(false);这样做LZ你不觉得复杂了吗?你直接在我的image_lab 上加载组件不行吗?或者你先都把组件隐藏了,等用户触发事件再显//示也可以啊。
//
backImage = new ImageIcon("pic/background.gif");
bkLabel.setIcon(backImage);
bkLabel.setOpaque(true);
WIDTH = backImage.getIconWidth();
HEIGHT = backImage.getIconHeight();
content.add(bkLabel, -1); // 添加背景图片
bButton = new JButton(bImage);
JPanel panel2 = new JPanel();
panel2.setOpaque(false); // 设置panel2背景透明
panel2.setPreferredSize(new Dimension(40, 40));
panel2.add(bButton);
content.add(panel2);
validate();
setBounds(300, 200, WIDTH, HEIGHT);
setLocation((screenWidth - WIDTH) / 2, (screenHeight - HEIGHT) / 2);
setSize(WIDTH, HEIGHT);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
public static void main(String[] args)
new BackGround();
参考技术A 你仅仅要透明吗?你的程序好长,我就不细看了,我直接把透明的语句告诉你:
比如 JPanel pan = new JPanel(); 要让它透明的话,
就加上 pan.setOpaque(false);
JLabel 一样的,因为这个是继承的 JComponent 的方法。本回答被提问者和网友采纳 参考技术B 我这里的回答不能保证正确性。如果有时间你可以尝试,如果没有时间可以考虑跳过。
以下回答,仅供参考。
我的印象里Label默认是透明的。
我对你的程序的感觉是。你的布局设置就是让Label和你的ClockPaint一个上一个下。所以产生这样的效果。
我想到的方法1:
我首先想到的办法是不用默认布局。将布局设置为null.
然后用方法设置label的位置和大小。
再设置ClockPaint的位置和大小。
(设置位置和大小可考虑使用setBounds).
我想到的方法2:
将label添加进ClockPaint里,而不是将它们分开安排。
以上两个办法是我的临时思路。
如果你有时间可以试试。
我不能保证正确性。
个人观点 ,仅供参考。
第二个方法我稍微尝试了一下。应该可以。
个人观点 ,仅供参考。 参考技术C 研究图形有什么用呢?
利用JPanel和JLabel设置背景图片
//创建面板1,放置背景图片1 JPanel jPanelTop=new JPanel(); jPanelTop.setBounds(0,-5,100,100); //x=0,y=-5用来设置面板距离窗体左上角的距离(单位是像素) jPanelTop.setOpaque(true); JLabel jLabel=new JLabel(); //创建JLabel标签,用来存放背景图片 jLabel.setBounds(0,0,100,100); Icon icon=new ImageIcon("doc/ChinaJiLiang.png"); //根据所给图片,生成指定大小的图标 jLabel.setIcon(icon); //设置标签要显示的图标 jPanelTop.add(jLabel); //将标签添加到面板中
以上是关于java 怎么让JLabel和JPanel透明?的主要内容,如果未能解决你的问题,请参考以下文章
Java 每次把一个Swing组件放在一个JPanel中时,总是放在左边,有啥办法让其放在面板中间?
添加到 BorderLayout 时,无法在 JPanel 中左对齐 JLabel