java 怎么让JLabel和JPanel透明?

importjava.awt.*;importjavax.swing.*;importjava.util.*;classClockPaintextendsJPanelim... 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的背面怎么透明掉啊?
展开
 我来答
似灵杉0Ey
推荐于2016-07-25 · TA获得超过313个赞
知道小有建树答主
回答量:341
采纳率:55%
帮助的人:145万
展开全部
import javax.swing.*;

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();
}
}
帐号已注销
推荐于2018-02-28 · TA获得超过5622个赞
知道大有可为答主
回答量:1459
采纳率:0%
帮助的人:1377万
展开全部
你仅仅要透明吗?你的程序好长,我就不细看了,我直接把透明的语句告诉你:

比如 JPanel pan = new JPanel(); 要让它透明的话,
就加上 pan.setOpaque(false);

JLabel 一样的,因为这个是继承的 JComponent 的方法。
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
talenian
2010-05-05 · 超过59用户采纳过TA的回答
知道答主
回答量:147
采纳率:0%
帮助的人:137万
展开全部
我这里的回答不能保证正确性。如果有时间你可以尝试,如果没有时间可以考虑跳过。
以下回答,仅供参考。

我的印象里Label默认是透明的。
我对你的程序的感觉是。你的布局设置就是让Label和你的ClockPaint一个上一个下。所以产生这样的效果。
我想到的方法1:
我首先想到的办法是不用默认布局。将布局设置为null.
然后用方法设置label的位置和大小。
再设置ClockPaint的位置和大小。
(设置位置和大小可考虑使用setBounds).

我想到的方法2:
将label添加进ClockPaint里,而不是将它们分开安排。

以上两个办法是我的临时思路。
如果你有时间可以试试。
我不能保证正确性。
个人观点 ,仅供参考。

第二个方法我稍微尝试了一下。应该可以。
个人观点 ,仅供参考。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友8d22322fe
2010-05-06
知道答主
回答量:28
采纳率:0%
帮助的人:0
展开全部
研究图形有什么用呢?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式