黑马程序员_Java图形界面(二)

------- android培训java培训 、期待与您交流! ----------

单选按钮就是在给出的对个显示信息中指定选择一个,在Swing中可以使用JRadioButton完成一组单选钮的操作。

package graphipra;

import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;

class MyRadio{
	private JFrame frame = new JFrame("welcome to lln");
	private Container cont = frame.getContentPane();
	private JRadioButton jrb1 = new JRadioButton("HEIMA");
	private JRadioButton jrb2 = new JRadioButton("HEIMAJAVA");
	private JRadioButton jrb3 = new JRadioButton("HEIMANET");
	private JPanel pan = new JPanel();
	public MyRadio(){
		pan.setBorder(BorderFactory.createTitledBorder("请选择喜爱的网站"));
		pan.setLayout(new GridLayout(1,3));
		pan.add(jrb1);
		pan.add(jrb2);
		pan.add(jrb3);
		cont.add(pan);
		this.frame.setSize(300,80);
		this.frame.setVisible(true);
		this.frame.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent obj){
				System.exit(1);
			}
		});
	}
}
public class JRadioButtonDemo01 {
	public static void main(String args[]){
		new MyRadio();
	}

}

以上的操作中已经形成了一个单选按钮的显示,但是这样的显示是存在问题的。

此时并没有实现单选的功能,如果要实现单选的功能,则需要使用ButtonGroup,所有的单选钮要放在一个组中才可以实现单选的功能。

package graphipra;

import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;

class MyRadio{
	private JFrame frame = new JFrame("welcome to lln");
	private Container cont = frame.getContentPane();
	private JRadioButton jrb1 = new JRadioButton("HEIMA");
	private JRadioButton jrb2 = new JRadioButton("HEIMAJAVA");
	private JRadioButton jrb3 = new JRadioButton("HEIMANET");
	private JPanel pan = new JPanel();
	public MyRadio(){
		pan.setBorder(BorderFactory.createTitledBorder("请选择喜爱的网站"));
		pan.setLayout(new GridLayout(1,3));
		pan.add(jrb1);
		pan.add(jrb2);
		pan.add(jrb3);
		ButtonGroup group = new ButtonGroup();
		group.add(jrb1);
		group.add(jrb2);
		group.add(jrb3);
		cont.add(pan);
		this.frame.setSize(300,80);
		this.frame.setVisible(true);
		this.frame.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent obj){
				System.exit(1);
			}
		});
	}
}
public class JRadioButtonDemo01 {
	public static void main(String args[]){
		new MyRadio();
	}

}

单选钮的事件处理接口是ItemListener

例:完成一个性别的选项,如果已经选中,则显示对,如果是错的,则显示错。

package graphipra;

import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;

import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;

class MyRadio1 implements ItemListener{
	private String right = "d:"+File.separator+"right.png";
	private String wrong = "d:"+File.separator+"wrong.gif";
	private JFrame frame = new JFrame("welcome to lln");
	private Container cont = frame.getContentPane();
	private JRadioButton jrb1 = new JRadioButton("男",new ImageIcon(right),true);
	private JRadioButton jrb2 = new JRadioButton("女",new ImageIcon(wrong),false);
	private JPanel pan = new JPanel();
	public MyRadio1(){
		pan.setBorder(BorderFactory.createTitledBorder("请选择性别"));
		pan.setLayout(new GridLayout(1,3));
		pan.add(this.jrb1);
		pan.add(this.jrb2);
		
		ButtonGroup group = new ButtonGroup();
		group.add(this.jrb1);
		group.add(this.jrb2);
		
		jrb1.addItemListener(this);
		jrb2.addItemListener(this);
		
		cont.add(pan);
		this.frame.setSize(300,80);
		this.frame.setVisible(true);
		this.frame.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent obj){
				System.exit(1);
			}
		});
	}
	public void itemStateChanged(ItemEvent e){
		if(e.getSource()==jrb1){
			jrb1.setIcon(new ImageIcon(right));
			jrb2.setIcon(new ImageIcon(wrong));
		}else{
			jrb1.setIcon(new ImageIcon(wrong));
			jrb2.setIcon(new ImageIcon(right));
		}
	}
}
public class JRadioButtonDemo03 {
	public static void main(String args[]){
		new MyRadio1();
	}

}

在填写图形界面的时候经常会选择用户的兴趣。一个用户会有多个兴趣,那么此时肯定需要复选框(JCheckBox)的支持。

package graphipra;

 

import java.awt.Container;

import java.awt.GridLayout;

import java.awt.event.WindowAdapter;

import java.awt.event.WindowEvent;

 

import javax.swing.BorderFactory;

import javax.swing.JCheckBox;

import javax.swing.JFrame;

import javax.swing.JPanel;

 

class MyCheckBox{

    private JFrame frame = new JFrame("welcome to lln");

    private Container cont = frame.getContentPane();

    private JCheckBox jcb1 = new JCheckBox("HEIMA");

    private JCheckBox jcb2 = new JCheckBox("HEIMAJAVA");

    private JCheckBox jcb3 = new JCheckBox("HEIMANET");

    private JPanel pan = new JPanel();

    public MyCheckBox(){

       pan.setBorder(BorderFactory.createTitledBorder("请选择你喜欢的网址"));

       pan.setLayout(new GridLayout(1,3));

       pan.add(this.jcb1);

       pan.add(this.jcb2);

       pan.add(this.jcb3);

       cont.add(pan);

       this.frame.setSize(330,80);

       this.frame.setVisible(true);

       this.frame.addWindowListener(new WindowAdapter(){

           publicvoid windowClosing(WindowEvent arg){

              System.exit(1);

           }

       });

    }

}

publicclass JCheckBoxDemo01 {

    publicstaticvoid main(String args[]){

       new MyCheckBox();

    }

 

}

在图形界面,单选按钮在选项增加了图片的功能,那么在JCheckBox也同样可以增加此功能,要想完成此功能,则可以依靠事件的处理。

复选框使用的是ITemListener接口完成事件的处理。

package graphipra;

import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;

import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
class MyItemListener implements ItemListener{
	private String right ="d:"+File.separator+"right.png";
	private String wrong = "d:"+File.separator+"wrong.gif";
	public void itemStateChanged(ItemEvent e){
		JCheckBox jcb =(JCheckBox)e.getItem();
		if(jcb.isSelected()){
			jcb.setIcon(new ImageIcon(right));
		}else{
			jcb.setIcon(new ImageIcon(wrong));
		}
	}
}
class MyCheckBox1{
	private String wrong ="d:"+File.separator+"wrong.gif";
	private String right = "d:"+File.separator+"right.png";
	private JFrame frame = new JFrame("welcome to lln");
	private Container cont = frame.getContentPane();
	private JCheckBox jcb1 = new JCheckBox("HEIMA",new ImageIcon(wrong));
	private JCheckBox jcb2 = new JCheckBox("HEIMAJAVA",new ImageIcon(wrong));
	private JCheckBox jcb3 = new JCheckBox("HEIMANET",new ImageIcon(wrong));
	private JPanel pan = new JPanel();
	public MyCheckBox1(){
		pan.setBorder(BorderFactory.createTitledBorder("请选择你喜欢的网址"));
		pan.setLayout(new GridLayout(1,3));
		pan.add(this.jcb1);
		pan.add(this.jcb2);
		pan.add(this.jcb3);
		
		jcb1.addItemListener(new MyItemListener());
		jcb2.addItemListener(new MyItemListener());
		jcb3.addItemListener(new MyItemListener());
		
		cont.add(pan);
		this.frame.setSize(330,80);
		this.frame.setVisible(true);
		this.frame.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent arg){
				System.exit(1);
			}
		});
	}
}
public class JCheckBoxDemo02 {
	public static void main(String args[]){
		new MyCheckBox1();
	}

}

JList代表一个列表,列表框可以同时将多个选项信息以列表的方式展现给用户,使用JList可以构建一个列表框。对于列表框是多选还是单选可以通过ListSelectionModel接口完成。

JList本身是不会加入滚动条的。

可以使用JScorllPane加入滚动条的操作。

package graphipra;

import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Vector;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.ListSelectionModel;

class MyList{
	private JFrame frame = new JFrame("welcome to lln");
	private Container cont = frame.getContentPane();
	private JList list1 = null;
	private JList list2 = null;
	
	public MyList(){
		this.frame.setLayout(new GridLayout(1,3));
		String nations[] = {"中国","美国","英国","法国","意大利"};
		Vector<String> v = new Vector<String>();
		v.add("HEIMA");
		v.add("HEIMAJAVA");
		v.add("HEIMANET");
		
		this.list1 = new JList(nations);
		this.list2 = new JList(v);
		
		this.list1.setBorder(BorderFactory.createTitledBorder("请选择你喜欢的国家"));
		this.list2.setBorder(BorderFactory.createTitledBorder("请选择你喜欢的网站"));
		
		this.list1.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
		this.list2.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		
		this.cont.add(new JScrollPane(this.list1));
		this.cont.add(this.list2);
		
		this.frame.setSize(330,180);
		this.frame.setVisible(true);
		
		this.frame.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e){
				System.exit(1);
			}
		});
	}
}
public class JListDemo01 {
       new MyList();
}

除了使用以上的方式之外,还可以使用另外一种方式,使用ListModel创建列表框。

JList的构造方法中有一个使用ListModel构造JList对象的操作,ListModel是一个专门用于创建Jlist列表内容操作的接口。

此接口中只有一下的两个方法是最有用的。

Object getElementAt(int index),根据索引取出内容。

Int getSize():取出全部的列表内容。

package graphipra;

import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Vector;

import javax.swing.AbstractListModel;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.ListSelectionModel;
class MyListModel extends AbstractListModel{
	private String nations[] = {"中国","美国","英国","法国","意大利"};
	public Object getElementAt(int index){
		if(index<this.nations.length){
			return this.nations[index];
		}else{
			return null;
		}
	}
	public int getSize(){
		return this.nations.length;
	}
}
class MyList1{
	private JFrame frame = new JFrame("welcome to lln");
	private Container cont = frame.getContentPane();
	private JList list1 = null;
	//private JList list2 = null;
	
	public MyList1(){
		this.frame.setLayout(new GridLayout(1,3));
		//String nations[] = {"中国","美国","英国","法国","意大利"};
		//Vector<String> v = new Vector<String>();
		//v.add("HEIMA");
		//v.add("HEIMAJAVA");
		//v.add("HEIMANET");
		
		this.list1 = new JList(new MyListModel());
		//this.list2 = new JList(v);
		
		this.list1.setBorder(BorderFactory.createTitledBorder("请选择你喜欢的国家"));
		//this.list2.setBorder(BorderFactory.createTitledBorder("请选择你喜欢的网站"));
		
		this.list1.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
		//this.list2.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		
		this.cont.add(new JScrollPane(this.list1));
		//this.cont.add(this.list2);
		
		this.frame.setSize(330,180);
		this.frame.setVisible(true);
		
		this.frame.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e){
				System.exit(1);
			}
		});
	}
}
public class JListDemo02 {
	public static void main(String args[]){
		new MyList1();
	}

}

JList中也可以进行事件监听,在JList中可以使用ListSelectionListener的监听接口实现对JList中所选项进行监听,此接口定义了如下的方法。

import javax.swing.JFrame ;
import javax.swing.JList ;
import java.util.Vector ;
import javax.swing.BorderFactory ;
import javax.swing.ListSelectionModel ;
import javax.swing.JScrollPane ;
import javax.swing.AbstractListModel ;
import java.awt.Container ;
import java.awt.GridLayout ;
import java.awt.event.WindowAdapter ;
import java.awt.event.WindowEvent ;
import javax.swing.event.ListSelectionListener ;
import javax.swing.event.ListSelectionEvent ;

class MyListModel extends AbstractListModel{
	private String nations[] = {"中国","巴西","美国","韩国","意大利","法国"} ;
	public Object getElementAt(int index){
		if(index<this.nations.length){
			return this.nations[index] ;
		}else{
			return null ;
		}
	}
	public int getSize(){
		return this.nations.length ;
	}
}

class MyList implements ListSelectionListener{
	private JFrame frame = new JFrame("Welcome To LLN") ;
	private Container cont = frame.getContentPane() ;	// 得到窗体容器
	private JList list1 = null ;

	public MyList(){
		this.frame.setLayout(new GridLayout(1,3)) ;	// 定义排版
		String nations[] = {"中国","巴西","美国","韩国","意大利","法国"} ;
		
		this.list1 = new JList(new MyListModel()) ;

		this.list1.setBorder(BorderFactory.createTitledBorder("你喜欢去那个国家旅游?")) ;

		this.list1.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION) ;// 多选

		this.cont.add(new JScrollPane(this.list1)) ;

		this.frame.setSize(330,180) ;
		this.frame.setVisible(true) ;
		this.list1.addListSelectionListener(this) ;


		this.frame.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent a){
				System.exit(1) ;
			}
		}) ;
	}

	public void valueChanged(ListSelectionEvent e){	// 事件处理
		int temp[] = list1.getSelectedIndices() ;
		System.out.print("选定的内容:") ;
		for(int i=0;i<temp.length;i++){
			System.out.print(list1.getModel().getElementAt(i) + "、") ;
		}
		System.out.println() ;
	}

}

public class JListDemo03{
	public static void main(String args[]){
		new MyList() ;
	}
}

JList本身只是一个列表框,如果要想完成一个下拉的列表框,则就需要使用JComboBox完成

package graphipra;

import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Vector;

import javax.swing.BorderFactory;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;

class MyComboBox{
	private JFrame frame = new JFrame("welcome to lln");
	private Container cont = frame.getContentPane();
	private JComboBox jcb1 = null;
	private JComboBox jcb2 = null;
	public MyComboBox(){
		this.frame.setLayout(new GridLayout(2,2));
		String nations[] = {"中国","美国","英国","法国","意大利"};
		Vector<String> v = new Vector<String>();
		v.add("HEIMA");
		v.add("HEIMAJAVA");
		v.add("HEIMANET");
		
		this.jcb1 = new JComboBox(nations);
		this.jcb2 = new JComboBox(v);
		
		this.jcb1.setBorder(BorderFactory.createTitledBorder("选择你喜欢的国家"));
		this.jcb2.setBorder(BorderFactory.createTitledBorder("选择你喜欢的网站"));
		
		cont.add(this.jcb1);
		cont.add(this.jcb2);
		cont.add(new JLabel("下拉列表框"));
		this.frame.setSize(300,150);
		this.frame.setVisible(true);
		this.frame.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e){
				System.exit(1);
			}
		});
	}
}
public class JComboBoxDemo01 {
	public static void main(String args[]){
		new MyComboBox();
	}

}

在图形界面中也提供了一种使用ComboBoxModel的方式完成下拉列表框。

ComboBoxModel接口是ListModel接口的子类,除了继承JListModel中的所有操作方法之外,还增加了如下的方法。

Void setSelectedItem(Object anItem)设置选项内容

Object getSelectedItem()返回选择项

package graphipra;

import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Vector;

import javax.swing.AbstractListModel;
import javax.swing.BorderFactory;
import javax.swing.ComboBoxEditor;
import javax.swing.ComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
class MyComboBoxModel extends AbstractListModel implements ComboBoxModel{
	private String nations[] = {"中国","美国","英国","法国","意大利"};
	private String item = null;
	public Object getSelectedItem(){
		return this.item;
	}
	public void setSelectedItem(Object anItem){
		this.item = (String)anItem;
	}
	public int getSize(){
		return this.nations.length;
	}
	public Object getElementAt(int ind){
		return this.nations[ind];
	}
}
class MyComboBox1{
	private String defaultMsg = "请选择或输入国家的名称";
	private JFrame frame = new JFrame("welcome to lln");
	private Container cont = frame.getContentPane();
	private JComboBox jcb1 = null;
	//private JComboBox jcb2 = null;
	public MyComboBox1(){
		this.frame.setLayout(new GridLayout(2,1));
		//String nations[] = {"中国","美国","英国","法国","意大利"};
		//Vector<String> v = new Vector<String>();
		//v.add("HEIMA");
		//v.add("HEIMAJAVA");
		//v.add("HEIMANET");
		
		this.jcb1 = new JComboBox(new MyComboBoxModel());
		this.jcb1.setEditable(true);
		//this.jcb2 = new JComboBox(v);
		
		this.jcb1.setBorder(BorderFactory.createTitledBorder("选择你喜欢的国家"));
		//this.jcb2.setBorder(BorderFactory.createTitledBorder("选择你喜欢的网站"));
		
		ComboBoxEditor editor = null;
		editor = this.jcb1.getEditor();
		this.jcb1.configureEditor(editor, defaultMsg);
		this.jcb1.setMaximumRowCount(3);
		
		cont.add(this.jcb1);
		//cont.add(this.jcb2);
		cont.add(new JLabel("下拉列表框"));
		this.frame.setSize(300,150);
		this.frame.setVisible(true);
		this.frame.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e){
				System.exit(1);
			}
		});
	}
}
public class JComboBoxDemo02 {
	public static void main(String args[]){
		new MyComboBox1();
	}

}

同样的道理,在下拉列表框中也可以进行事件处理,使用ItemListener完成,因为牵扯到了输入数据的问题,所以将ActionListener也一起实现了。

package graphipra;

import java.awt.Container;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.BorderFactory;
import javax.swing.ComboBoxEditor;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;

class MyComboBox2 implements ItemListener,ActionListener{
	private JFrame frame = new JFrame("welcome to lln");
	private Container cont = frame.getContentPane();
	private JComboBox jcb1 = null;
	private JLabel label = new JLabel("heimachengxuyanlln");
	private String fontSize[] = {"10","12","14","16","18","20","22","24","26","48","72"};
	
	public MyComboBox2(){
		this.frame.setLayout(new GridLayout(2,2));
		this.jcb1 = new JComboBox(fontSize);
		
		this.jcb1.addItemListener(this);
		this.jcb1.addActionListener(this);
		
		this.jcb1.setEditable(true);
		
		this.jcb1.setBorder(BorderFactory.createTitledBorder("请选择字体大小"));
		
		ComboBoxEditor editor = null;
		editor = this.jcb1.getEditor();
		this.jcb1.configureEditor(editor, "12");
		this.jcb1.setMaximumRowCount(3);
		
		this.changeFontSize(12);
		cont.add(this.jcb1);
		
		
		
		cont.add(label);
		this.frame.setSize(300,150);
		this.frame.setVisible(true);
		this.frame.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e){
				System.exit(1);
			}
		});
	}
	public void itemStateChanged(ItemEvent e){
		if(e.getStateChange()==ItemEvent.SELECTED){
			String itemSize = (String)e.getItem();
			try{
			    this.changeFontSize(Integer.parseInt(itemSize));
			}catch(Exception e1){}
		}
	}
	public void actionPerformed(ActionEvent e){
		String item = (String)this.jcb1.getSelectedItem();
		int size = 12;
		try{
			size = Integer.parseInt(item);
		}catch(Exception e1){
			
		}
		this.changeFontSize(size);
		if(!this.isExists(item)){
			this.jcb1.addItem(this.jcb1.getSelectedItem());
		}
		}
	public boolean isExists(String item){
		boolean flag = false;
		for(int i=0;i<this.jcb1.getItemCount();i++){
			if(item.equals(this.jcb1.getItemAt(i))){
				flag = true;
			}
		}
		return flag;
	}
	public void changeFontSize(int size){
		System.out.println("");
		Font fnt = new Font("Serief",Font.BOLD,size);
		this.label.setFont(fnt);
	}
	}
public class JComboBoxDemo03 {
	public static void main(String args[]){
		new MyComboBox2();
	}

}

若在Java中实现菜单,则可以使用JMenu组件,当然,如果要使用JMenu则首先要了解JMenuBar组件,JMenuBar组件的功能是用来摆放JMenu组件,当建立完许多的JMenu组件之后,需要通过JMenuBar组件来将JMenu组件加入到窗口中。

package graphipra;

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class JMenuDemo01 {
	public static void main(String args[]){
		JFrame frame = new JFrame("welcome to lln");
		JTextArea text = new JTextArea();
		text.setEditable(true);
		frame.getContentPane().add(new JScrollPane(text));
		JMenu menuFile = new JMenu("文件");
		menuFile.setIcon(new ImageIcon("d:"+File.separator+"icons"+File.separator+"file.gif"));
		JMenuBar menuBar = new JMenuBar();
		menuBar.add(menuFile);
		frame.setJMenuBar(menuBar);
		frame.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e){
				System.exit(1);
			}
		});
		frame.setVisible(true);
		frame.setSize(300,100);
		frame.setLocation(300,200);
	}

}

以上已经简单的构建出了一个菜单条,但是此菜单中没有选项,选项用过JMenuItem完成。

package graphipra;

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.KeyStroke;

public class JMenuDemo02 {
	public static void main(String args[]){
		JFrame frame = new JFrame("welcome to lln");
		JTextArea text = new JTextArea();
		text.setEditable(true);
		frame.getContentPane().add(new JScrollPane(text));
		JMenu menuFile = new JMenu("文件");
		menuFile.setIcon(new ImageIcon("d:"+File.separator+"icons"+File.separator+"file.gif"));
		JMenuBar menuBar = new JMenuBar();
		menuBar.add(menuFile);
		
		JMenuItem newItem = new JMenuItem("新建",new ImageIcon("d:"+File.separator+"icons"+File.separator+"new.gif"));
		JMenuItem openItem = new JMenuItem("打开",new ImageIcon("d:"+File.separator+"icons"+File.separator+"open.gif"));
		JMenuItem closeItem = new JMenuItem("关闭",new ImageIcon("d:"+File.separator+"icons"+File.separator+"close.gif"));
		JMenuItem exitItem = new JMenuItem("退出",new ImageIcon("d:"+File.separator+"icons"+File.separator+"exit.gif"));
		
		newItem.setMnemonic('N');
		openItem.setMnemonic('O');
		closeItem.setMnemonic('C');
		exitItem.setMnemonic('E');
		
		newItem.setAccelerator(KeyStroke.getKeyStroke('N',java.awt.Event.CTRL_MASK));
		openItem.setAccelerator(KeyStroke.getKeyStroke('O',java.awt.Event.CTRL_MASK));
		closeItem.setAccelerator(KeyStroke.getKeyStroke('C',java.awt.Event.ALT_MASK));
		exitItem.setAccelerator(KeyStroke.getKeyStroke('E',java.awt.Event.ALT_MASK));
		
		menuFile.add(newItem);
		menuFile.add(openItem);
		menuFile.add(closeItem);
		menuFile.add(exitItem);
		
		frame.setJMenuBar(menuBar);
		frame.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e){
				System.exit(1);
			}
		});
		frame.setVisible(true);
		frame.setSize(300,100);
		frame.setLocation(300,200);
	}

}

菜单实际上就属于一个特殊的按钮,那么使用JButton的事件就可以处理菜单了。

package graphipra;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.KeyStroke;

public class JMenuDemo03 {
	public static void main(String args[]){
		JFrame frame = new JFrame("welcome to lln");
		final JTextArea text = new JTextArea();
		text.setEditable(true);
		frame.getContentPane().add(new JScrollPane(text));
		JMenu menuFile = new JMenu("文件");
		menuFile.setIcon(new ImageIcon("d:"+File.separator+"icons"+File.separator+"file.gif"));
		JMenuBar menuBar = new JMenuBar();
		menuBar.add(menuFile);
		
		JMenuItem newItem = new JMenuItem("新建",new ImageIcon("d:"+File.separator+"icons"+File.separator+"new.gif"));
		JMenuItem openItem = new JMenuItem("打开",new ImageIcon("d:"+File.separator+"icons"+File.separator+"open.gif"));
		JMenuItem closeItem = new JMenuItem("关闭",new ImageIcon("d:"+File.separator+"icons"+File.separator+"close.gif"));
		JMenuItem exitItem = new JMenuItem("退出",new ImageIcon("d:"+File.separator+"icons"+File.separator+"exit.gif"));
		
		newItem.setMnemonic('N');
		openItem.setMnemonic('O');
		closeItem.setMnemonic('C');
		exitItem.setMnemonic('E');
		
		newItem.setAccelerator(KeyStroke.getKeyStroke('N',java.awt.Event.CTRL_MASK));
		openItem.setAccelerator(KeyStroke.getKeyStroke('O',java.awt.Event.CTRL_MASK));
		closeItem.setAccelerator(KeyStroke.getKeyStroke('C',java.awt.Event.ALT_MASK));
		exitItem.setAccelerator(KeyStroke.getKeyStroke('E',java.awt.Event.ALT_MASK));
		
		newItem.addActionListener(new ActionListener(){
			
				public void actionPerformed(ActionEvent e){
					text.append("===选择了“新建”菜单项\n");
				}
			}
		);
		
		openItem.addActionListener(new ActionListener(){
			
			public void actionPerformed(ActionEvent e){
				text.append("===选择了“打开”菜单项\n");
			}
		}
	);
		
		closeItem.addActionListener(new ActionListener(){
			
			public void actionPerformed(ActionEvent e){
				text.append("===选择了“关闭”菜单项\n");
			}
		}
	);
		
		exitItem.addActionListener(new ActionListener(){
			
			public void actionPerformed(ActionEvent e){
				text.append("===选择了“退出”菜单项\n");
			}
		}
	);
		
		menuFile.add(newItem);
		menuFile.add(openItem);
		menuFile.add(closeItem);
		menuFile.add(exitItem);
		
		frame.setJMenuBar(menuBar);
		frame.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e){
				System.exit(1);
			}
		});
		frame.setVisible(true);
		frame.setSize(300,100);
		frame.setLocation(300,200);
	}

}

我们知道一般的文本操作都有打开和关闭的操作。

在使用记事本或者word的时候,可以通过文件选择框选择要打开或保存的文件,在Swing中可以使用JFileChoose组件实现此功能。

如果使用了JFileChoose选择了一个文件,则文件将以File对象的形式返回。

文件选择框的三种返回状态:

Public static final int APPROVE_OPTION 选择确定后返回该值

Public static final int CANCEL_OPTION  选择取消后返回该值

Public static final int ERROR_OPTION   发生错误后返回该值

package graphipra;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.util.Scanner;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

class Note implements ActionListener{
	private JTextArea area = new JTextArea(8,10);
	private JFrame frame = new JFrame("welcome to lln");
	private JButton open = new JButton("打开文件");
	private JButton save = new JButton("保存文件");
    private JLabel label = new JLabel("现在没有打开的文件");
    private JPanel butPan = new JPanel();
    public Note(){
    	this.butPan.add(open);
    	this.butPan.add(save);
    	this.frame.setLayout(new BorderLayout(3,3));
    	this.frame.add(this.label,BorderLayout.NORTH);
    	this.frame.add(this.butPan,BorderLayout.SOUTH);
    	this.frame.add(new JScrollPane(this.area),BorderLayout.CENTER);
    	this.frame.setSize(330,180);
    	this.frame.setVisible(true);
    	this.frame.addWindowListener(new WindowAdapter(){
    		public void windowClosing(WindowEvent e){
    			System.exit(1);
    		}
    	});
    	
    	this.open.addActionListener(this);
    	this.save.addActionListener(this);
    	
    	
    	
    }
    public void actionPerformed(ActionEvent e){
		File file = null;
		int result = 0;
		JFileChooser fileChooser = new JFileChooser();
		if(e.getSource()==this.open){
			this.area.setText("");
			fileChooser.setApproveButtonText("确定");
			result = fileChooser.showOpenDialog(this.frame);
			if(result==JFileChooser.APPROVE_OPTION){
				file = fileChooser.getSelectedFile();
				this.label.setText("打开的文件名称为:"+file.getName());
			}else if(result==JFileChooser.CANCEL_OPTION){
				this.label.setText("没有选择任何文件");
			}else{
				this.label.setText("操作出现错误");
			}
			if(file!=null){
				try{
					Scanner scan = new Scanner(new FileInputStream(file));
					
					scan.useDelimiter("\n");
					while(scan.hasNext()){
						this.area.append(scan.next());
						this.area.append("\n");
					}
				}catch(Exception e1){}
			}
		}
		if(e.getSource()==this.save){
			result = fileChooser.showSaveDialog(this.frame);
			if(result==JFileChooser.APPROVE_OPTION){
				file = fileChooser.getSelectedFile();
				this.label.setText("选择的存储文件名称为:"+file.getName());
			}else if(result==JFileChooser.CANCEL_OPTION){
				this.label.setText("没有选择任何文件");
			}else{
				this.label.setText("操作出现错误");
			}
			if(file!=null){
				try{
					PrintStream out = new PrintStream(new FileOutputStream(file));
				    out.print(this.area.getText());
				}catch(Exception e1){}
			}
		}
	}
}
public class JFileChooseDemo {
	public static void main(String args[]){
		new Note();
	}

}

JTable表格组件提供了以行和列的形式显示数据的视图。在程序开发中是一个非常重要的组件,尤其在需要将一堆数据有条理的展现给用户的时候,表格设计更能显示出它的重要性。

Swing中可以通过JTable组件非常轻松的构造出所需要的表格,并且也提供了一些方法来管理这些表格的内容。

package graphipra;

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;

public class JTableDemo01 {
	public static void main(String args[]){
		JFrame frame = new JFrame("welcome to lln");
		String[] titles = {"姓名","年龄","性别","数学成绩","英语成绩","总分","是否及格"};
		Object[][] userinfo = {
				{"刘丽娜","24","女","89","98","187","及格"},
				{"刘娜娜","25","男","80","90","170","及格"},
				{"刘丽丽","23","女","75","85","160","及格"}
		};
		JTable table = new JTable(userinfo,titles);
		JScrollPane scr = new JScrollPane(table);
		frame.add(scr);
		frame.setSize(370,90);
		frame.setVisible(true);
		frame.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e){
				System.exit(1);
			}
		});
	}

}

表格的显示非常的容易,直接加上数组显示即可。

在表格的建立中也可以使用TableModel建立一个表格。

package graphipra;

import java.awt.BorderLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;

class DefaultTable1 extends AbstractTableModel{
	private String[] titles = {"姓名","年龄","性别","数学成绩","英语成绩","总分","是否及格"};
	private Object[][] userinfo = {
			{"刘丽娜",24,"女","89","98","187",true},
			{"刘娜娜",25,"男","80","90","170",false},
			{"刘丽丽",23,"女","75","85","160",true}
	};
	public int getColumnCount(){
		return this.titles.length;
	}
	public int getRowCount(){
		return this.userinfo.length;
	}
	public Object getValueAt(int rowIndex,int columnIndex){
		return this.userinfo[rowIndex][columnIndex];
	}
	public String getColumnName(int columnIndex){
		return this.titles[columnIndex];
	}
	public Class<?> getColumnClass(int columnIndex){
		return this.getValueAt(0, columnIndex).getClass();
	}
	public boolean isCellEditable(int rowIndex,int columnIndex){
		return true;
	}
	public void setValueAt(Object aValue,int rowIndex,int columnIndex){
		this.userinfo[rowIndex][columnIndex] = aValue;
	}
}
class TableColumnModeDemo1{
	private JFrame frame = new JFrame("welcome to lln");
	private JTable table = null;
	private DefaultTable1 defaultTable = new DefaultTable1();
	private JComboBox sexList = new JComboBox();
	public TableColumnModeDemo1(){
		this.table = new JTable(this.defaultTable);
		this.sexList.addItem("男");
		this.sexList.addItem("女");
		//DefaultCellEditor dce = new DefaultCellEditor(this.sexList);
		//this.table.getColumnModel().getColumn(2).setCellEditor(dce);
		this.table.getColumnModel().getColumn(2).setCellEditor(new DefaultCellEditor(this.sexList)) ;
		JScrollPane scr = new JScrollPane(this.table);
		JPanel toolBar = new JPanel();
		frame.add(toolBar,BorderLayout.NORTH);
		frame.add(scr,BorderLayout.CENTER);
		frame.setSize(370,90);
		frame.setVisible(true);
		frame.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e){
				System.exit(1);
			}
		});
	}
}
public class JTableDemo02 {
	public static void main(String args[]){
		new TableColumnModeDemo1();
	}

}

除了可以使用AbstractTableModel构建表格之外,还可以使用DefaultTableModel而且使用DefaultTableModel创建的表格更加有意义。而且操作的更加方便。

package graphipra;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;

class ChangeTable1 implements ActionListener{
	private JFrame frame = new JFrame("welcome to lln");
	private JTable table = null;
	private DefaultTableModel tableModel;
	private String[] titles = {"姓名","年龄","性别","数学成绩","英语成绩","总分","是否及格"};
	private Object[][] userinfo = {
			{"刘丽娜","24","女","89","98","187","及格"},
			{"刘娜娜","25","男","80","90","170","及格"},
			{"刘丽丽","23","女","75","85","160","及格"}
	};
	private JButton addRowBtn = new JButton("增加行");
	private JButton removeRowBtn = new JButton("删除行");
	private JButton addColBtn = new JButton("增加列");
	private JButton removeColBtn = new JButton("删除列");
	
	public ChangeTable1(){
		this.tableModel = new DefaultTableModel(this.userinfo,this.titles);
		this.table = new JTable(this.tableModel);
		JScrollPane scr = new JScrollPane(this.table);
		JPanel toolBar = new JPanel();
		toolBar.add(this.addRowBtn);
		toolBar.add(this.removeRowBtn);
		toolBar.add(this.addColBtn);
		toolBar.add(this.removeColBtn);
		frame.add(toolBar,BorderLayout.NORTH);
		frame.add(scr,BorderLayout.CENTER);
		frame.setSize(370,160);
		frame.setVisible(true);
		frame.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e){
				System.exit(1);
			}
		});
		this.addRowBtn.addActionListener(this);
		this.removeRowBtn.addActionListener(this);
		this.addColBtn.addActionListener(this);
		this.removeColBtn.addActionListener(this);
	}
	public void actionPerformed(ActionEvent e){
		if(e.getSource()==this.addColBtn){
			this.tableModel.addColumn("新增列");
		}
		if(e.getSource()==this.addRowBtn){
			this.tableModel.addRow(new Object[]{});
		}
		if(e.getSource()==this.removeColBtn){
			int colCount = this.tableModel.getColumnCount()-1;
			if(colCount>=0){
				TableColumnModel columMode = this.table.getColumnModel();
				TableColumn tableColumn = columMode.getColumn(colCount);
				columMode.removeColumn(tableColumn);
				this.tableModel.setColumnCount(colCount);
			}
		}
		if(e.getSource()==this.removeRowBtn){
			int rowCount = this.tableModel.getRowCount()-1;
			if(rowCount>=0){
				this.tableModel.removeRow(rowCount);
				this.tableModel.setRowCount(rowCount);
			}
		}
	}
}
public class JTableDemo03 {
	public static void main(String args[]){
		new ChangeTable1();
	}

}













 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值