GUI程序设计
1. 对话框(JDialog)使用示例
例1. JDialog简单使用示例。
import javax.swing.JLabel; public class demoJDialog { JFrame mainJFrame; JLabel myJLabel; JDialog subJDialog; public demoJDialog(){ mainJFrame = new JFrame("带对话框的JFrame演示窗口"); myJLabel = new JLabel("世界,你好!"); subJDialog = new JDialog(mainJFrame,"我是对话框",true); subJDialog.getContentPane().setLayout(new FlowLayout()); subJDialog.getContentPane().add(myJLabel); mainJFrame.setSize(500, 400); mainJFrame.setVisible(true); mainJFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); subJDialog.setSize(500, 400); subJDialog.setVisible(true); } public static void main(String[] args) { new demoJDialog(); } }
默认的subJDialog = new JDialog(mainJFrame,"我是对话框");创建的是非模态对话框,创建模态对话框如下:subJDialog = new JDialog(mainJFrame,"我是对话框",true);
例2. 使用系统预定义的对话框。
package GUI; import java.awt.Container; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JOptionPane; public class showTriDialog implements ActionListener { JFrame mainJFrame; JButton btnMessage,btnComfirm,btnInput; Container con; public showTriDialog(){ mainJFrame = new JFrame("对话框使用范例"); btnMessage = new JButton("显示消息对话框"); btnComfirm = new JButton("显示确认对话框"); btnInput = new JButton("显示输入对话框"); con = mainJFrame.getContentPane(); con.setLayout(new FlowLayout()); con.add(btnMessage); con.add(btnComfirm); con.add(btnInput); mainJFrame.setSize(500, 400); mainJFrame.setVisible(true); mainJFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); btnMessage.addActionListener(this); btnComfirm.addActionListener(this); btnInput.addActionListener(this); } public void actionPerformed(ActionEvent e) { if(e.getSource()==btnMessage) JOptionPane.showMessageDialog(mainJFrame, "这是一个简单的消息框"); else if(e.getSource()==btnComfirm) JOptionPane.showConfirmDialog(mainJFrame, "这是一个有三个按钮的确认框,\n按任意按钮返回"); else JOptionPane.showInputDialog(mainJFrame, "这是一个可供用户输入简单信息的对话框"); } public static void main(String[] args) { new showTriDialog(); } }
2. 面板(JPanel)使用示例——中间容器
JPanel被称为面板,是最常用的中间容器。一般情况下,先将各种基本组件添加到其中,然后再将JPanel添加到其它容器(特别是顶层容器)中。JPanel的默认布局是流式布局。
例3. 面板使用简单示例。
package GUI; import java.awt.FlowLayout; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; public class demoJPanel { JFrame mainJFrame; JPanel myJPanel; JLabel myJLabel; public demoJPanel(){ mainJFrame = new JFrame("JPanel使用示例"); myJPanel = new JPanel(); myJLabel = new JLabel("本标签在JPanel上"); myJPanel.setLayout(new FlowLayout()); myJPanel.add(myJLabel); mainJFrame.add(myJPanel); mainJFrame.setSize(500, 400); mainJFrame.setVisible(true); mainJFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { new demoJPanel(); } }
JPanel一个作用是方便布局,另外还有一个很重要的作用,就是当做画布来用。
例4. 在面板上画出简单图形示例1。
package GUI; import java.awt.Color; import java.awt.Graphics; import javax.swing.JFrame; import javax.swing.JPanel; public class painting_1 { MyCanvas palette; JFrame mainJFrame; public class MyCanvas extends JPanel { protected void paintComponent(Graphics g) { g.setColor(Color.red); g.drawArc(10, 10, 100, 100, 0, 360); g.drawOval(100, 100, 100, 100); g.drawRect(50, 50, 100, 100); g.drawString("测试", 30, 30); } } public painting_1(){ mainJFrame = new JFrame("用JPanel画图示例"); palette = new MyCanvas(); mainJFrame.add(palette); mainJFrame.setSize(500, 400); mainJFrame.setVisible(true); mainJFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { new painting_1(); } }
当这个窗口改变时(包括最大化、最小化和调整窗口的大小),窗口中的图形和文字仍然可以正常显示。这要归功于paintComponent(Graphics g)方法。
例5. 在面板上画出简单图形示例2 。(当用户单击按钮之后才会画图)
package GUI; import java.awt.Color; import java.awt.Container; import java.awt.FlowLayout; import java.awt.Graphics; import java.awt.LayoutManager; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; public class painting_2 { JPanel palette; JFrame mainJFrame; Container con; JButton btn; dealPushBtn handleBtn; public class dealPushBtn implements ActionListener { public void actionPerformed(ActionEvent e) { Graphics g; final int orign_x = 100, orign_y = 100, radio = 50; final double scope = 30.0/180*Math.PI; //每次转动的角度 double angle = 0.0; int x = orign_x+radio, y = orign_y+radio; g = palette.getGraphics(); g.setColor(Color.GREEN); for(int i=0;i<12;i++){ g.drawArc(x, y, radio*2, radio*2, 0, 360); angle += scope; x =(int)(radio*Math.cos(angle)+orign_x); y =(int)(radio*Math.sin(angle)+orign_y); } } } public painting_2(){ mainJFrame = new JFrame("用JPanel画图示例"); handleBtn = new dealPushBtn(); palette = new JPanel(); btn = new JButton("画图"); btn.addActionListener(handleBtn); palette.add(btn); mainJFrame.add(palette); mainJFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); palette.setLayout(new FlowLayout()); mainJFrame.setSize(300, 300); mainJFrame.setVisible(true); } public static void main(String[] args) { new painting_2(); } }
如果改变大小、最小化、最大化上面的图形就会不见了,按钮还在上面。这是因为图片是程序另外画上去的,面板并不知道它的存在。
3. 滚动面板(JScollPane)使用示例
例6. 在JScrollPane创建时添加组件示例。
package GUI; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JScrollPane; import javax.swing.ScrollPaneLayout; public class demoJScrollPane_1 { JScrollPane jsp; JFrame jf; JLabel jl; public demoJScrollPane_1(){ jf = new JFrame("这是一个JScorllPane示例"); Icon picture = new ImageIcon("test.jpg"); jl = new JLabel(picture); jsp = new JScrollPane(jl); jsp.setLayout(new ScrollPaneLayout()); jf.add(jsp); jf.setSize(500, 400); jf.setVisible(true); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { new demoJScrollPane_1(); } }
例7. 通过add()方法添加组件示例。
package GUI; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JScrollPane; import javax.swing.ScrollPaneLayout; public class demoJScrollPane_2 { JScrollPane jsp; JFrame jf; JLabel jl; public demoJScrollPane_2(){ jf = new JFrame("这是一个JScorllPane示例"); Icon picture = new ImageIcon("test.jpg"); jl = new JLabel(picture); jsp = new JScrollPane(); jsp.getViewport().add(jl); jsp.setLayout(new ScrollPaneLayout()); jf.add(jsp); jf.setSize(500, 400); jf.setVisible(true); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { new demoJScrollPane_2(); } }
注意:无论采用哪种方法,都只能在JScrollPane中放置一个组件。如果多次添加,后面添加的组件将覆盖前面的组件。如果有多个组件要存放在JScrollPane中,需要先将这些组件存放在另外一个中间容器中,再将这个中间容器添加到JScrollPane中。
4. 分隔板(JSplitPane)使用示例
例8. 分隔板简单示例1。
package GUI; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JSplitPane; public class demoJSplitPane_1 { JFrame jf; JSplitPane jsp; JLabel jl1,jl2; public demoJSplitPane_1(){ jf = new JFrame("这是一个JSplitPane使用示例"); jl1 = new JLabel("这是左边窗口"); jl2 = new JLabel("这是右边窗口"); jsp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,true,jl1,jl2); jf.add(jsp); jf.setSize(500, 400); jf.setVisible(true); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { new demoJSplitPane_1(); } }
与JScrollPane相同,在JSplitPane的一侧只能放置一个组件。如果需要放置多个组件,需要将这些组件放在另外一个中间容器中(这个中间容器也可以是JSplitPane),再添加进来。
例9. 分隔板示例2。(将一个窗口分割成四个区域)
package GUI; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JSplitPane; public class demoJSplitPane_2 { JFrame jf; JLabel jl1,jl2,jl3,jl4; JSplitPane jsp1,jsp2,jsp3; public demoJSplitPane_2(){ jf = new JFrame("四个窗口的JSplitPane示例"); jl1 = new JLabel("左上"); jl2 = new JLabel("左下"); jl3 = new JLabel("右上"); jl4 = new JLabel("右下"); jsp1 = new JSplitPane(JSplitPane.VERTICAL_SPLIT,true,jl1,jl2); jsp2 = new JSplitPane(JSplitPane.VERTICAL_SPLIT,true,jl3,jl4); jsp3 = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,jsp1,jsp2); jf.add(jsp3); jf.setSize(500, 400); jf.setVisible(true); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { new demoJSplitPane_2(); } }
5. 选项板(JTabbedPane)使用示例
例10. 选项板使用示例。
package GUI; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JTabbedPane; public class demoJTabbedPane { JFrame jf; JLabel jl1,jl2; JTabbedPane jtp; public demoJTabbedPane(){ jf = new JFrame("JTabbedPane使用示例"); jl1 = new JLabel("这是第一个选项卡"); jl2 = new JLabel("这是第二个选项卡"); jtp = new JTabbedPane(); jtp.addTab("标签一", jl1); jtp.addTab("标签二", jl2); jf.add(jtp); jf.setSize(500, 400); jf.setVisible(true); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { new demoJTabbedPane(); } }
6. 工具栏(JToolBar)使用示例
在默认情况下,用户可以把工具栏拖动到容器各个边缘。因此,放置工具栏的容器应该使用BorderLayout布局,并且在其他边缘内不能存放其他组件,而只能在容器的中心摆放一个组件。
JToolBar的使用非常简单,只是要注意往其中添加的按钮通常都是带图标的。
例11. 工具栏使用示例。
import java.awt.Container; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JToolBar; public class demoJToolBar { JFrame jf; JButton jbt1,jbt2; JToolBar jtb; Container con; public demoJToolBar(){ jf = new JFrame("JToolBar使用示例"); jbt1 = new JButton(new ImageIcon("OPEN.jpg")); jbt1.setToolTipText("打开文档"); jbt2 = new JButton(new ImageIcon("SAVE.jpg")); jbt2.setToolTipText("保存文档"); jtb = new JToolBar(); jtb.add(jbt1); jtb.add(jbt2); con = jf.getContentPane(); con.add(jtb, BorderLayout.NORTH); jf.setSize(500, 400); jf.setVisible(true); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { new demoJToolBar(); } }
7. 标签(Jlabel)使用示例——常用组件
例12. 图像标签使用示例。
package GUI; import java.awt.BorderLayout; import java.awt.Container; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; public class demoJLabel_1 { JFrame jf; JLabel jl; Container con; public demoJLabel_1(){ jf = new JFrame("图像标签使用示例"); jl = new JLabel(new ImageIcon("test.png")); con = jf.getContentPane(); con.add(jl, BorderLayout.CENTER); jf.setSize(500, 400); jf.setVisible(true); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { new demoJLabel_1(); } }
例13. 改变标签上鼠标形状示例。
package GUI; import java.awt.BorderLayout; import java.awt.Container; import java.awt.Cursor; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JFrame; import javax.swing.JLabel; public class demoJLabel_2 { JFrame jf; JLabel linkjl; ListenMouse lm; Container con; public class ListenMouse extends MouseAdapter { public void mouseEntered(MouseEvent e) { linkjl.setCursor(new Cursor(Cursor.HAND_CURSOR)); } } public demoJLabel_2(){ jf = new JFrame("改变鼠标形状示例"); linkjl = new JLabel("将鼠标放到标签上,将变成手型形状"); lm = new ListenMouse(); con = jf.getContentPane(); linkjl.addMouseListener(lm); con.add(linkjl,BorderLayout.NORTH); jf.setSize(500, 400); jf.setVisible(true); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { new demoJLabel_2(); } }