最近一个月全力做JAVA的课程设计,图形界面全是由本人来做,因此即使知道会java图形界面也没啥个用,不过还是得想方设法地学会去用。
由于本人最会的就是装B,在课程设计中不仅弄了N个动画,还有自定义的按钮,图片按钮等一堆与真实功能没啥个联系的东东。
其中本人还花了n天去做java皮肤,以及网页主题。这里网页主题是啥个回事由于没啥关系所以不扯了。
主要说一下Java皮肤,我所说的java皮肤即是颜色与图片,比如菜单或工具栏的背景,选了颜色的变颜色,选了图片的就图片背景。
颜色的容易,直接setBackground(color)就KO了,但是图片背景怎么个弄呢,其实是十分简单的。
由于本人最会的就是装B,在课程设计中不仅弄了N个动画,还有自定义的按钮,图片按钮等一堆与真实功能没啥个联系的东东。
其中本人还花了n天去做java皮肤,以及网页主题。这里网页主题是啥个回事由于没啥关系所以不扯了。
主要说一下Java皮肤,我所说的java皮肤即是颜色与图片,比如菜单或工具栏的背景,选了颜色的变颜色,选了图片的就图片背景。
颜色的容易,直接setBackground(color)就KO了,但是图片背景怎么个弄呢,其实是十分简单的。
下面是一些代码
import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
public class Main extends JFrame{
public Main(){
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(500,400);
setVisible(true);
add(new Menu(),BorderLayout.NORTH); //菜单
add(new Panel(),BorderLayout.CENTER); //内容
}
private class Panel extends JPanel{
public Panel(){
setPreferredSize(new Dimension(500,380));
}
}
private class Menu extends JMenuBar{
public Menu(){
JMenu m1=new JMenu("a");
JMenu m2=new JMenu("b");
add(m1);
add(m2);
}
}
public static void main(String[] args){
new Main();
}
}
上面没啥个意思,下面图
再下面是加了背景后的代码
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
public class Main extends JFrame{
private JMenuBar jm=new Menu();
private JPanel jp=new Panel();
public Main(){
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(500,400);
new Redraw().start();
add(jm,BorderLayout.NORTH);
add(jp,BorderLayout.CENTER);
setVisible(true);
}
private class Redraw extends Thread{
@Override
public void run(){
long l1=System.currentTimeMillis();
long l2;
while(true){
jm.repaint();
jp.repaint();
l2=System.currentTimeMillis();
if(l2-l1>=1000){
break;
}
}
}
}
private class Panel extends JPanel{
private Image i=Toolkit.getDefaultToolkit().getImage("Image\\bg.png");
public Panel(){
setBackground(new Color(255,0,0,0));
setPreferredSize(new Dimension(500,370));
}
@Override
public void paint(Graphics g){
g.drawImage(i,0,0,500,370,null);
super.paint(g);
}
}
private class Menu extends JMenuBar{
private Image i=Toolkit.getDefaultToolkit().getImage("Image\\tool.png");
public Menu(){
setBackground(new Color(255,0,0,0));
JMenu m1=new JMenu("a");
JMenu m2=new JMenu("b");
add(m1);
add(m2);
}
@Override
public void paint(Graphics g){
g.drawImage(i,0,0,500,30,null);
super.paint(g);
}
}
public static void main(String[] args){
new Main();
}
}
加了两张图片
现在来说说原理,其实主要是setBackground(new Color(255,0,0,0))这句起了效果。
这是设置透明颜色的。
然后重载paint方法,在super.paint(g)之前用g.drawImage把图片画出来了。
因为设置的是透明色,所以super.paint(g)画背景时画上透明色,即是不会覆盖你之前画的背景图片。
不过此法有很多弊端
一是如果直接那样做的话第一次paint时图片不会显示出来,第二次才会出来。
即是启动了,没图片,你放大一下软件,然后软件重画,这时才显示出来。
由于我想不到有什么法子,所以只好设置一个线程让它启动后的一秒内不断重画。
于是有了上面那个Redraw类
但是这还是有弊端的。
启动后会发现上面图片先在中上位置显示出来,然后再在最上面出现,最后中间的图片才慢慢地出现。
原因很简单,添加menu,然后画在中上位置,添加panel后,menu移到最上面
所以,图片显示不连续,这样的话体验感十分差,怎么办。
本人的软件是做了个像eclipse的进度条,反正是要加载后台资源的。
于是在加载资源时顺便把GUI的各个部件给处理完,然后才总体的setVisible(true)。
由于有一点时间差(要加载的资源太多了),所以本人软件显示出来时所有的图片都马上出来了。