zoukankan      html  css  js  c++  java
  • GUI程序设计2

    8. 按钮(JButton)使用示例

    例14. 按钮使用示例。

    package GUI;
    
    import java.awt.BorderLayout;
    import java.awt.Container;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    
    public class demoJButton implements ActionListener{
        JFrame jf;
        JButton jb;
        Container con;
        ImageIcon closeIcon,openIcon;
        
        public demoJButton(){
            jf = new JFrame("JButton使用示例");
            openIcon = new ImageIcon("open.jpg");
            closeIcon = new ImageIcon("close.jpg");
            jb = new JButton("打开", openIcon);
            jb.addActionListener(this);
            con = jf.getContentPane();
            con.add(jb, BorderLayout.NORTH);
            jf.setSize(500, 400);
            jf.setLocation(300, 200);
            jf.setVisible(true);
            jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
        public static void main(String[] args) {
            new demoJButton();
    
        }
    
        public void actionPerformed(ActionEvent e) {
            if(e.getSource()==jb){
                if(jb.getText().compareTo("打开")==0){
                    jb.setText("关闭");
                    jb.setIcon(closeIcon);
                }else {
                    jb.setText("打开");
                    jb.setIcon(openIcon);
                }
            }
            
        }
    
    }

     9. 文本框(JTextField)和密码框(JPasswordField)使用示例

    例. 文本框和密码框使用示例。

    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.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.JPasswordField;
    import javax.swing.JTextField;
    
    public class demoJText {
        JLabel jl1,jl2;
        JFrame jf;
        Container con;
        JButton loginBtn,cancelBtn;
        JTextField userText;
        JPasswordField jpf;
        HandleAction handleAction;
        
        public class HandleAction implements ActionListener {
            public void actionPerformed(ActionEvent e) {
                String msg;
                if(e.getSource()==loginBtn){
                    msg = "你的用户名是:"+userText.getText()+"
    你的密码是:"+new String(jpf.getPassword());
                    JOptionPane.showMessageDialog(jf, msg);
                }else if(e.getSource()==cancelBtn){
                    userText.setText("");
                    jpf.setText("");
                }
            }    
        }
        
        public demoJText(){
            jl1 = new JLabel("用户名");
            jl2 = new JLabel("密    码");
            jf = new JFrame("文本框和密码框使用示例");
            con = jf.getContentPane();
            handleAction = new HandleAction();
            loginBtn = new JButton("登录");
            loginBtn.addActionListener(handleAction);
            cancelBtn = new JButton("取消");
            cancelBtn.addActionListener(handleAction);
            userText = new JTextField();
            userText.setColumns(20);
            jpf = new JPasswordField();
            jpf.setColumns(20);
            con.setLayout(new FlowLayout());
            con.add(jl1);
            con.add(userText);
            con.add(jl2);
            con.add(jpf);
            con.add(loginBtn);
            con.add(cancelBtn);
            jf.setSize(300, 300);
            jf.setLocation(300, 200);
            jf.setVisible(true);
            jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    
        }
        public static void main(String[] args) {
            new demoJText();
    
        }
    
    }

    如果需要在输入的密码框中显示其他符号,可以使用setEchoChar('*')来实现。

    实现回车功能的该进如下:

    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.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.JPasswordField;
    import javax.swing.JTextField;
    
    public class demoJText {
        JLabel jl1,jl2;
        JFrame jf;
        Container con;
        JButton loginBtn,cancelBtn;
        JTextField userText;
        JPasswordField jpf;
        HandleAction handleAction;
        
        public class HandleAction implements ActionListener {
            public void actionPerformed(ActionEvent e) {
                String msg;
                if(e.getSource()==loginBtn){
                    msg = "你的用户名是:"+userText.getText()+"
    你的密码是:"+new String(jpf.getPassword());
                    JOptionPane.showMessageDialog(jf, msg);
                }else if(e.getSource()==cancelBtn){
                    userText.setText("");
                    jpf.setText("");
                }else if(e.getSource()==userText){
                    jpf.requestFocus();
                }else if(e.getSource()==jpf){
                    loginBtn.doClick();
                }
            }    
        }
        
        public demoJText(){
            jl1 = new JLabel("用户名");
            jl2 = new JLabel("密    码");
            jf = new JFrame("文本框和密码框使用示例");
            con = jf.getContentPane();
            handleAction = new HandleAction();
            loginBtn = new JButton("登录");
            loginBtn.addActionListener(handleAction);
            cancelBtn = new JButton("取消");
            cancelBtn.addActionListener(handleAction);
            userText = new JTextField();
            userText.addActionListener(handleAction);
            userText.setColumns(20);
            jpf = new JPasswordField();
            jpf.addActionListener(handleAction);
            jpf.setColumns(20);
            con.setLayout(new FlowLayout());
            con.add(jl1);
            con.add(userText);
            con.add(jl2);
            con.add(jpf);
            con.add(loginBtn);
            con.add(cancelBtn);
            jf.setSize(300, 300);
            jf.setLocation(300, 200);
            jf.setVisible(true);
            jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    
        }
        public static void main(String[] args) {
            new demoJText();
    
        }
    
    }

    10. 文本区(JTextArea)使用示例

    例. 文本区使用使用示例。

    package GUI;
    import javax.swing.*;
    public class demoJTextArea {
        JFrame jf;
        JScrollPane jsp;
        JTextArea jta;
        
        public demoJTextArea(){
            jf = new JFrame("这是一个JTextArea使用示例");
            jta = new JTextArea();
            jsp = new JScrollPane(jta);
            jf.getContentPane().add(jsp);
            jf.setSize(500, 400);
            jf.setLocation(300, 200);
            jf.setVisible(true);
            jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
        
        public static void main(String[] args) {
            new demoJTextArea();
        }
    }

    11. 复选框(JCheckBox)使用示例

    例. 复选框使用示例。

    package GUI;
    
    import java.awt.Container;
    import java.awt.FlowLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.*;
    public class demoJcheckBox implements ActionListener{
        JFrame jf;
        JLabel jl;        
        JCheckBox jb[];
        Container con;
        JButton OKbtn;
        static final String ProvinceName[]={"北京","上海","天津","辽宁","吉林","四川","湖南","湖北","广东"};
        
        public demoJcheckBox(){
            jf = new JFrame("JCheckBox使用示例");
            jl = new JLabel("请至少选择一个你去过的省份");
            con = jf.getContentPane();
            con.setLayout(new FlowLayout());
            con.add(jl);
            jb = new JCheckBox[ProvinceName.length];
            for(int i=0;i<jb.length;i++){
                jb[i] = new JCheckBox(ProvinceName[i],false);
                con.add(jb[i]);
            }
            OKbtn = new JButton("确定");
            OKbtn.addActionListener(this);
            con.add(OKbtn);
            jf.setSize(500, 400);
            jf.setLocation(300, 200);
            jf.setVisible(true);
            jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
    
        public void actionPerformed(ActionEvent e) {
            String str= "";
            int count = 0;
            for(int i=0;i<jb.length;i++){
                if(jb[i].isSelected()){
                    count++;
                    str = str + jb[i].getText() + " ";
                }
            }
            if(e.getSource()==OKbtn)
                JOptionPane.showMessageDialog(jf, "你选择了"+count+"个省份,它们是:
    "+str);
            
        }
    
        public static void main(String[] args) {
            new demoJcheckBox();
    
        }
    }

    12. 单选按钮(JRadioButton)使用示例

    单选按钮本身无法知道自己和其它按钮的关系,所以要把他们放在一个名为ButtonGroup的组件中统一管理。该组件本身不可见,但对于JRadioButton却是必不可少的。

    例. 单选按钮使用示例。

    package GUI;
    
    import java.awt.Container;
    import java.awt.FlowLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.*;
    public class demoJRadioButton implements ActionListener{
        JFrame jf;
        JLabel jl;
        JButton Okbtn;
        JRadioButton jrb1,jrb2;
        ButtonGroup sexbg;
        Container con;
        String str="男";
        public demoJRadioButton(){
            jf = new JFrame("JRadioButton使用示例");
            jl = new JLabel("请选择性别");
            Okbtn = new JButton("确定");
            Okbtn.addActionListener(this);
            jrb1 = new JRadioButton("男",true);
            jrb1.addActionListener(this);
            jrb2 = new JRadioButton("女",false);
            jrb2.addActionListener(this);
            sexbg = new ButtonGroup();
            sexbg.add(jrb1);
            sexbg.add(jrb2);
            con = jf.getContentPane();
            con.setLayout(new FlowLayout());
            con.add(jl);
            con.add(jrb1);
            con.add(jrb2);
            con.add(Okbtn);
            jf.setSize(500, 400);
            jf.setLocation(300, 200);
            jf.setVisible(true);
            jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
        public void actionPerformed(ActionEvent e) {
            if(e.getSource() instanceof JRadioButton){
                str = e.getActionCommand();
            }else{
                JOptionPane.showMessageDialog(jf, "你选择了"+str);
            }
            
        }
    
        public static void main(String[] args) {
            new demoJRadioButton();
    
        }
    
    }

    13. 列表框(JList)使用示例

    例. 列表框使用示例。

    package GUI;
    import java.awt.BorderLayout;
    import java.awt.Container;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.*;
    public class demoJList implements ActionListener{
        JFrame jf;
        JPanel jp;
        JButton addBtn,delBtn;
        Container con;
        JList lList,rList;
        DefaultListModel lModel,rModel;
        JScrollPane ljsp,rjsp;
        JSplitPane jsp;
        static final String city[] = {"北京","上海","天津","辽宁","吉林","四川","湖南","湖北","广东"};
        
        public demoJList(){
            jf = new JFrame("JList使用示例");
            jp = new JPanel();
            addBtn = new JButton("选中>>");
            addBtn.addActionListener(this);
            delBtn = new JButton("撤销<<");
            delBtn.addActionListener(this);
            con = jf.getContentPane();
            lModel = new DefaultListModel();
            for(int i=0;i<city.length;i++)
                lModel.addElement(city[i]);
            rModel = new DefaultListModel();
            lList = new JList(lModel);
            rList = new JList(rModel);
            ljsp = new JScrollPane(lList);
            rjsp = new JScrollPane(rList);
            jsp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,true,ljsp,rjsp);
            con.add(jsp, BorderLayout.CENTER);
            jp.add(addBtn);
            jp.add(delBtn);
            con.add(jp, BorderLayout.SOUTH);
            jf.setSize(500, 400);
            jf.setLocation(300, 200);
            jf.setVisible(true);
            jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            jsp.setDividerLocation(0.5);
        }
        
        public void actionPerformed(ActionEvent e) {
            int i;
            if(e.getSource()==addBtn){
                for(i=0;i<lModel.size();i++)
                    if(lList.isSelectedIndex(i))
                        rModel.addElement(lModel.getElementAt(i));
                for(i--;i>=0;i--)
                    if(lList.isSelectedIndex(i))
                        lModel.removeElementAt(i);            
            }else{
                for(i=0;i<rModel.size();i++)
                    if(rList.isSelectedIndex(i))
                        lModel.addElement(rModel.getElementAt(i));
                for(i--;i>=0;i--)
                    if(rList.isSelectedIndex(i))
                        rModel.removeElementAt(i);
            }
            
        }
    
        public static void main(String[] args) {
            new demoJList();
        }
    }

    14. 组合框(JComboBox)使用示例

    例. 组合框使用示例。

    package GUI;
    import java.awt.Container;
    import java.awt.FlowLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.ItemEvent;
    import java.awt.event.ItemListener;
    
    import javax.swing.*;
    public class demoJComboBox implements ItemListener,ActionListener{
        JFrame jf;
        JLabel jl1,jl2;
        JComboBox jcb;
        JButton btn;
        Container con;
        static final String city[] = {"北京","上海","天津","辽宁","吉林","四川","湖南","湖北","广东"};
    
        public demoJComboBox(){
            jf = new JFrame("JComboBox使用示例");
            jl1 = new JLabel("您的选择是:");
            jl2 = new JLabel("           ");
            jcb = new JComboBox(city);
            jcb.setEditable(true);
            jcb.addItemListener(this);
            btn = new JButton("可以编辑");
            btn.addActionListener(this);
            con = jf.getContentPane();
            con.setLayout(new FlowLayout());
            con.add(jl1);
            con.add(jl2);
            con.add(jcb);
            con.add(btn);
            jf.setSize(500, 400);
            jf.setLocation(300, 200);
            jf.setVisible(true);
            jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
        
        public void actionPerformed(ActionEvent e) {
            if(e.getSource()==btn){
                if(btn.getText().compareTo("可以编辑")==0){
                    btn.setText("不可编辑");
                    jcb.setEditable(true);
                }else{
                    btn.setText("可以编辑");
                    jcb.setEditable(false);
                }
            }
        }
    
        public void itemStateChanged(ItemEvent e) {
            if(e.getStateChange()==ItemEvent.SELECTED)
                jl2.setText((String)jcb.getSelectedItem());        
        }
    
        public static void main(String[] args) {
            new demoJComboBox();
    
        }
    
    }

    15. 表格(Jtable)使用示例

    一般情况下,可以通过Jtable(int row,int col)来指定表格拥有的行和列。如果需要动态地调整列数,可以直接使用它的方法addColumn()和removeColumn()。如果需要调整行数,则像JList一样,需要调用和它的联系的DefaultTableModel的addRow()和removeRow()方法。还有,JTable本身不提供滚动条,需要把它放到JScrolPane中才能滚动。

    例15.1 表格使用示例1。

    package GUI;
    import java.awt.Container;
    
    import javax.swing.*;
    public class demoJTable_1 {
        JFrame jf;
        JScrollPane jsp;
        JTable jtab;
        Container con;
        
        public demoJTable_1(){
            jf = new JFrame("JTable使用示例");
            jtab = new JTable(10,3);
            jsp = new JScrollPane(jtab);
            con = jf.getContentPane();
            con.add(jsp);
            jf.setSize(500, 400);
            jf.setLocation(300, 200);
            jf.setVisible(true);
            jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
        public static void main(String[] args) {
            new demoJTable_1();
        }
    
    }

    例15.2 表格使用示例2.

    package GUI;
    import javax.swing.*;
    public class demoJTable_2 {
        JFrame jf;
        JScrollPane jsp;
        JTable jtab;
        
        public demoJTable_2(){
            Object[][] stu = {
                    {"小王",new Integer(66),new Integer(72),new Integer(98),new Boolean(false)},
                    {"小张",new Integer(82),new Integer(69),new Integer(78),new Boolean(true)}
            };
            String[] title = {"姓名","语文","数学","总分","及格"};
            jf = new JFrame("JTable使用示例");
            jtab = new JTable(stu,title);
            jsp = new JScrollPane(jtab);
            jf.add(jsp);
            jf.setSize(500, 400);
            jf.setLocation(300, 200);
            jf.setVisible(true);
            jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
        public static void main(String[] args) {
            new demoJTable_2();
    
        }
    
    }

    注意:这里必须要使用滚动面板来显示表格,如果直接将表格加入到JFrame中,表头将无法正常显示。

    例15.3 表格使用示例3。

    package GUI;
    import java.awt.Container;
    
    import javax.swing.*;
    import javax.swing.table.TableColumn;
    public class demoJTable_3 {
        JFrame jf;
        JScrollPane jsp;
        JTable jtab;
        Container con;
        Object[][] stu = {
                {"小王",new Integer(66),new Integer(72),new Integer(98),new Boolean(false),new Boolean(false)},
                {"小张",new Integer(82),new Integer(69),new Integer(78),new Boolean(true),new Boolean(false)}
        };
        String[] title = {"姓名","语文","数学","总分","及格","作弊"};
        
        public demoJTable_3(){
            jf = new JFrame();
            jf.setTitle("JTable使用示例");
            jtab = new JTable(stu,title);
            //利用JTable中的getColumnModel()方法取得TableColumnModel对象的引用
            //利用对象的setPreferredWidth()方法就可以控制字段的宽度
            for(int i=0;i<title.length;i++){
                TableColumn column = jtab.getColumnModel().getColumn(i);
                if(i%2==0)
                    column.setPreferredWidth(150);
                else
                    column.setPreferredWidth(50);
            }
            jsp = new JScrollPane(jtab);
            con = jf.getContentPane();
            con.add(jsp);
            jf.setSize(500, 400);
            jf.setLocation(300, 200);
            jf.setVisible(true);
            jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
        public static void main(String[] args) {
            new demoJTable_3();
        }
    }

    前面的3个例子都只是显示数据供用户查看,如果需要获取用户修改后的数据,程序只需利用getColumnCount()和getRowCount()方法,获得JTable的列数和行数,然后遍历整个JTable,利用getValueAt()方法获取单元格里的内容就可以了。如果修改某个单元格里面的值,也可以利用setValueAt()来完成。

    例15.4 表格使用示例4.

    package GUI;
    import javax.swing.*;
    
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    public class demoJTable_4 implements ActionListener {
        JFrame jf;
        JTable sourceTable,destTable;
        JScrollPane jsp1,jsp2;
        JButton copyBtn;
        Container con;
        JPanel jp;
        int row,col;
        
        public demoJTable_4(){
            jf = new JFrame("JTable使用示例");
            sourceTable = new JTable(2,3);
            col = sourceTable.getColumnCount();
            row = sourceTable.getRowCount();
            destTable = new JTable(col,row);
            jsp1 = new JScrollPane(sourceTable);
            jsp2 = new JScrollPane(destTable);
            copyBtn = new JButton("复制数据");
            copyBtn.addActionListener(this);
            jp = new JPanel();
            jp.add(copyBtn);
            con = jf.getContentPane();
            con.setLayout(new GridLayout(3,1));
            con.add(jsp1);
            con.add(jp);
            con.add(jsp2);
            jf.setSize(500, 400);
            jf.setLocation(300, 200);
            jf.setVisible(true);
            jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
        public void actionPerformed(ActionEvent e) {
            int i,j;
            Object obj;
            if(e.getSource()==copyBtn){
                for(i=0;i<row;i++)
                    for(j=0;j<col;j++){
                        obj = sourceTable.getValueAt(i, j);
                        destTable.setValueAt(obj, j, i);
                    }    
            }        
        }
        
        public static void main(String[] args){
            new demoJTable_4();
        }
        
    }

     与JTable相关的模型有3个:TableModel、TableColumnModel和ListSelectionModel。其中最常用的是TableModel。

     重写一个MyTableModle来代替系统提供的DefaultTableModle,这样可以显示Boolean类型的数据时,不以字符串形式显示,而是以checkBox的形式显示,并且字符串会左对齐,而数值则右对齐。

    例15.5 表格使用示例5.

    package GUI;
    
    import javax.swing.table.AbstractTableModel;
    
    final class MyTableModel extends AbstractTableModel {
        private Object data[][]; //存储表格中的数据
        private String[] tableName; //存储表头
        public MyTableModel(Object[][] data, String[] tableName){
            this.data = data;
            this.tableName = tableName;
        }
        
        public MyTableModel(Object[][] data){
            char[] tch = {'A'};
            tableName = new String[data[0].length];
            this.data = data;
            for(int i=0;i<tableName.length;i++){
                tableName[i] = new String(tch);
                tch[0]++;
            }
        }
    
        public int getRowCount() {
            return data.length;
        }
    
        public int getColumnCount() {
            return data[0].length;
        }
    
        public Object getValueAt(int rowIndex, int columnIndex) {
            return data[rowIndex][columnIndex];
        }
        
        public Class<?> getColumnClass(int columnIndex) {
            return data[0][columnIndex].getClass();
        }
    
        public String getColumnName(int column) {
            return tableName[column];
        }
        
    }

    在上述类中,真正和显示有关的就只有getColumnClass()方法。该方法返回实际存储数据的类类型,因此在显示的时候,表格会根据这些类型做调整。

    package GUI;
    import java.awt.Container;
    
    import javax.swing.*;
    import javax.swing.table.TableColumn;
    public class demoJTable_5 {
        JFrame jf;
        JScrollPane jsp;
        JTable jtab;
        MyTableModel mtm;
        Container con;
        Object[][] stu = {
                {"小王",new Integer(66),new Integer(72),new Integer(98),new Boolean(false),new Boolean(false)},
                {"小张",new Integer(82),new Integer(69),new Integer(78),new Boolean(true),new Boolean(false)}
        };
        String[] title = {"姓名","语文","数学","总分","及格","作弊"};
        
        public demoJTable_5(){
            jf = new JFrame();
            jf.setTitle("JTable使用示例");
            //创建带内容和表头信息的模型
            mtm = new MyTableModel(stu,title);
            //用模型创建表格,取代默认的模型
            jtab = new JTable(mtm);
            //利用JTable中的getColumnModel()方法取得TableColumnModel对象的引用
            //利用对象的setPreferredWidth()方法就可以控制字段的宽度
            for(int i=0;i<title.length;i++){
                TableColumn column = jtab.getColumnModel().getColumn(i);
                if(i%2==0)
                    column.setPreferredWidth(150);
                else
                    column.setPreferredWidth(50);
            }
            jsp = new JScrollPane(jtab);
            con = jf.getContentPane();
            con.add(jsp);
            jf.setSize(500, 400);
            jf.setLocation(300, 200);
            jf.setVisible(true);
            jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
        public static void main(String[] args) {
            new demoJTable_5();
        }
    }
  • 相关阅读:
    18种典型算法
    幂法和反幂法
    关于Ubuntu下安装Win8和Win8下安装Ubuntu的注意事项
    静态链接库与动态链接库
    面向对象系列二(封装)
    基于ASP.NET WPF技术及MVP模式实战太平人寿客户管理项目开发(Repository模式)
    不要对终于用户谈云
    cocos2d-x 3.0 创建项目
    Android OpenGL ES 画球体
    设计模式 适配器模式 以手机充电器为例
  • 原文地址:https://www.cnblogs.com/gaopeng527/p/4250672.html
Copyright © 2011-2022 走看看