Java 自定义窗体(标题栏、窗体背景) |
您所在的位置:网站首页 › 设计类标题栏样式 › Java 自定义窗体(标题栏、窗体背景) |
转自:http://hi.baidu.com/chengmaoning/item/b8e3b779ceb89d4a0e0a079c
最近在书上看到这篇文章,觉得挺有意思。与大家分享一下,具体可以参见明日科技出版的《Java经典编程300例》。 默认情况下,我们用java设计的界面窗体是这样的:
默认的标题栏、最大化、最小化、关闭按钮、窗体边框。 如何自定义窗体达到如下效果呢?
大致说下代码要点: 设置窗体的Undecorated属性为true,阻止窗体采用本机系统修饰,这样窗体就没有标题栏和边框了。 设计背景面板类。BackgroundPanel extends JPanel。 窗体面板添加标题栏面板,位置在上方。 标题栏面板添加背景面板显示标题栏图片、标题栏面板添加面板用于放置最大化、最小化、关闭按钮。 窗体面板添加背景面板在中间。contentPane.add(mianPanel,BorderLayout.Center); 添加按钮响应、添加标题栏拖动代码。
代码: 首先是带背景图片面板类: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 package cn.chengmaoning.customframe; import java.awt.Graphics; import java.awt.Image; import javax.swing.JPanel; public class BackgroundPanel extends JPanel { /** * */ private static final long serialVersionUID = -898997756345637309L; private Image image; /** * Constructor */ public BackgroundPanel() { super (); setOpaque( false ); setLayout( null ); } /** * @param image * 要设置的 image */ public void setImage(Image image) { this .image = image; } @Override protected void paintComponent(Graphics g) { if (image != null ) { int width = getWidth(); // 获取组件大小 int height = getHeight(); g.drawImage(image, 0 , 0 , width, height, this ); // 绘制图片与组件大小相同 } super .paintComponent(g); // 执行超类方法 } }其次再是主类: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 package cn.chengmaoning.customframe; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.FlowLayout; import java.awt.GridLayout; import java.awt.Image; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; import javax.jws.Oneway; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JToggleButton; public class ControlFormStatus extends JFrame { /** * */ private static final long serialVersionUID = -2214759764324605473L; private JPanel contentPane; private Point pressedPoint; /** * @param args */ public static void main(String[] args) { // TODO 自动生成的方法存根 EventQueue.invokeLater( new Runnable() { @Override public void run() { // TODO 自动生成的方法存根 try { ControlFormStatus frame = new ControlFormStatus(); frame.setVisible( true ); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } }); } /** * Constructor */ public ControlFormStatus(){ setUndecorated( true ); setDefaultCloseOperation(EXIT_ON_CLOSE); setBounds( 100 , 100 , 450 , 300 ); contentPane = new JPanel(); contentPane.setBorder( null ); contentPane.setLayout( new BorderLayout( 0 , 0 )); setContentPane(contentPane); BackgroundPanel topPanel = new BackgroundPanel(); topPanel.addMouseMotionListener( new MouseMotionAdapter() { @Override public void mouseDragged(MouseEvent e){ do_topPanel_mouseDragged(e); } }); topPanel.addMouseListener( new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { // TODO 自动生成的方法存根 do_topPanel_mousePressed(e); } }); Image centerImage = new ImageIcon(getClass().getResource( "frameTop.png" )).getImage(); Dimension dimension = new Dimension(centerImage.getWidth( this ), centerImage.getHeight( this )); topPanel.setPreferredSize(dimension); topPanel.setImage(centerImage); contentPane.add(topPanel,BorderLayout.NORTH); topPanel.setLayout( new FlowLayout(FlowLayout.RIGHT, 5 , 5 )); JPanel panel = new JPanel(); panel.setPreferredSize( new Dimension( 60 , 22 )); panel.setOpaque( false ); topPanel.add(panel); panel.setLayout( new GridLayout( 1 , 0 , 0 , 0 )); JButton button = new JButton( "" ); button.setRolloverIcon( new ImageIcon(ControlFormStatus. class .getResource( "minBH.jpg" ))); button.addActionListener( new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO 自动生成的方法存根 do_button_actionPerformed(e); } }); button.setFocusPainted( false ); button.setBorderPainted( false ); button.setContentAreaFilled( false ); button.setIcon( new ImageIcon(ControlFormStatus. class .getResource( "minB.jpg" ))); panel.add(button); JToggleButton button_1 = new JToggleButton( "" ); button_1.addItemListener( new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { // TODO 自动生成的方法存根 do_button_1_itemStateChanged(e); } }); button_1.setRolloverIcon( new ImageIcon(ControlFormStatus. class .getResource( "maxBH.jpg" ))); button_1.setRolloverSelectedIcon( new ImageIcon(ControlFormStatus. class .getResource( "maxBH.jpg" ))); button_1.setIcon( new ImageIcon(getClass().getResource( "maxB.jpg" ))); button_1.setContentAreaFilled( false ); button_1.setBorderPainted( false ); button_1.setFocusPainted( false ); panel.add(button_1); JButton button_2 = new JButton( "" ); button_2.addActionListener( new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO 自动生成的方法存根 do_button_2_actionPerformed(e); } }); button_2.setRolloverIcon( new ImageIcon(getClass().getResource( "closeBH.jpg" ))); button_2.setIcon( new ImageIcon(getClass().getResource( "closeB.jpg" ))); button_2.setFocusPainted( false ); button_2.setContentAreaFilled( false ); button_2.setBorderPainted( false ); panel.add(button_2); BackgroundPanel baclBackgroundPanel_1 = new BackgroundPanel(); Image topImage = new ImageIcon(getClass().getResource( "frameCenter.png" )).getImage(); baclBackgroundPanel_1.setImage(topImage); contentPane.add(baclBackgroundPanel_1, BorderLayout.CENTER); } protected void do_button_2_actionPerformed(ActionEvent e) { // TODO 自动生成的方法存根 dispose(); } protected void do_button_1_itemStateChanged(ItemEvent e) { // TODO 自动生成的方法存根 if (e.getStateChange() == ItemEvent.SELECTED) { setExtendedState(MAXIMIZED_BOTH); } else { setExtendedState(NORMAL); } } protected void do_button_actionPerformed(ActionEvent e) { // TODO 自动生成的方法存根 setExtendedState(ICONIFIED); } protected void do_topPanel_mousePressed(MouseEvent e) { // TODO 自动生成的方法存根 pressedPoint = e.getPoint(); } protected void do_topPanel_mouseDragged(MouseEvent e) { // TODO 自动生成的方法存根 Point point = e.getPoint(); Point locationPoint = getLocation(); int x = locationPoint.x + point.x - pressedPoint.x; int y = locationPoint.y + point.y - pressedPoint.y; setLocation(x, y); } } 代码中用到的图片如下:(我不知道有什么更好的方法可以把图片保存到这篇文章里,所以只有贴到这里了,试验的同学可以直接另存图片到本机,放置到与.java相同路径下即可) |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |