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();

    }

}

 

posted @ 2015-01-25 21:30  ~风轻云淡~  阅读(1947)  评论(0编辑  收藏  举报