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()+"\n你的密码是:"+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()+"\n你的密码是:"+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+"个省份,它们是:\n"+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();

    }

}

 

你可能感兴趣的:(程序设计)