超简单的问题: 怎么改变 swing 窗口的背景颜色??

abcdhy 2006-02-05 11:53:08
请教大侠,怎么改变 swing 窗口的背景颜色:

我需要的是改变整个 swing 窗口的背景颜色,包括其中组件的背景颜色.

要一个一个的去设置是不现实的, 因为组件太多,特别是使用了 layout , 一层一层的 嵌套 JPanel(). 都必须要去设置.

这应该是改变一个 swing 的系统属性就可以了.

但我不知道要怎么修改?

请大侠指点一下,谢谢!!
...全文
1308 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
PE041025 2006-02-22
  • 打赏
  • 举报
回复
都是4星以上的超人,跟你们好好学学
abcdhy 2006-02-19
  • 打赏
  • 举报
回复
我偶尔用一下 QQ ,有什么讨论可以用 QQ 留言
alabaza 2006-02-18
  • 打赏
  • 举报
回复
晕 帖子太长 你QQ不在线?
abcdhy 2006-02-18
  • 打赏
  • 举报
回复
alabaza(呆鸟) 这样不行的

有很多组件,还是不能有 白色 的背景的,呵呵
alabaza 2006-02-18
  • 打赏
  • 举报
回复
UIManager.put("Panel.background",new Color(200,220,250));
不就行了啊 其实最好还是把上面的Panel设置为透明的
yonghar 2006-02-15
  • 打赏
  • 举报
回复
如果你是要改整个系统的lookandfeel的背景颜色。
(害我以为你只是要修改其中一个组件中的所有组件的背景色,向diggywang()表示歉意。)

建议楼主去参考jdk\demo\jfc\Metalworks的源代码。只要自己实现一个theme就可以了。
javax.swing.plaf.metal.××××
public class ××××MetalTheme extends DefaultMetalTheme
abcdhy 2006-02-14
  • 打赏
  • 举报
回复
diggywang() 在主窗口mainframe中设置lookandfeel ,就只能全部改变风格.
并不能单独只改变背景颜色的. 而且设置lookandfeel ,也并不一定能有你需要的颜色.

说到底,还就是一条, 就是,怎么去统一设置 lookandfeel 的背景色.
yonghar 2006-02-14
  • 打赏
  • 举报
回复
回复人: diggywang() ( ) 信誉:100 2006-02-10 14:55:00 得分: 0


yuzl32(Hello!有酒醉)和 abcdhy(程旭) 两位仁兄把楼主的本意思想偏得好大呀。
我个人认为,在主窗口mainframe中设置lookandfeel,更改uimanager就能解决问题。
-----------------------------------------------------------------------------
负责任地告诉你,你的方法根本行不通。
diggywang 2006-02-10
  • 打赏
  • 举报
回复
yuzl32(Hello!有酒醉)和 abcdhy(程旭) 两位仁兄把楼主的本意思想偏得好大呀。
我个人认为,在主窗口mainframe中设置lookandfeel,更改uimanager就能解决问题。
abcdhy 2006-02-09
  • 打赏
  • 举报
回复
但这样在 java1.5 中,就没有了控件的动态效果了,因此我又改进了 yuzl32(Hello!有酒醉) 的想法, 写了另一个程序, 具体源代码如下:

import java.awt.*;
import javax.swing.*;

public class BGThemeTest {

public static void main(String[] args) {
System.setProperty("swing.plaf.metal.controlFont","宋体");
// BGTheme.apply();
JFrame f = new JFrame("背景图片演示");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JPanel panel = new JPanel();

panel.add(new JLabel("哈哈,测试能不饿能用,ahga 235456"));
JButton btn = new JButton("按钮");
panel.add(btn);
panel.add(new JTextField(10));
panel.add(new JCheckBox("基督教"));
panel.add(new JScrollPane(new JTextArea(10,40)));

f.getContentPane().add(panel);
int w = 505;
int h = 360;
Dimension ScreenSize = Toolkit.getDefaultToolkit().getScreenSize();
f.setBounds((int)((ScreenSize.width-w)/2),(int)((ScreenSize.height-h)/2),w,h);
setBkColor(f,Color.WHITE);
f.setVisible(true);
}
public static void setBkColor(JFrame frame,Color color) {
setBkColor(frame.getContentPane(),color);
}
public static void setBkColor(JDialog dialog,Color color) {
setBkColor(dialog.getContentPane(),color);
}
public static void setBkColor(Container container,Color color) {
container.setBackground(color);
setBkColor(container.getComponents(),color);
}
public static void setBkColor(JPanel panel,Color color) {
panel.setBackground(color);
setBkColor(panel.getComponents(),color);
}
private static void setBkColor(Component[] ca,Color color) {
for (int i = 0; i < ca.length; i++) {
if(ca[i] instanceof JPanel) {
setBkColor((JPanel)ca[i],color);
} else {
if(ca[i] instanceof JCheckBox)
ca[i].setBackground(color);
}
}
}
}
abcdhy 2006-02-09
  • 打赏
  • 举报
回复
各位,通过这几天查看 swingset2 的源代码,我已经搞定了这个问题!
具体见源代码:

import javax.swing.plaf.ColorUIResource;
import javax.swing.plaf.metal.DefaultMetalTheme;
import javax.swing.plaf.metal.MetalLookAndFeel;

public class BGTheme extends DefaultMetalTheme {
public String getName() { return "BGTheme"; }
private final ColorUIResource secondary3 = new ColorUIResource(255, 255, 255);
protected ColorUIResource getSecondary3() { return secondary3; }

static BGTheme bgTheme = new BGTheme();
public static void apply() {
MetalLookAndFeel.setCurrentTheme(bgTheme);
}
}
yonghar 2006-02-08
  • 打赏
  • 举报
回复
楼上说的是对整个系统所有类型组件的改变了。
关于UIManager的所有属性获得可以看代码:http://java.mblogger.cn/xio/posts/11014.aspx



yuzl32(Hello!有酒醉) 的思路是可以用的。不过代码要修改一下。
给份获得组件中所有嵌套组件的代码,可以进行改造下:

/**
* Title:
* Description:
* Copyright: Copyright (c) 2005
* Company:
* @author xio
*/
public class ComponentParser {

public static void main(String[] args) {
//parseComponent(new JFrame());
parseComponent(new JOptionPane());
}

public static void parseComponent(Component component) {
deep = 1;
parseComponent_(component);
}

private static void parseComponent_(Component component) {
printComponent(component);

if (component instanceof Container) {
int oldDeep = deep;
deep += 1;

Container container = (Container) component;
int size = container.getComponentCount();
for (int i = 0; i < size; i++) {
parseComponent_(container.getComponent(i));
}
deep = oldDeep;
}
}

private static void printComponent(Component component) {
String prefixStr = "";
for (int i = 0; i < deep; i++) {
prefixStr += "*";
}

String classStr = component.getClass().toString();

String text = "";
if (component instanceof AbstractButton) {
text = ((AbstractButton) component).getText();
}
else if (component instanceof JLabel) {
text = ((JLabel) component).getText();
}
else if (component instanceof JTextComponent) {
text = ((JTextComponent) component).getText();
}

System.out.println(prefixStr + ":" + classStr + ":" + text);
}

private static int deep = 0;
}
yuzl32 2006-02-07
  • 打赏
  • 举报
回复
呵呵,怎么可能死循环呢?程序中很容易可以看出,它是以c.getComponents()为界限,如果你这个组件没有附加的组件它是不会循环下去的.
另,如果不采取遍历方式,那确实需要第一种方法才可以达到要求,即:设置系统属性或重写(src.zip有源代码)
maquan 2006-02-07
  • 打赏
  • 举报
回复
这个问题似乎更应该通过 UIManager 来解决,比如:
UIManager.put("TextPane.background", Color.black);

至于像 TextPane.background 这样的属性到底有哪些可用,恐怕就只有翻阅 JDK 的源代码了(目前我还不知道有什么别的更正宗的办法)。

比如,如果你用的是 MetalLookAndFeel,那就去看看 JDK142_01-src\j2se\src\share\classes\javax\swing\plaf\metal\MetalLookAndFeel.java 吧。当然,如果你用的是其它第三方的 L&F,也许人家有自己设置缺省值的机制。总之,这只是一个思路。
abcdhy 2006-02-06
  • 打赏
  • 举报
回复
yuzl32(Hello!有酒醉) 呵呵,你这个没用的.

不能使用在 嵌套 的面板中.

如果你用 swing 做过复杂的界面就知道了.

一个界面往往要 嵌套 多层 JPanel() 才能布局.

也就是 一个JPanel 包括几个 JPanel ,而这几个 JPanel 又会再包括 JPanel 或组件,才能做出复杂的界面.
abcdhy 2006-02-06
  • 打赏
  • 举报
回复
这个你测试过吗??

cArr[i] instanceof Container

swing 的所有组件都是来自于: Container 的

比如: JButton 类的继承结构.
java.lang.Object
java.awt.Component
java.awt.Container
javax.swing.JComponent
javax.swing.AbstractButton
javax.swing.JButton

先姑且不论你的程序是不是"死循环递归"
单从效率来讲就已经很低了.
yuzl32 2006-02-06
  • 打赏
  • 举报
回复
随便也写了个测试 : )

import javax.swing.*;
import java.awt.*;

public class T extends JFrame
{
public T()
{
super("统一设置背景色");
JButton btn = new JButton("测试一");
getContentPane().add(btn,BorderLayout.SOUTH);

setSize(450,400);
setVisible(true);
}

public static void main(String[] args) throws Exception
{
T app = new T();
setBkColor(app.getContentPane(),Color.YELLOW);
app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

// 统一设置背景色
public static void setBkColor(Container c,Color clr)
{
Component[] cArr = c.getComponents();

for (int i = 0; i < cArr.length; i ++)
{
cArr[i].setBackground(clr);
}

c.setBackground(clr);
}
}
yuzl32 2006-02-06
  • 打赏
  • 举报
回复
也可以换种思路统一更改

// 统一设置背景色
public static void setBkColor(Container c,Color clr)
{
Component[] cArr = c.getComponents();

for (int i = 0; i < cArr.length; i ++)
{
cArr[i].setBackground(clr);
}
}
yuzl32 2006-02-06
  • 打赏
  • 举报
回复
简单,更改一下即可.

import javax.swing.*;
import java.awt.*;

public class T extends JFrame
{
public T()
{
super("统一设置背景色");
JButton btn = new JButton("测试一");
JPanel p = new JPanel();
p.add(btn);
p.add(new JButton("测试二"));
p.setSize(20,30);
getContentPane().add(p,BorderLayout.SOUTH);

setSize(450,400);
setVisible(true);
}

public static void main(String[] args) throws Exception
{
T app = new T();
setBkColor(app.getContentPane(),Color.YELLOW);
app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

// 统一设置背景色
public static void setBkColor(Container c,Color clr)
{
Component[] cArr = c.getComponents();

for (int i = 0; i < cArr.length; i ++)
{
if (cArr[i] instanceof Container)
setBkColor((Container)cArr[i],clr);// 循环设置
//cArr[i].setBackground(clr);
}

c.setBackground(clr);
}
}

62,635

社区成员

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

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