import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; import javax.swing.border.*; public class Progress extends JPanel { JProgressBar pb = new JProgressBar(); //进度条 JSlider sb = new JSlider(JSlider.HORIZONTAL, 0, 100, 60);//滑动条 public Progress() { setLayout(new GridLayout(2,1)); add(pb); sb.setValue(0); sb.setPaintTicks(true); sb.setMajorTickSpacing(20); //设置滑动条的主间隔个数 sb.setMinorTickSpacing(5); //每个间隔细分为5个间隔 sb.setBorder(new TitledBorder("Slide Me")); pb.setModel(sb.getModel()); // Share model add(sb); } public static void main(String args[]) { JFrame jf = new JFrame(); Progress pro = new Progress(); jf.add(pro); jf.setSize(200,300); jf.setVisible(true); } } ///:~
结果如下所示:
2:ButtonGroup以及动态映射import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; import java.lang.reflect.*; public class ButtonGroups extends JPanel { static String[] ids = { "June", "Ward", "Beaver","Wally", "Eddie", "Lumpy", }; static JPanel makeBPanel(Class bClass, String[] ids) { ButtonGroup bg = new ButtonGroup(); JPanel jp = new JPanel(); String title = bClass.getName(); title = title.substring( title.lastIndexOf('.') + 1); jp.setBorder(new TitledBorder(title)); for(int i = 0; i < ids.length; i++) { AbstractButton ab = new JButton("failed"); try { //动态获得一个有一个String参数的构造函数 Constructor ctor = bClass.getConstructor(new Class[] { String.class }); //创造一个Object ab = (AbstractButton)ctor.newInstance(new Object[]{ids[i]}); } catch(Exception ex) { System.out.println("can't create " + bClass); } bg.add(ab);//按钮组添加按钮 jp.add(ab); } return jp; } public ButtonGroups() { add(makeBPanel(JButton.class, ids)); add(makeBPanel(JToggleButton.class, ids)); add(makeBPanel(JCheckBox.class, ids)); add(makeBPanel(JRadioButton.class, ids)); } public static void main(String args[]) { JFrame jf = new JFrame(); ButtonGroups btg = new ButtonGroups(); jf.add(btg); jf.setSize(500,300); jf.setVisible(true); } } ///:~
结果如下所示:
这个程序的特点就是通过reflect来实现添加不同类型的按钮组,AbstractButton 是所有不同类型的button的父类,所以可以通过它来操作子类的重定义函数。通过Constructor ctor = bClass.getConstructor(new Class[] { String.class });来获得有一个参数是String类型的构造函数,通过ab = (AbstractButton)ctor.newInstance(new Object[]{ids[i]});来创建一个button的对象。static Icon face = new Icon("face0.jpg");//建立图标 JButton jb = new JButton("bt",face); //建立带有图标的按钮 jb.setIcon(face);//设置图标 jb.setRolloverIcon(faces[1]);//设置滚动时的按钮图标 jb.setPressedIcon(faces[2]); //设置按下时的按钮图标 jb.setDisabledIcon(faces[4]);//设置禁用时的按钮图标
结果如下所示:
4:弹出菜单import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Popup extends JPanel { JPopupMenu popup = new JPopupMenu(); JTextField t = new JTextField(10); public Popup() { add(t); ActionListener al = new ActionListener() { public void actionPerformed(ActionEvent e){ t.setText( ((JMenuItem)e.getSource()).getText()); } }; JMenuItem m = new JMenuItem("Hither"); m.addActionListener(al); popup.add(m); m = new JMenuItem("Yon"); m.addActionListener(al); popup.add(m); m = new JMenuItem("Afar"); m.addActionListener(al); popup.add(m); popup.addSeparator(); m = new JMenuItem("Stay Here"); m.addActionListener(al); popup.add(m); PopupListener pl= new PopupListener(); addMouseListener(pl); t.addMouseListener(pl);//这样即便鼠标点击label,也会弹出菜单 } class PopupListener extends MouseAdapter { public void mousePressed(MouseEvent e) { maybeShowPopup(e); } public void mouseReleased(MouseEvent e) { maybeShowPopup(e); } private void maybeShowPopup(MouseEvent e) { //判断鼠标事件是否为弹出菜单的触发事件 if(e.isPopupTrigger()) { popup.show(e.getComponent(), e.getX(), e.getY()); } } } public static void main(String args[]) { JFrame jf = new JFrame(); Popup pm = new Popup(); jf.add(pm); jf.setSize(500,500); jf.setVisible(true); } } ///:~
结果如下所示:
通过鼠标监听器来监听弹出菜单事件,e.isPopupTrigger()来判断是否是弹出菜单的触发事件;popup.show(e.getComponent(), e.getX(), e.getY());在点击鼠标的位置显示弹出菜单;import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.tree.*; // Takes an array of Strings and makes the first // element a node and the rest leaves: class Branch { DefaultMutableTreeNode r; public Branch(String[] data) { r = new DefaultMutableTreeNode(data[0]); for(int i = 1; i < data.length; i++) r.add(new DefaultMutableTreeNode(data[i])); } public DefaultMutableTreeNode node() { return r; } } public class Trees extends JPanel { String[][] data = { { "Colors", "Red", "Blue", "Green" }, { "Flavors", "Tart", "Sweet", "Bland" }, { "Length", "Short", "Medium", "Long" }, { "Volume", "High", "Medium", "Low" }, { "Temperature", "High", "Medium", "Low" }, { "Intensity", "High", "Medium", "Low" }, }; static int i = 0; DefaultMutableTreeNode root, child, chosen; JTree tree; DefaultTreeModel model; public Trees() { setLayout(new BorderLayout()); root = new DefaultMutableTreeNode("root");//建立树的根节点 tree = new JTree(root);//建立一棵树 // Add it and make it take care of scrolling: add(new JScrollPane(tree), BorderLayout.CENTER); // Capture the tree's model: model =(DefaultTreeModel)tree.getModel(); JButton test = new JButton("Press me"); test.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e){ if(i < data.length) { //通过Branch建立子节点的所有节点 child = new Branch(data[i++]).node(); // What's the last one you clicked? chosen = (DefaultMutableTreeNode)tree.getLastSelectedPathComponent(); if(chosen == null) chosen = root; // The model will create the appropriate event. In // response, the tree will update itself: model.insertNodeInto(child, chosen, 0); // This puts the new node on the currently chosen node. } } }); // Change the button's colors: test.setBackground(Color.blue); test.setForeground(Color.white); JPanel p = new JPanel(); p.add(test); add(p, BorderLayout.SOUTH); } public static void main(String args[]) { JFrame jf = new JFrame(); Trees nt = new Trees(); jf.add(nt); jf.setSize(1000,1000); jf.setVisible(true); } } ///:~
结果如下所示:
程序中通过Branch来建立一个分支,这个分支是两层的,包含一个根节点以及几个叶子节点;import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.table.*; import javax.swing.event.*; // T he TableModel controls all the data: class DataModel extends AbstractTableModel { Object[][] data = { {"one", "two", "three", "four"}, {"five", "six", "seven", "eight"}, {"nine", "ten", "eleven", "twelve"}, }; // Prints data when table changes: class TML implements TableModelListener { public void tableChanged(TableModelEvent e) { for(int i = 0; i < data.length; i++) { for(int j = 0; j < data[0].length; j++) System.out.print(data[i][j] + " "); System.out.println(); } } } DataModel() { addTableModelListener(new TML()); } //必须完成interface TableModel的函数 public int getColumnCount() { return data[0].length; } //必须完成interface TableModel的函数 public int getRowCount() { return data.length; } //必须完成interface TableModel的函数 public Object getValueAt(int row, int col) { return data[row][col]; } public void setValueAt(Object val, int row, int col) { data[row][col] = val; // Indicate the change has happened: fireTableDataChanged(); } public boolean isCellEditable(int row, int col) { return true; } }; public class Table extends JPanel { public Table() { setLayout(new BorderLayout()); JTable table = new JTable(new DataModel()); JScrollPane scrollpane = JTable.createScrollPaneForTable(table); add(scrollpane, BorderLayout.CENTER); } public static void main(String args[]) { JFrame jf = new JFrame(); Table ta = new Table(); jf.add(ta); jf.setSize(300,300); jf.setVisible(true); } }
结果如下所示: