java JFrame中与setUndecorated()相关的几个特效
2012-11-21 16:38
253 查看
最近在学习swing,分享下自己的成果——与setUndecorated相关的几个特效
例子1、渐变透明
this.setUndecorated(true);
JPanel gradPanel = new JPanel() {
Color colorA = new Color(255, 0, 0 , 0);
// Solid red
Color colorB = new Color(255, 0, 0, 255);
protected void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
GradientPaint gp;
gp = new GradientPaint(0.0f, 0.0f, colorA, 0.0f, getHeight(),
colorB, true);
g2d.setPaint(gp);
g2d.fillRect(0, 0, getWidth(), getHeight());
}
};
gradPanel.setPreferredSize(new Dimension(300, 200));
gradPanel.setLayout(new BoxLayout(gradPanel, BoxLayout.Y_AXIS));
JButton btnClose = new JButton("Close");
ActionListener al = new ActionListener() {
public void actionPerformed(ActionEvent ae) {
System.exit(0);
}
};
btnClose.addActionListener(al);
btnClose.setAlignmentX(0.5f);
gradPanel.add(Box.createVerticalGlue());
gradPanel.add(btnClose);
gradPanel.add(Box.createVerticalGlue());
setContentPane(gradPanel);
if (!getGraphicsConfiguration().isTranslucencyCapable()) {
System.err.println("per-pixel translucency not in effect for "
+ "this graphics configuration");
System.exit(0);
}
setBackground(new Color(0, 0, 0, 0));
pack();
setLocationRelativeTo(null);
setVisible(true);
例子2、滑竿控制窗体透明
this.setUndecorated(true);
this.setLocationRelativeTo(null);
JSlider slider = new JSlider(40, 100, 100);
ChangeListener cl = new ChangeListener() {
public void stateChanged(ChangeEvent ce) {
JSlider source = (JSlider) ce.getSource();
// 原来只要用这个方法来控制透明度的啊,
setOpacity(source.getValue() / 100.0f);
}
};
slider.addChangeListener(cl);
getContentPane().setLayout(new FlowLayout());
getContentPane().add(new JLabel("向透明"));
getContentPane().add(new JPanel() {
{
add(slider);
}
});
getContentPane().add(new JLabel("向不透明"));
getRootPane().setDoubleBuffered(false);
pack();
setVisible(true);
例子3、颜色渐变的椭圆窗体
setUndecorated(true); // 去掉外面的边框修饰。
this.setSize(500,400);
JPanel gradPanel = new JPanel() {
Color colorA = new Color(255, 255, 255);
Color colorB = new Color(255, 100, 200);
protected void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
GradientPaint gp;
gp = new GradientPaint(0.0f, 0.0f, colorA, 0.0f, getHeight(),
colorB, true);
g2d.setPaint(gp);
g2d.fillRect(0, 0, getWidth(), getHeight());
}
};
gradPanel.setPreferredSize(new Dimension(300, 200));
gradPanel.setLayout(new BoxLayout(gradPanel, BoxLayout.Y_AXIS));
JButton btnClose = new JButton("Close");
ActionListener al;
al = new ActionListener() {
public void actionPerformed(ActionEvent ae) {
System.exit(0);
}
};
btnClose.addActionListener(al);
btnClose.setAlignmentX(0.5f);
gradPanel.add(Box.createVerticalGlue());
gradPanel.add(btnClose);
gradPanel.add(Box.createVerticalGlue());
setContentPane(gradPanel);
pack();
Ellipse2D dd = new Ellipse2D.Double(0,0 , getWidth(), getHeight());
setShape(dd);
setLocationRelativeTo(null); // 设置窗体位置为居中
setVisible(true);
例子4、自定义窗体边框(最小化,最大化,关闭等按钮和图标)
目前还没有做,不过原理知道。利用两个面板(JPanel),一个作为上面的边框面板,一个作为组件Component的载体,如果要能够移动窗体的话,那么就在边框面板添加鼠标事件,来控制窗体在桌面上的位置。
在这三个例子中,都必须setUndecorated(true);意思是去掉窗体外面的边框修饰,如果没有这限制的话,那么就会抛出异常。
对于这些装饰可能还不能达到真正想要的,毕竟这是有限的。如果想要真正修饰Component的话,可以用JDk7中的JLayer。
对前三个是否支持还要看电脑环境是否支持故需要判断:
GraphicsEnvironment ge;
// 用来判断上下文环境是否支持的
ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
if (!ge.getDefaultScreenDevice().isWindowTranslucencySupported(
GraphicsDevice.WindowTranslucency.PERPIXEL_TRANSPARENT)) {
System.err.println("per-pixel transparency isn't "
+ "supported");
return;
}
new jframe();
jframe继承了JFrame
不论是哪个,反正都要 setUndecorated(true); // 去掉外面的边框修饰。
例子1、渐变透明
this.setUndecorated(true);
JPanel gradPanel = new JPanel() {
Color colorA = new Color(255, 0, 0 , 0);
// Solid red
Color colorB = new Color(255, 0, 0, 255);
protected void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
GradientPaint gp;
gp = new GradientPaint(0.0f, 0.0f, colorA, 0.0f, getHeight(),
colorB, true);
g2d.setPaint(gp);
g2d.fillRect(0, 0, getWidth(), getHeight());
}
};
gradPanel.setPreferredSize(new Dimension(300, 200));
gradPanel.setLayout(new BoxLayout(gradPanel, BoxLayout.Y_AXIS));
JButton btnClose = new JButton("Close");
ActionListener al = new ActionListener() {
public void actionPerformed(ActionEvent ae) {
System.exit(0);
}
};
btnClose.addActionListener(al);
btnClose.setAlignmentX(0.5f);
gradPanel.add(Box.createVerticalGlue());
gradPanel.add(btnClose);
gradPanel.add(Box.createVerticalGlue());
setContentPane(gradPanel);
if (!getGraphicsConfiguration().isTranslucencyCapable()) {
System.err.println("per-pixel translucency not in effect for "
+ "this graphics configuration");
System.exit(0);
}
setBackground(new Color(0, 0, 0, 0));
pack();
setLocationRelativeTo(null);
setVisible(true);
例子2、滑竿控制窗体透明
this.setUndecorated(true);
this.setLocationRelativeTo(null);
JSlider slider = new JSlider(40, 100, 100);
ChangeListener cl = new ChangeListener() {
public void stateChanged(ChangeEvent ce) {
JSlider source = (JSlider) ce.getSource();
// 原来只要用这个方法来控制透明度的啊,
setOpacity(source.getValue() / 100.0f);
}
};
slider.addChangeListener(cl);
getContentPane().setLayout(new FlowLayout());
getContentPane().add(new JLabel("向透明"));
getContentPane().add(new JPanel() {
{
add(slider);
}
});
getContentPane().add(new JLabel("向不透明"));
getRootPane().setDoubleBuffered(false);
pack();
setVisible(true);
例子3、颜色渐变的椭圆窗体
setUndecorated(true); // 去掉外面的边框修饰。
this.setSize(500,400);
JPanel gradPanel = new JPanel() {
Color colorA = new Color(255, 255, 255);
Color colorB = new Color(255, 100, 200);
protected void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
GradientPaint gp;
gp = new GradientPaint(0.0f, 0.0f, colorA, 0.0f, getHeight(),
colorB, true);
g2d.setPaint(gp);
g2d.fillRect(0, 0, getWidth(), getHeight());
}
};
gradPanel.setPreferredSize(new Dimension(300, 200));
gradPanel.setLayout(new BoxLayout(gradPanel, BoxLayout.Y_AXIS));
JButton btnClose = new JButton("Close");
ActionListener al;
al = new ActionListener() {
public void actionPerformed(ActionEvent ae) {
System.exit(0);
}
};
btnClose.addActionListener(al);
btnClose.setAlignmentX(0.5f);
gradPanel.add(Box.createVerticalGlue());
gradPanel.add(btnClose);
gradPanel.add(Box.createVerticalGlue());
setContentPane(gradPanel);
pack();
Ellipse2D dd = new Ellipse2D.Double(0,0 , getWidth(), getHeight());
setShape(dd);
setLocationRelativeTo(null); // 设置窗体位置为居中
setVisible(true);
例子4、自定义窗体边框(最小化,最大化,关闭等按钮和图标)
目前还没有做,不过原理知道。利用两个面板(JPanel),一个作为上面的边框面板,一个作为组件Component的载体,如果要能够移动窗体的话,那么就在边框面板添加鼠标事件,来控制窗体在桌面上的位置。
在这三个例子中,都必须setUndecorated(true);意思是去掉窗体外面的边框修饰,如果没有这限制的话,那么就会抛出异常。
对于这些装饰可能还不能达到真正想要的,毕竟这是有限的。如果想要真正修饰Component的话,可以用JDk7中的JLayer。
对前三个是否支持还要看电脑环境是否支持故需要判断:
GraphicsEnvironment ge;
// 用来判断上下文环境是否支持的
ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
if (!ge.getDefaultScreenDevice().isWindowTranslucencySupported(
GraphicsDevice.WindowTranslucency.PERPIXEL_TRANSPARENT)) {
System.err.println("per-pixel transparency isn't "
+ "supported");
return;
}
new jframe();
jframe继承了JFrame
不论是哪个,反正都要 setUndecorated(true); // 去掉外面的边框修饰。
相关文章推荐
- java swing setUndecorated(true) 无效
- Java_NetWork_Endian相关的几个函数
- 谈谈 Java 线程状态相关的几个方法
- CONST的相关几个问题解答(c与c++,java)
- Java数据结构Map,List,Set及Queue相关的类图
- 与进程相关的几个ID,set-user-ID和set-group-ID
- 推荐几个自己写的Java后端相关的范例项目(转载)
- java的Set集合相关问题
- Java基础知识-集合框架Set相关
- java.lang.Thread.setDefaultUncaughtExceptionHandler()方法实例
- Java中与时间相关的几个类(Date、Calendar、SimpleDateFormat)
- 在JFrame中用setDefaultLookAndFeelDecorated()方法无效的问题
- Java容器学习笔记(二) Set接口及其实现类的相关知识总结
- Java中跟字符串相关的几个常用类
- Java日期相关开发细节,几个问题
- java 集合(list、set、map)的特点 集合相关的类有一大堆
- java中Object相关的几个方法
- JAVA中几个修饰符的作用以及一些相关话题
- 执行Cloudera相关命令时出现JAVA_HOME not set
- JAVAWEB开发之redis学习(四)——Set集合相关的操作命令