论坛首页 Java企业应用论坛

支持Swing - 自定义Swing界面

浏览 17705 次
精华帖 (1) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-09-08   最后修改:2011-09-08
重构paint方法就可以实现你想要的发光、水晶等效果!!
见附件效果图与源码!  源码编译后可直接运行!

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;

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

/**
* 只要改变getDelColors()中的算法就会出现不同渐变效果!!! 最简单的就是循序等额递减!!
* 然后到处使用该Panel替代默认的JPanel,然后将上面的其他控件都设置成透明(setOpaque(false)),则整个系统就会显得很漂亮了!
* 其他Swing控件都可以类似重构!!!
* 但如果把其他控件都设成透明的,然后最后都加载在该面板上面,则其他控件都无需重构就会出现效果!!比如:
* JTree tree= new JTree();  //
* tree.setOpaque(false);  //透明!
* JScrollPanel scroll = new JScrollPanel(tree);  //
* scroll.setOpaque(false);  //透明
* scroll.getViewPort().setOpaque(false);
* TestBGPanel panel = new TestBGPanel(new BorderLayout());  //创建渐变效果面板
* panel.add(scroll);  //将滚动框加载进来,则这个树的背景就是渐变效果了,则界面就丰富了!!!
* @author xch
*
*/
public class TestBGPanel extends JPanel {

  @Override
  /**
   * 关键是重构该方法!!
   * 也可以重构JPanel的该方法
   */
  public void paint(Graphics g) {
    Graphics2D g2 = (Graphics2D) g; //
    int li_beginx = (int) g2.getClipBounds().getX(); //
    int li_beginy = (int) g2.getClipBounds().getY(); //
    int li_width = this.getWidth();
    int li_height = this.getHeight(); //

    g2.setColor(Color.BLACK); //
    g2.drawRect(li_beginx, li_beginy, li_width - 1, li_height - 1); //画边框
    Color bgColor = this.getBackground(); //
    int[] li_fromcolor = new int[] { bgColor.getRed(), bgColor.getGreen(), bgColor.getBlue() }; //传入的背景颜色的RGB的值!
    int[][] li_delcolors = getDelColors(li_fromcolor, li_height - 2); //关键计算,根据高度,计算出每帧高度的渐变颜色!!!
    for (int i = 0; i < li_delcolors.length; i++) {  //循环画出每一帧!!
      int li_r = li_fromcolor[0] + li_delcolors[i][0]; //R
      int li_g = li_fromcolor[1] + li_delcolors[i][1]; //G
      int li_b = li_fromcolor[2] + li_delcolors[i][2]; //B
      if (li_r > 255) {  //如果溢出255,则当255,否则报错!
        li_r = 255;
      }
      if (li_g > 255) {
        li_g = 255;
      }
      if (li_b > 255) {
        li_b = 255;
      }
      g2.setColor(new Color(li_r, li_g, li_b)); //设置颜色!!
      g2.fillRect(0 + 1, i + 1, li_width - 2, 1); //
    }

    g2.setColor(Color.WHITE); //
    g2.setFont(new Font("宋体", Font.PLAIN, 12)); //
    g2.drawString("编辑", 30, 17); //
  }

  //颜色递减!!! 即要有一个算法,呈某种递减速度就会出现不同效果!!!
  //出现光感效果的原理是上半部
  private int[][] getDelColors(int[] _fromColor, int _height) {
    int[][] delColor = new int[_height][3]; //
    int li_half = _height / 2; //一半!
    if (li_half == 0) {
      li_half = 1;
    }
    int li_d1 = 100 / li_half; //如果是10,则递减10,如果是100,则递减1
    if (li_d1 == 0) {
      li_d1 = 1;
    }
    int li_prefix = 57; //有个前辍,可以随便设个值,就看你想渐变得白的还是黑的!
    for (int i = li_half - 1; i >= 0; i--) { //
      delColor[i][0] = li_prefix + (li_half - 1 - i) * li_d1;
      delColor[i][1] = li_prefix + (li_half - 1 - i) * li_d1;
      delColor[i][2] = li_prefix + (li_half - 1 - i) * li_d1;
    }
    int li_d2 = (int) ((100 / li_half) * 0.7); //关键这里有个系数变化,才会出现光感,水波等效果
    if (li_d2 == 0) {
      li_d2 = 1;
    }
    for (int i = li_half; i < _height; i++) {
      delColor[i][0] = (i - li_half) * li_d2; //
      delColor[i][1] = (i - li_half) * li_d2; //
      delColor[i][2] = (i - li_half) * li_d2; //
    }
    return delColor;
  }

  //主方法
  public static void main(String[] _args) {
    JFrame frame = new JFrame("Java渲染水晶按钮"); //
    frame.setSize(500, 300); //
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //
    frame.getContentPane().setBackground(Color.WHITE); //
    frame.getContentPane().setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5)); //

    //一批背景颜色!!
    Color[] colors = new Color[] { new Color(3, 26, 61), new Color(76, 93, 142), new Color(0, 35, 250), new Color(144, 29, 67), new Color(158, 84, 167), new Color(75, 93, 75), //
        new Color(126, 125, 76), new Color(75, 75, 49), new Color(55, 55, 55), new Color(101, 40, 34), new Color(75, 48, 132), new Color(35, 65, 105), //
    };
    for (int i = 0; i < colors.length; i++) { //根据背景颜色创建一系列面板!!!
      TestBGPanel panel = new TestBGPanel(); //
      panel.setPreferredSize(new Dimension(150, 30)); //
      panel.setBackground(colors[i]); //
      frame.getContentPane().add(panel); //
    }
    frame.setVisible(true); //
  }
}
  • 大小: 83.5 KB
0 请登录后投票
   发表时间:2011-09-08  
shxch7612 写道
重构paint方法就可以实现你想要的发光、水晶等效果!!
见附件效果图与源码!  源码编译后可直接运行!

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;

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

/**
* 只要改变getDelColors()中的算法就会出现不同渐变效果!!! 最简单的就是循序等额递减!!
* 然后到处使用该Panel替代默认的JPanel,然后将上面的其他控件都设置成透明(setOpaque(false)),则整个系统就会显得很漂亮了!
* 其他Swing控件都可以类似重构!!!
* 但如果把其他控件都设成透明的,然后最后都加载在该面板上面,则其他控件都无需重构就会出现效果!!比如:
* JTree tree= new JTree();  //
* tree.setOpaque(false);  //透明!
* JScrollPanel scroll = new JScrollPanel(tree);  //
* scroll.setOpaque(false);  //透明
* scroll.getViewPort().setOpaque(false);
* TestBGPanel panel = new TestBGPanel(new BorderLayout());  //创建渐变效果面板
* panel.add(scroll);  //将滚动框加载进来,则这个树的背景就是渐变效果了,则界面就丰富了!!!
* @author xch
*
*/
public class TestBGPanel extends JPanel {

  @Override
  /**
   * 关键是重构该方法!!
   * 也可以重构JPanel的该方法
   */
  public void paint(Graphics g) {
    Graphics2D g2 = (Graphics2D) g; //
    int li_beginx = (int) g2.getClipBounds().getX(); //
    int li_beginy = (int) g2.getClipBounds().getY(); //
    int li_width = this.getWidth();
    int li_height = this.getHeight(); //

    g2.setColor(Color.BLACK); //
    g2.drawRect(li_beginx, li_beginy, li_width - 1, li_height - 1); //画边框
    Color bgColor = this.getBackground(); //
    int[] li_fromcolor = new int[] { bgColor.getRed(), bgColor.getGreen(), bgColor.getBlue() }; //传入的背景颜色的RGB的值!
    int[][] li_delcolors = getDelColors(li_fromcolor, li_height - 2); //关键计算,根据高度,计算出每帧高度的渐变颜色!!!
    for (int i = 0; i < li_delcolors.length; i++) {  //循环画出每一帧!!
      int li_r = li_fromcolor[0] + li_delcolors[i][0]; //R
      int li_g = li_fromcolor[1] + li_delcolors[i][1]; //G
      int li_b = li_fromcolor[2] + li_delcolors[i][2]; //B
      if (li_r > 255) {  //如果溢出255,则当255,否则报错!
        li_r = 255;
      }
      if (li_g > 255) {
        li_g = 255;
      }
      if (li_b > 255) {
        li_b = 255;
      }
      g2.setColor(new Color(li_r, li_g, li_b)); //设置颜色!!
      g2.fillRect(0 + 1, i + 1, li_width - 2, 1); //
    }

    g2.setColor(Color.WHITE); //
    g2.setFont(new Font("宋体", Font.PLAIN, 12)); //
    g2.drawString("编辑", 30, 17); //
  }

  //颜色递减!!! 即要有一个算法,呈某种递减速度就会出现不同效果!!!
  //出现光感效果的原理是上半部
  private int[][] getDelColors(int[] _fromColor, int _height) {
    int[][] delColor = new int[_height][3]; //
    int li_half = _height / 2; //一半!
    if (li_half == 0) {
      li_half = 1;
    }
    int li_d1 = 100 / li_half; //如果是10,则递减10,如果是100,则递减1
    if (li_d1 == 0) {
      li_d1 = 1;
    }
    int li_prefix = 57; //有个前辍,可以随便设个值,就看你想渐变得白的还是黑的!
    for (int i = li_half - 1; i >= 0; i--) { //
      delColor[i][0] = li_prefix + (li_half - 1 - i) * li_d1;
      delColor[i][1] = li_prefix + (li_half - 1 - i) * li_d1;
      delColor[i][2] = li_prefix + (li_half - 1 - i) * li_d1;
    }
    int li_d2 = (int) ((100 / li_half) * 0.7); //关键这里有个系数变化,才会出现光感,水波等效果
    if (li_d2 == 0) {
      li_d2 = 1;
    }
    for (int i = li_half; i < _height; i++) {
      delColor[i][0] = (i - li_half) * li_d2; //
      delColor[i][1] = (i - li_half) * li_d2; //
      delColor[i][2] = (i - li_half) * li_d2; //
    }
    return delColor;
  }

  //主方法
  public static void main(String[] _args) {
    JFrame frame = new JFrame("Java渲染水晶按钮"); //
    frame.setSize(500, 300); //
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //
    frame.getContentPane().setBackground(Color.WHITE); //
    frame.getContentPane().setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5)); //

    //一批背景颜色!!
    Color[] colors = new Color[] { new Color(3, 26, 61), new Color(76, 93, 142), new Color(0, 35, 250), new Color(144, 29, 67), new Color(158, 84, 167), new Color(75, 93, 75), //
        new Color(126, 125, 76), new Color(75, 75, 49), new Color(55, 55, 55), new Color(101, 40, 34), new Color(75, 48, 132), new Color(35, 65, 105), //
    };
    for (int i = 0; i < colors.length; i++) { //根据背景颜色创建一系列面板!!!
      TestBGPanel panel = new TestBGPanel(); //
      panel.setPreferredSize(new Dimension(150, 30)); //
      panel.setBackground(colors[i]); //
      frame.getContentPane().add(panel); //
    }
    frame.setVisible(true); //
  }
}


不否认你美术功底比楼主强,但是技术功底还是差远了。
重绘最好是自己写UI,不能自己写UI就覆盖paintComponent方法,你这样覆盖paint方法会导致向这个容器添加其他控件时的bug
另外稍微排个版吧....
0 请登录后投票
   发表时间:2011-09-08  
终于解决了之前菜单和工具栏以及弹出菜单字体模糊的问题。 原来在绘图的时候设置了Graphics的一些参数,没有设置回原来的值
0 请登录后投票
   发表时间:2011-09-08  
老实说,swing 不是界面问题,你这样不知道是支持swing还是贬损swing!!!!!!
0 请登录后投票
   发表时间:2011-09-09  
请[skyyks0001]不要误解,重构UI谁不知道呢? 那样岂不是要一堆代码? 看起来还麻烦!!!
我的目的是想通过一个尽可能简单的类,渲染出效果来说明Swing可以搞出水晶效果的!
即只是针对性的Demo代码,并是实际运行的代码!!! 否则我也不会连包名都没定义呢??

想说明一个问题最好的办法就是提供一个最简单的只要需核心代码的可以运行的类!!  就像网上有人只粘贴部分核心代码一样(但不能运行)!
否则太多类与代码让人看了半天才明白怎么回事! 效果并不好!

不要轻易的去怀疑别人,要学会谦虚点!
0 请登录后投票
   发表时间:2011-09-09  
kjj 写道
老实说,swing 不是界面问题,你这样不知道是支持swing还是贬损swing!!!!!!

总的来说,Swing不被看好,一般有以下原因,但界面问题肯定是主要问题之一,因为其界面怎么看都比不上Web的炫!
1.性能慢
2.界面土,不像Web的效果炫
3.要装个JRE,太笨重
4.部署麻烦,需要WebStart,而且下载过程慢
5.远程访问要自己实现,不像Web技术根本不要关心这事
6.Swing有Bug
0 请登录后投票
   发表时间:2011-10-22  
能把Demo发给我么,我最近正在看,Email:535882409@qq.com
0 请登录后投票
   发表时间:2012-04-05  
有没有办法   把标题栏也改了
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics