• 201871010111-刘佳华《面向对象程序设计(java)》第十五周学习总结


    201871010111-刘佳华《面向对象程序设计(java)》第十五周学习总结

    实验十三  Swing图形界面组件(二)

    实验时间 2019-12-6

    第一部分:理论知识总结

    5>.条(JSlider) 
    滑动条在构造时默认是横向,如果需要纵向滑动条:

    JSlider s = new JSlider(SwingConstants.VERTICAL,min,max,initialValue);
    当滑动条滑动时,会触发ChangeEvent,需要调用addChangeListener()并且安装一个实现了ChangeListener接口的对象。这个接口只有一个StateChanged方法

    //得到滑动条的当前值
    ChangeListener listen = event ->{
    JSlider s = (JSlider)event.getSource();
    int val = s.getValue(); 
    ...
    };
    如果需要显示滑动条的刻度,则setPaintTicks(true); 
    如果要将滑动条强制对准刻度,则setSnapToTicks(true); 
    如果要为滑动条设置标签,则需要先构建一个Hashtable< Integer,Component>,将数字与标签对应起来,再调用setLabelTable(Dictionary label);

    5.复杂的布局管理
    1>GridBagLayout(网格组布局) 
    即没有限制的网格布局,行和列的尺寸可以改变,且单元格可以合并 
    过程: 
    1)建议一个GridBagLayout对象,不需要指定行列数 
    2)将容器setLayout为GBL对象 
    3)为每个组件建立GridBagConstraints对象,即约束组件的大小以及排放方式 
    4)通过add(component,constraints)增加组件 
    使用帮助类来管理约束会方便很多。 
    2>不使用布局管理器

    frame.setLayout(null);
    JButton btn = new JButton("Yes");
    frame.add(btn);
    btn.setBounds(10,10,100,30);
    //void setBounds(int x,int y,int width,int height)//x,y表示左上角的坐标,width/height表示组件宽和高,Component类的方法
    3>组件的遍历顺序(焦点的顺序):从左至右从上到下

    component.setFocusable(false);//组件不设置焦点
    6.菜单
    分为JMenuBar/JMenu/JMenuItem,当选择菜单项时会触发一个动作事件,需要注册监听器监听

    7.对话框
    对话框分为模式对话框和无模对话框,模式对话框就是未处理此对话框之前不允许与其他窗口交互。 
    1>JOptionPane 
    提供了四个用静态方法(showxxxx)显示的对话框: 
    构造对话框的步骤: 
    1)选择对话框类型(消息、确认、选择、输入) 
    2)选择消息类型(String/Icon/Component/Object[]/任何其他对象) 
    3)选择图标(ERROR_MESSAGE/INFORMATION_MESSAGE/WARNING_MESSAGE/QUESTION_MESSAGE/PLAIN_MESSAGE) 
    4)对于确认对话框,选择按钮类型(DEFAULT_OPTION/YES_NO_OPTION/YES_NO_CANCEL_OPTION/OK_CANCEL_OPTION) 
    5)对于选项对话框,选择选项(String/Icon/Component) 
    6)对于输入对话框,选择文本框或组合框 
    确认对话框和选择对话框调用后会返回按钮值或被选的选项的索引值 
    2>JDialog类 
    可以自己创建对话框,需调用超类JDialog类的构造器

    public aboutD extends JDialog
    {
    public aboutD(JFrame owner)
    {
    super(owner,"About Text",true);
    ....
    }
    }
    构造JDialog类后需要setVisible才能时窗口可见

    if(dialog == null)
    dialog = new JDialog();
    dialog.setVisible(true);
    3>文件对话框(JFileChooser类) 
    4>颜色对话框(JColorChooser类)

    第二部分:实验部分

    1、实验目的与要求

    (1) 掌握菜单组件用途及常用API;

    (2) 掌握对话框组件用途及常用API;

    (3) 学习设计简单应用程序的GUI。

    2、实验内容和步骤

    实验1: 导入第12章示例程序,测试程序并进行组内讨论。

    测试程序1

    l 在elipse IDE中调试运行教材512页程序12-8,结合运行结果理解程序;

    l 掌握菜单的创建、菜单事件监听器、复选框和单选按钮菜单项、弹出菜单以及快捷键和加速器的用法。

    l 记录示例代码阅读理解中存在的问题与疑惑。

    代码如下:

     1 package menu;
     2 
     3 import java.awt.*;
     4 import javax.swing.*;
     5 
     6 /**
     7  * @version 1.25 2018-04-10
     8  * @author Cay Horstmann
     9  */
    10 public class MenuTest
    11 {
    12    public static void main(String[] args)
    13    {
    14       EventQueue.invokeLater(() -> {
    15          var frame = new MenuFrame();
    16          frame.setTitle("MenuTest");
    17          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    18          frame.setVisible(true);
    19       });
    20    }
    21 }
    MenuTest
      1 package menu;
      2 
      3 import java.awt.event.*;
      4 import javax.swing.*;
      5 
      6 /**
      7  * A frame with a sample menu bar.
      8  */
      9 public class MenuFrame extends JFrame
     10 {
     11    private static final int DEFAULT_WIDTH = 300;
     12    private static final int DEFAULT_HEIGHT = 200;
     13    private Action saveAction;
     14    private Action saveAsAction;
     15    private JCheckBoxMenuItem readonlyItem;
     16    private JPopupMenu popup;
     17    //private TestAction saveAction;
     18 
     19    /**
     20     * A sample action that prints the action name to System.out.
     21     */
     22    class TestAction extends AbstractAction
     23    {
     24       public TestAction(String name)
     25       {
     26          super(name);
     27       }
     28 
     29       public void actionPerformed(ActionEvent event)
     30       {
     31          System.out.println(getValue(Action.NAME) + " selected.");
     32       }
     33    }
     34 
     35    public MenuFrame()
     36    {
     37       setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
     38 
     39       JMenu fileMenu = new JMenu("File");
     40       fileMenu.add(new TestAction("New"));//添加匿名类对象
     41 
     42       // 演示加速器
     43 
     44       JMenuItem openItem = fileMenu.add(new TestAction("Open"));
     45       openItem.setAccelerator(KeyStroke.getKeyStroke("ctrl O"));//设置open的加速器为ctrl+o
     46 
     47       fileMenu.addSeparator();//添加分隔符号在菜单中
     48 
     49       saveAction = new TestAction("Save");
     50       JMenuItem saveItem = fileMenu.add(saveAction);
     51       saveItem.setAccelerator(KeyStroke.getKeyStroke("ctrl S"));
     52 
     53       saveAsAction = new TestAction("Save As");
     54       fileMenu.add(saveAsAction);
     55       fileMenu.addSeparator();
     56 
     57       fileMenu.add(new AbstractAction("Exit")
     58          {
     59             public void actionPerformed(ActionEvent event)
     60             {
     61                System.exit(0);
     62             }
     63          });
     64 
     65       // 演示复选框和单选按钮菜单
     66 
     67       readonlyItem = new JCheckBoxMenuItem("Read-only");
     68       readonlyItem.addActionListener(new ActionListener()//设置只读判断
     69          {
     70             public void actionPerformed(ActionEvent event)
     71             {
     72                boolean saveOk = !readonlyItem.isSelected();
     73                saveAction.setEnabled(saveOk);
     74                saveAsAction.setEnabled(saveOk);
     75             }
     76          });
     77 
     78       var group = new ButtonGroup();
     79 
     80       var insertItem = new JRadioButtonMenuItem("Insert");
     81       insertItem.setSelected(true);
     82       var overtypeItem = new JRadioButtonMenuItem("Overtype");
     83 
     84       group.add(insertItem);
     85       group.add(overtypeItem);
     86 
     87       // 设置小图标
     88 
     89       var cutAction = new TestAction("Cut");
     90       cutAction.putValue(Action.SMALL_ICON, new ImageIcon("C:\Users\83583\Desktop\java\corejava\v1ch11\cut.gif"));
     91       var copyAction = new TestAction("Copy");
     92       copyAction.putValue(Action.SMALL_ICON, new ImageIcon("C:\Users\83583\Desktop\java\corejava\v1ch11\copy.gif"));
     93       var pasteAction = new TestAction("Paste");
     94       pasteAction.putValue(Action.SMALL_ICON, new ImageIcon("C:\Users\83583\Desktop\java\corejava\v1ch11\paste.gif"));
     95 
     96       var editMenu = new JMenu("Edit");
     97       editMenu.add(cutAction);
     98       editMenu.add(copyAction);
     99       editMenu.add(pasteAction);
    100 
    101       // 设置二级菜单
    102 
    103       var optionMenu = new JMenu("Options");
    104 
    105       optionMenu.add(readonlyItem);
    106       optionMenu.addSeparator();
    107       optionMenu.add(insertItem);
    108       optionMenu.add(overtypeItem);
    109 
    110       editMenu.addSeparator();
    111       editMenu.add(optionMenu);
    112 
    113       // demonstrate mnemonics
    114 
    115       var helpMenu = new JMenu("Help");
    116       helpMenu.setMnemonic('H');
    117 
    118       var indexItem = new JMenuItem("Index");
    119       indexItem.setMnemonic('I');
    120       helpMenu.add(indexItem);
    121 
    122       // you can also add the mnemonic key to an action
    123       var aboutAction = new TestAction("About");
    124       aboutAction.putValue(Action.MNEMONIC_KEY, new Integer('A'));
    125       helpMenu.add(aboutAction);
    126       
    127       // add all top-level menus to menu bar
    128 
    129       var menuBar = new JMenuBar();
    130       setJMenuBar(menuBar);
    131 
    132       menuBar.add(fileMenu);
    133       menuBar.add(editMenu);
    134       menuBar.add(helpMenu);
    135 
    136       // 添加弹出式菜单
    137 
    138       popup = new JPopupMenu();
    139       popup.add(cutAction);
    140       popup.add(copyAction);
    141       popup.add(pasteAction);
    142 
    143       var panel = new JPanel();
    144       panel.setComponentPopupMenu(popup);//在panel上设置弹出菜单
    145       add(panel);
    146    }
    147 }
    MenuFrame

       

    1.点击Exit会关闭窗口

    2.使用快捷键Ctrl+O和Ctrl+S,操作结果与鼠标点击相同:

    通过控制台上显示单击菜单+selected,仿真模拟者个程序的实现过程:

    3.Options子菜单(复选框和单选按钮菜单项)

    测试程序2

    l 在elipse IDE中调试运行教材517页程序12-9,结合运行结果理解程序;

    l 掌握工具栏和工具提示的用法;

    l 记录示例代码阅读理解中存在的问题与疑惑。

    代码如下:

     1 package toolBar;
     2 
     3 import java.awt.*;
     4 import javax.swing.*;
     5 
     6 /**
     7  * @version 1.15 2018-04-10
     8  * @author Cay Horstmann
     9  */
    10 public class ToolBarTest
    11 {
    12    public static void main(String[] args)
    13    {
    14       EventQueue.invokeLater(() -> {
    15          var frame = new ToolBarFrame();
    16          frame.setTitle("ToolBarTest");
    17          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    18          frame.setVisible(true);
    19       });
    20    }
    21 }
    ToolBarTest
     1 package toolBar;
     2 
     3 import java.awt.*;
     4 import java.awt.event.*;
     5 import javax.swing.*;
     6 
     7 /**
     8  * A frame with a toolbar and menu for color changes.
     9  */
    10 public class ToolBarFrame extends JFrame
    11 {
    12    private static final int DEFAULT_WIDTH = 300;
    13    private static final int DEFAULT_HEIGHT = 200;
    14    private JPanel panel;
    15 
    16    public ToolBarFrame()
    17    {
    18       setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
    19 
    20       // 添加用于改变颜色的面板
    21 
    22       panel = new JPanel();
    23       add(panel, BorderLayout.CENTER);
    24 
    25       // set up actions
    26 
    27       var blueAction = new ColorAction("Blue", new ImageIcon("blue-ball.gif"), Color.BLUE);
    28       var yellowAction = new ColorAction("Yellow", new ImageIcon("yellow-ball.gif"),Color.YELLOW);
    29       var redAction = new ColorAction("Red", new ImageIcon("red-ball.gif"), Color.RED);
    30 
    31       var exitAction = new AbstractAction("Exit", new ImageIcon("exit.gif"))
    32          {
    33             public void actionPerformed(ActionEvent event)
    34             {
    35                System.exit(0);
    36             }
    37          };
    38       exitAction.putValue(Action.SHORT_DESCRIPTION, "Exit");//The key used for storing a short Stringdescription for the action, used for tooltip text.
    39 
    40 
    41       // 填充工具栏
    42 
    43       var bar = new JToolBar();
    44       bar.add(blueAction);
    45       bar.add(yellowAction);
    46       bar.add(redAction);
    47       bar.addSeparator();
    48       bar.add(exitAction);
    49       add(bar, BorderLayout.NORTH);
    50 
    51       // 填充菜单
    52 
    53       var menu = new JMenu("Color");
    54       menu.add(yellowAction);
    55       menu.add(blueAction);
    56       menu.add(redAction);
    57       menu.add(exitAction);
    58       var menuBar = new JMenuBar();
    59       menuBar.add(menu);
    60       //setJMenuBar(menuBar);
    61       this.setJMenuBar(menuBar);    
    62    }
    63 
    64    /**
    65     * The color action sets the background of the frame to a given color.
    66     */
    67    class ColorAction extends AbstractAction
    68    {
    69       public ColorAction(String name, Icon icon, Color c)//javax.swing.AbstractAction.putValue(String key, Object newValue)
    70       {                                                    //构造coloraction的构造器
    71          putValue(Action.NAME, name);
    72          putValue(Action.SMALL_ICON, icon);
    73          putValue(Action.SHORT_DESCRIPTION, name + " background");
    74          putValue("Color", c);
    75       }
    76 
    77       public void actionPerformed(ActionEvent event)
    78       {
    79          Color c = (Color) getValue("Color");//获取颜色值并且赋给颜色对象变量
    80          panel.setBackground(c);//设置背景颜色
    81       }
    82    }
    83 }
    ToolBarFrame

    初始状态:

     分别点击小图标之后,面板颜色会变化与小图标一致:(以蓝色为例)

    将鼠标放置在四个按钮上都会有对应的提示(如图): 

     

     此外,除了小图标控制之后,菜单栏color也能实现同样的操作:

    •  问题与疑惑:

    1.在于ColorAction类中的ColorAction构造器中的putValue方法

    public ColorAction(String name, Icon icon, Color c)//javax.swing.AbstractAction.putValue(String key, Object newValue)
    { //构造coloraction的构造器
    putValue(Action.NAME, name);
    putValue(Action.SMALL_ICON, icon);
    putValue(Action.SHORT_DESCRIPTION, name + " background");
    putValue("Color", c);
    }

    2.在程序中通过add(bar, BorderLayout.NORTH);设置工具栏在面板中的布局为边框布局北位置,但是在拖动工具栏时,

    它的位置会发生变化,还可以将整个工具栏拖拽出面板(已解决)

          

     工具栏的特殊之处在于它可以被随处移动,可以将其拖拽至框架的四个边框上(如上图1)也可以完全脱离框架(如上图2),

    注意:工具栏只有位于采用边框布局或者支持NORTH,SOURTH,WEST,EAST,约束的布局管理器的容器中才能够被拖拽。

    测试程序3

    l 在elipse IDE中调试运行教材544页程序12-15、12-16,结合运行结果理解程序;

    l 掌握选项对话框的用法。

    l 记录示例代码阅读理解中存在的问题与疑惑。

     1 package optionDialog;
     2 
     3 import javax.swing.*;
     4 
     5 /**
     6  * A panel with radio buttons inside a titled border.
     7  */
     8 public class ButtonPanel extends JPanel
     9 {
    10    private ButtonGroup group;
    11 
    12    /**
    13     * Constructs a button panel.
    14     * @param title the title shown in the border
    15     * @param options an array of radio button labels
    16     */
    17    public ButtonPanel(String title, String... options)
    18    {
    19       setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), title));
    20       setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
    21       group = new ButtonGroup();
    22 
    23       // 为每个选项制作一个单选按钮
    24       for (String option : options)
    25       {
    26          JRadioButton b = new JRadioButton(option);
    27          b.setActionCommand(option);
    28          add(b);
    29          group.add(b);
    30          b.setSelected(option == options[0]);
    31       }
    32    }
    33 
    34    /**
    35     * Gets the currently selected option.
    36     * @return the label of the currently selected radio button.
    37     */
    38    public String getSelection()
    39    {
    40       return group.getSelection().getActionCommand();
    41    }
    42 }
    ButtonPanel
      1 package optionDialog;
      2 
      3 import java.awt.*;
      4 import java.awt.event.*;
      5 import java.awt.geom.*;
      6 import java.util.*;
      7 import javax.swing.*;
      8 
      9 /**
     10  * A frame that contains settings for selecting various option dialogs.
     11  */
     12 public class OptionDialogFrame extends JFrame
     13 {
     14    private ButtonPanel typePanel;
     15    private ButtonPanel messagePanel;
     16    private ButtonPanel messageTypePanel;
     17    private ButtonPanel optionTypePanel;
     18    private ButtonPanel optionsPanel;
     19    private ButtonPanel inputPanel;
     20    private String messageString = "Message";
     21    private Icon messageIcon = new ImageIcon("blue-ball.gif");
     22    private Object messageObject = new Date();
     23    private Component messageComponent = new SampleComponent();
     24 
     25    public OptionDialogFrame()
     26    {
     27       JPanel gridPanel = new JPanel();
     28       gridPanel.setLayout(new GridLayout(2, 3));
     29 
     30       typePanel = new ButtonPanel("Type", "Message", "Confirm", "Option", "Input");
     31       messageTypePanel = new ButtonPanel("Message Type", "ERROR_MESSAGE", "INFORMATION_MESSAGE",
     32             "WARNING_MESSAGE", "QUESTION_MESSAGE", "PLAIN_MESSAGE");
     33       messagePanel = new ButtonPanel("Message", "String", "Icon", "Component", "Other", 
     34             "Object[]");
     35       optionTypePanel = new ButtonPanel("Confirm", "DEFAULT_OPTION", "YES_NO_OPTION",
     36             "YES_NO_CANCEL_OPTION", "OK_CANCEL_OPTION");
     37       optionsPanel = new ButtonPanel("Option", "String[]", "Icon[]", "Object[]");
     38       inputPanel = new ButtonPanel("Input", "Text field", "Combo box");
     39 
     40       gridPanel.add(typePanel);
     41       gridPanel.add(messageTypePanel);
     42       gridPanel.add(messagePanel);
     43       gridPanel.add(optionTypePanel);
     44       gridPanel.add(optionsPanel);
     45       gridPanel.add(inputPanel);
     46 
     47       // 添加带有“显示”按钮的面板
     48 
     49       JPanel showPanel = new JPanel();
     50       JButton showButton = new JButton("Show");
     51       showButton.addActionListener(new ShowAction());
     52       showPanel.add(showButton);
     53 
     54       add(gridPanel, BorderLayout.CENTER);
     55       add(showPanel, BorderLayout.SOUTH);
     56       pack();
     57    }
     58 
     59    /**
     60     * Gets the currently selected message.
     61     * @return a string, icon, component, or object array, depending on the Message panel selection
     62     */
     63    public Object getMessage()
     64    {
     65       String s = messagePanel.getSelection();
     66       if (s.equals("String")) return messageString;
     67       else if (s.equals("Icon")) return messageIcon;
     68       else if (s.equals("Component")) return messageComponent;
     69       else if (s.equals("Object[]")) return new Object[] { messageString, messageIcon,
     70             messageComponent, messageObject };
     71       else if (s.equals("Other")) return messageObject;
     72       else return null;
     73    }
     74 
     75    /**
     76     * Gets the currently selected options.
     77     * @return an array of strings, icons, or objects, depending on the Option panel selection
     78     */
     79    public Object[] getOptions()
     80    {
     81       String s = optionsPanel.getSelection();
     82       if (s.equals("String[]")) return new String[] { "Yellow", "Blue", "Red" };
     83       else if (s.equals("Icon[]")) return new Icon[] { new ImageIcon("yellow-ball.gif"),
     84             new ImageIcon("blue-ball.gif"), new ImageIcon("red-ball.gif") };
     85       else if (s.equals("Object[]")) return new Object[] { messageString, messageIcon,
     86             messageComponent, messageObject };
     87       else return null;
     88    }
     89 
     90    /**
     91     * Gets the selected message or option type
     92     * @param panel the Message Type or Confirm panel
     93     * @return the selected XXX_MESSAGE or XXX_OPTION constant from the JOptionPane class
     94     */
     95    public int getType(ButtonPanel panel)
     96    {
     97       String s = panel.getSelection();
     98       try
     99       {
    100          return JOptionPane.class.getField(s).getInt(null);
    101       }
    102       catch (Exception e)
    103       {
    104          return -1;
    105       }
    106    }
    107 
    108    /**
    109     * The action listener for the Show button shows a Confirm, Input, Message, or Option dialog
    110     * depending on the Type panel selection.
    111     */
    112    private class ShowAction implements ActionListener
    113    {
    114       public void actionPerformed(ActionEvent event)
    115       {
    116          if (typePanel.getSelection().equals("Confirm")) JOptionPane.showConfirmDialog(
    117                OptionDialogFrame.this, getMessage(), "Title", getType(optionTypePanel),
    118                getType(messageTypePanel));
    119          else if (typePanel.getSelection().equals("Input"))
    120          {
    121             if (inputPanel.getSelection().equals("Text field")) JOptionPane.showInputDialog(
    122                   OptionDialogFrame.this, getMessage(), "Title", getType(messageTypePanel));
    123             else JOptionPane.showInputDialog(OptionDialogFrame.this, getMessage(), "Title",
    124                   getType(messageTypePanel), null, new String[] { "Yellow", "Blue", "Red" },
    125                   "Blue");
    126          }
    127          else if (typePanel.getSelection().equals("Message")) JOptionPane.showMessageDialog(
    128                OptionDialogFrame.this, getMessage(), "Title", getType(messageTypePanel));
    129          else if (typePanel.getSelection().equals("Option")) JOptionPane.showOptionDialog(
    130                OptionDialogFrame.this, getMessage(), "Title", getType(optionTypePanel),
    131                getType(messageTypePanel), null, getOptions(), getOptions()[0]);
    132       }
    133    }
    134 }
    135 
    136 /**
    137  * A component with a painted surface
    138  */
    139 
    140 class SampleComponent extends JComponent
    141 {
    142    public void paintComponent(Graphics g)
    143    {
    144       Graphics2D g2 = (Graphics2D) g;
    145       Rectangle2D rect = new Rectangle2D.Double(0, 0, getWidth() - 1, getHeight() - 1);
    146       g2.setPaint(Color.YELLOW);
    147       g2.fill(rect);
    148       g2.setPaint(Color.BLUE);
    149       g2.draw(rect);
    150    }
    151 
    152    public Dimension getPreferredSize()
    153    {
    154       return new Dimension(10, 10);
    155    }
    156 }
    OptionDialogFrame
     1 package optionDialog;
     2 
     3 import java.awt.*;
     4 import javax.swing.*;
     5 
     6 /**
     7  * @version 1.34 2015-06-12
     8  * @author Cay Horstmann
     9  */
    10 public class OptionDialogTest
    11 {
    12    public static void main(String[] args)
    13    {
    14       EventQueue.invokeLater(() -> {
    15          JFrame frame = new OptionDialogFrame();
    16          frame.setTitle("OptionDialogTest");
    17          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    18          frame.setVisible(true);
    19       });
    20    }
    21 }
    OptionDialogTest

    运行截图:

     

    测试程序4

    l 在elipse IDE中调试运行教材552页程序12-17、12-18,结合运行结果理解程序;

    l 掌握对话框的创建方法;

    l 记录示例代码阅读理解中存在的问题与疑惑。

     1 package dialog;
     2 
     3 import java.awt.BorderLayout;
     4 
     5 import javax.swing.JButton;
     6 import javax.swing.JDialog;
     7 import javax.swing.JFrame;
     8 import javax.swing.JLabel;
     9 import javax.swing.JPanel;
    10 
    11 /**
    12  * A sample modal dialog that displays a message and waits for the user to click the OK button.
    13  */
    14 public class AboutDialog extends JDialog
    15 {
    16    public AboutDialog(JFrame owner)
    17    {
    18       super(owner, "About DialogTest", true);
    19 
    20       // 将HTML标签添加到中心
    21 
    22       add(
    23             new JLabel(
    24                   "<html><h1><i>Core Java</i></h1><hr>By Cay Horstmann</html>"),
    25             BorderLayout.CENTER);
    26 
    27       // 确定按钮关闭对话框
    28 
    29       JButton ok = new JButton("OK");
    30       ok.addActionListener(event -> setVisible(false));
    31 
    32       // 将“确定”按钮添加到南部边界
    33 
    34       JPanel panel = new JPanel();
    35       panel.add(ok);
    36       add(panel, BorderLayout.SOUTH);
    37 
    38       pack();
    39    }
    40 }
    AboutDialog
     1 package dialog;
     2 
     3 import javax.swing.JFrame;
     4 import javax.swing.JMenu;
     5 import javax.swing.JMenuBar;
     6 import javax.swing.JMenuItem;
     7 
     8 /**
     9  * A frame with a menu whose File->About action shows a dialog.
    10  */
    11 public class DialogFrame extends JFrame
    12 {
    13    private static final int DEFAULT_WIDTH = 300;
    14    private static final int DEFAULT_HEIGHT = 200;
    15    private AboutDialog dialog;
    16 
    17    public DialogFrame()
    18    {
    19       setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
    20 
    21       // 构造一个文件菜单。
    22 
    23       JMenuBar menuBar = new JMenuBar();
    24       setJMenuBar(menuBar);
    25       JMenu fileMenu = new JMenu("File");
    26       menuBar.add(fileMenu);
    27 
    28       // 添加和退出菜单项。
    29 
    30       // About项显示About对话框。
    31 
    32       JMenuItem aboutItem = new JMenuItem("About");
    33       aboutItem.addActionListener(event -> {
    34          if (dialog == null) // first time
    35             dialog = new AboutDialog(DialogFrame.this);
    36          dialog.setVisible(true); // pop up dialog
    37       });
    38       fileMenu.add(aboutItem);
    39 
    40       // 退出项退出程序。
    41 
    42       JMenuItem exitItem = new JMenuItem("Exit");
    43       exitItem.addActionListener(event -> System.exit(0));
    44       fileMenu.add(exitItem);
    45    }
    46 }
    DialogFrame
     1 package dialog;
     2 
     3 import java.awt.*;
     4 import javax.swing.*;
     5 
     6 /**
     7  * @version 1.34 2012-06-12
     8  * @author Cay Horstmann
     9  */
    10 public class DialogTest
    11 {
    12    public static void main(String[] args)
    13    {
    14       EventQueue.invokeLater(() -> {
    15          JFrame frame = new DialogFrame();
    16          frame.setTitle("DialogTest");
    17          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    18          frame.setVisible(true);
    19       });
    20    }
    21 }
    DialogTest

    运行截图:

    测试程序5

    l 在elipse IDE中调试运行教材556页程序12-19、12-20,结合运行结果理解程序;

    l 掌握对话框的数据交换用法;

    l 记录示例代码阅读理解中存在的问题与疑惑。

     1 package dataExchange;
     2 
     3 import java.awt.*;
     4 import java.awt.event.*;
     5 import javax.swing.*;
     6 
     7 /**
     8  * A frame with a menu whose File->Connect action shows a password dialog.
     9  */
    10 public class DataExchangeFrame extends JFrame
    11 {
    12    public static final int TEXT_ROWS = 20;
    13    public static final int TEXT_COLUMNS = 40;
    14    private PasswordChooser dialog = null;
    15    private JTextArea textArea;
    16 
    17    public DataExchangeFrame()
    18    {
    19       // 构造文件菜单
    20 
    21       JMenuBar mbar = new JMenuBar();
    22       setJMenuBar(mbar);
    23       JMenu fileMenu = new JMenu("File");
    24       mbar.add(fileMenu);
    25 
    26       // 添加连接和退出菜单项
    27 
    28       JMenuItem connectItem = new JMenuItem("Connect");
    29       connectItem.addActionListener(new ConnectAction());
    30       fileMenu.add(connectItem);
    31 
    32       // 退出项退出程序
    33 
    34       JMenuItem exitItem = new JMenuItem("Exit");
    35       exitItem.addActionListener(event -> System.exit(0));
    36       fileMenu.add(exitItem);
    37 
    38       textArea = new JTextArea(TEXT_ROWS, TEXT_COLUMNS);
    39       add(new JScrollPane(textArea), BorderLayout.CENTER);
    40       pack();
    41    }
    42 
    43    /**
    44     * The Connect action pops up the password dialog.
    45     */
    46    private class ConnectAction implements ActionListener
    47    {
    48       public void actionPerformed(ActionEvent event)
    49       {
    50          // 如果是第一次,则构造对话框
    51 
    52          if (dialog == null) dialog = new PasswordChooser();
    53 
    54          // 设置默认值
    55          dialog.setUser(new User("yourname", null));
    56 
    57          // pop up dialog
    58          if (dialog.showDialog(DataExchangeFrame.this, "Connect"))
    59          {
    60             // 如果接受,则检索用户输入
    61             User u = dialog.getUser();
    62             textArea.append("user name = " + u.getName() + ", password = "
    63                   + (new String(u.getPassword())) + "
    ");
    64          }
    65       }
    66    }
    67 }
    DataExchangeFrame
     1 package dataExchange;
     2 
     3 import java.awt.*;
     4 import javax.swing.*;
     5 
     6 /**
     7  * @version 1.34 2015-06-12
     8  * @author Cay Horstmann
     9  */
    10 public class DataExchangeTest
    11 {
    12    public static void main(String[] args)
    13    {
    14       EventQueue.invokeLater(() -> {
    15          JFrame frame = new DataExchangeFrame();
    16          frame.setTitle("DataExchangeTest");
    17          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    18          frame.setVisible(true);
    19       });
    20    }
    21 }
    DataExchangeTest
      1 package dataExchange;
      2 
      3 import java.awt.BorderLayout;
      4 import java.awt.Component;
      5 import java.awt.Frame;
      6 import java.awt.GridLayout;
      7 
      8 import javax.swing.JButton;
      9 import javax.swing.JDialog;
     10 import javax.swing.JLabel;
     11 import javax.swing.JPanel;
     12 import javax.swing.JPasswordField;
     13 import javax.swing.JTextField;
     14 import javax.swing.SwingUtilities;
     15 
     16 /**
     17  * A password chooser that is shown inside a dialog
     18  */
     19 public class PasswordChooser extends JPanel
     20 {
     21    private JTextField username;
     22    private JPasswordField password;
     23    private JButton okButton;
     24    private boolean ok;
     25    private JDialog dialog;
     26 
     27    public PasswordChooser()
     28    {
     29       setLayout(new BorderLayout());
     30 
     31       // 使用用户名和密码字段构造面板
     32 
     33       JPanel panel = new JPanel();
     34       panel.setLayout(new GridLayout(2, 2));
     35       panel.add(new JLabel("User name:"));
     36       panel.add(username = new JTextField(""));
     37       panel.add(new JLabel("Password:"));
     38       panel.add(password = new JPasswordField(""));
     39       add(panel, BorderLayout.CENTER);
     40 
     41       // 创建终止对话框的“确定”和“取消”按钮
     42 
     43       okButton = new JButton("Ok");
     44       okButton.addActionListener(event -> {
     45          ok = true;
     46          dialog.setVisible(false);
     47       });
     48 
     49       JButton cancelButton = new JButton("Cancel");
     50       cancelButton.addActionListener(event -> dialog.setVisible(false));
     51 
     52       // 将按钮添加到南边界
     53 
     54       JPanel buttonPanel = new JPanel();
     55       buttonPanel.add(okButton);
     56       buttonPanel.add(cancelButton);
     57       add(buttonPanel, BorderLayout.SOUTH);
     58    }
     59 
     60    /**
     61     * Sets the dialog defaults.
     62     * @param u the default user information
     63     */
     64    public void setUser(User u)
     65    {
     66       username.setText(u.getName());
     67    }
     68 
     69    /**
     70     * Gets the dialog entries.
     71     * @return a User object whose state represents the dialog entries
     72     */
     73    public User getUser()
     74    {
     75       return new User(username.getText(), password.getPassword());
     76    }
     77 
     78    /**
     79     * Show the chooser panel in a dialog
     80     * @param parent a component in the owner frame or null
     81     * @param title the dialog window title
     82     */
     83    public boolean showDialog(Component parent, String title)
     84    {
     85       ok = false;
     86 
     87       // locate the owner frame
     88 
     89       Frame owner = null;
     90       if (parent instanceof Frame)
     91          owner = (Frame) parent;
     92       else
     93          owner = (Frame) SwingUtilities.getAncestorOfClass(Frame.class, parent);
     94 
     95       // if first time, or if owner has changed, make new dialog
     96 
     97       if (dialog == null || dialog.getOwner() != owner)
     98       {
     99          dialog = new JDialog(owner, true);
    100          dialog.add(this);
    101          dialog.getRootPane().setDefaultButton(okButton);
    102          dialog.pack();
    103       }
    104 
    105       // set title and show dialog
    106 
    107       dialog.setTitle(title);
    108       dialog.setVisible(true);
    109       return ok;
    110    }
    111 }
    PasswordChooser
     1 package dataExchange;
     2 
     3 /**
     4  * A user has a name and password. For security reasons, the password is stored as a char[], not a
     5  * String.
     6  */
     7 public class User
     8 {
     9    private String name;
    10    private char[] password;
    11 
    12    public User(String aName, char[] aPassword)
    13    {
    14       name = aName;
    15       password = aPassword;
    16    }
    17 
    18    public String getName()
    19    {
    20       return name;
    21    }
    22 
    23    public char[] getPassword()
    24    {
    25       return password;
    26    }
    27 
    28    public void setName(String aName)
    29    {
    30       name = aName;
    31    }
    32 
    33    public void setPassword(char[] aPassword)
    34    {
    35       password = aPassword;
    36    }
    37 }
    User

    运行截图:

      

     

    测试程序6

    l 在elipse IDE中调试运行教材556页程序12-21、12-22、12-23,结合程序运行结果理解程序;

    l 掌握文件对话框的用法;

    l 记录示例代码阅读理解中存在的问题与疑惑。

     1 package fileChooser;
     2 
     3 import java.awt.*;
     4 import javax.swing.*;
     5 
     6 /**
     7  * @version 1.25 2015-06-12
     8  * @author Cay Horstmann
     9  */
    10 public class FileChooserTest
    11 {
    12    public static void main(String[] args)
    13    {
    14       EventQueue.invokeLater(() -> {
    15          JFrame frame = new ImageViewerFrame();
    16          frame.setTitle("FileChooserTest");
    17          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    18          frame.setVisible(true);
    19       });
    20    }
    21 }
    FileChooserTest
     1 package fileChooser;
     2 
     3 import java.io.*;
     4 import javax.swing.*;
     5 import javax.swing.filechooser.*;
     6 import javax.swing.filechooser.FileFilter;
     7 
     8 /**
     9  * A file view that displays an icon for all files that match a file filter.
    10  */
    11 public class FileIconView extends FileView
    12 {
    13    private FileFilter filter;
    14    private Icon icon;
    15 
    16    /**
    17     * Constructs a FileIconView.
    18     * @param aFilter a file filter--all files that this filter accepts will be shown 
    19     * with the icon.
    20     * @param anIcon--the icon shown with all accepted files.
    21     */
    22    public FileIconView(FileFilter aFilter, Icon anIcon)
    23    {
    24       filter = aFilter;
    25       icon = anIcon;
    26    }
    27 
    28    public Icon getIcon(File f)
    29    {
    30       if (!f.isDirectory() && filter.accept(f)) return icon;
    31       else return null;
    32    }
    33 }
    FileIconView
     1 package fileChooser;
     2 
     3 import java.io.*;
     4 
     5 import javax.swing.*;
     6 import javax.swing.filechooser.*;
     7 import javax.swing.filechooser.FileFilter;
     8 
     9 /**
    10  * A frame that has a menu for loading an image and a display area for the
    11  * loaded image.
    12  */
    13 public class ImageViewerFrame extends JFrame
    14 {
    15    private static final int DEFAULT_WIDTH = 300;
    16    private static final int DEFAULT_HEIGHT = 400;
    17    private JLabel label;
    18    private JFileChooser chooser;
    19 
    20    public ImageViewerFrame()
    21    {
    22       setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
    23 
    24       // set up menu bar
    25       JMenuBar menuBar = new JMenuBar();
    26       setJMenuBar(menuBar);
    27 
    28       JMenu menu = new JMenu("File");
    29       menuBar.add(menu);
    30 
    31       JMenuItem openItem = new JMenuItem("Open");
    32       menu.add(openItem);
    33       openItem.addActionListener(event -> {
    34          chooser.setCurrentDirectory(new File("."));
    35 
    36          // 显示文件选择器对话框
    37             int result = chooser.showOpenDialog(ImageViewerFrame.this);
    38 
    39             // 如果接受图像文件,请将其设置为标签的图标
    40             if (result == JFileChooser.APPROVE_OPTION)
    41             {
    42                String name = chooser.getSelectedFile().getPath();
    43                label.setIcon(new ImageIcon(name));
    44                pack();
    45             }
    46          });
    47 
    48       JMenuItem exitItem = new JMenuItem("Exit");
    49       menu.add(exitItem);
    50       exitItem.addActionListener(event -> System.exit(0));
    51 
    52       // 使用标签显示图像
    53       label = new JLabel();
    54       add(label);
    55 
    56       // set up file chooser
    57       chooser = new JFileChooser();
    58 
    59       // 接受所有以.jpg、.jpeg、.gif结尾的图像文件
    60       FileFilter filter = new FileNameExtensionFilter(
    61             "Image files", "jpg", "jpeg", "gif");
    62       chooser.setFileFilter(filter);
    63 
    64       chooser.setAccessory(new ImagePreviewer(chooser));
    65 
    66       chooser.setFileView(new FileIconView(filter, new ImageIcon("palette.gif")));
    67    }
    68 }
    ImageViewerFrame
     1 package fileChooser;
     2 
     3 import java.awt.*;
     4 import java.io.*;
     5 
     6 import javax.swing.*;
     7 
     8 /**
     9  * A file chooser accessory that previews images.
    10  */
    11 public class ImagePreviewer extends JLabel
    12 {
    13    /**
    14     * Constructs an ImagePreviewer.
    15     * @param chooser the file chooser whose property changes trigger an image
    16     *        change in this previewer
    17     */
    18    public ImagePreviewer(JFileChooser chooser)
    19    {
    20       setPreferredSize(new Dimension(100, 100));
    21       setBorder(BorderFactory.createEtchedBorder());
    22 
    23       chooser.addPropertyChangeListener(event -> {
    24          if (event.getPropertyName() == JFileChooser.SELECTED_FILE_CHANGED_PROPERTY)
    25          {
    26             // the user has selected a new file
    27             File f = (File) event.getNewValue();
    28             if (f == null)
    29             {
    30                setIcon(null);
    31                return;
    32             }
    33 
    34             // 将图像读入图标
    35             ImageIcon icon = new ImageIcon(f.getPath());
    36 
    37             // 如果图标太大而无法容纳,请缩放它
    38             if (icon.getIconWidth() > getWidth())
    39                icon = new ImageIcon(icon.getImage().getScaledInstance(
    40                      getWidth(), -1, Image.SCALE_DEFAULT));
    41 
    42             setIcon(icon);
    43          }
    44       });
    45    }
    46 }
    ImagePreviewer

    运行截图:

      

      

    测试程序7

    l 在elipse IDE中调试运行教材570页程序12-24,结合运行结果理解程序;

    l 了解颜色选择器的用法。

    记录示例代码阅读理解中存在的问题与疑惑。

     1 package colorChooser;
     2 
     3 import javax.swing.*;
     4 
     5 /**
     6  * A frame with a color chooser panel
     7  */
     8 public class ColorChooserFrame extends JFrame
     9 {
    10    private static final int DEFAULT_WIDTH = 300;
    11    private static final int DEFAULT_HEIGHT = 200;
    12 
    13    public ColorChooserFrame()
    14    {      
    15       setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
    16 
    17       // 将颜色选择器面板添加到帧
    18 
    19       ColorChooserPanel panel = new ColorChooserPanel();
    20       add(panel);
    21    }
    22 }
    ColorChooserFrame
     1 package colorChooser;
     2 
     3 import java.awt.Color;
     4 import java.awt.Frame;
     5 import java.awt.event.ActionEvent;
     6 import java.awt.event.ActionListener;
     7 
     8 import javax.swing.JButton;
     9 import javax.swing.JColorChooser;
    10 import javax.swing.JDialog;
    11 import javax.swing.JPanel;
    12 
    13 /**
    14  * A panel with buttons to pop up three types of color choosers
    15  */
    16 public class ColorChooserPanel extends JPanel
    17 {
    18    public ColorChooserPanel()
    19    {
    20       JButton modalButton = new JButton("Modal");
    21       modalButton.addActionListener(new ModalListener());
    22       add(modalButton);
    23 
    24       JButton modelessButton = new JButton("Modeless");
    25       modelessButton.addActionListener(new ModelessListener());
    26       add(modelessButton);
    27 
    28       JButton immediateButton = new JButton("Immediate");
    29       immediateButton.addActionListener(new ImmediateListener());
    30       add(immediateButton);
    31    }
    32 
    33    /**
    34     * This listener pops up a modal color chooser
    35     */
    36    private class ModalListener implements ActionListener
    37    {
    38       public void actionPerformed(ActionEvent event)
    39       {
    40          Color defaultColor = getBackground();
    41          Color selected = JColorChooser.showDialog(ColorChooserPanel.this, "Set background",
    42                defaultColor);
    43          if (selected != null) setBackground(selected);
    44       }
    45    }
    46 
    47    /**
    48     * This listener pops up a modeless color chooser. The panel color is changed when the user
    49     * clicks the OK button.
    50     */
    51    private class ModelessListener implements ActionListener
    52    {
    53       private JDialog dialog;
    54       private JColorChooser chooser;
    55 
    56       public ModelessListener()
    57       {
    58          chooser = new JColorChooser();
    59          dialog = JColorChooser.createDialog(ColorChooserPanel.this, "Background Color",
    60                false /* not modal */, chooser, 
    61                event -> setBackground(chooser.getColor()), 
    62                null /* no Cancel button listener */);
    63       }
    64 
    65       public void actionPerformed(ActionEvent event)
    66       {
    67          chooser.setColor(getBackground());
    68          dialog.setVisible(true);
    69       }
    70    }
    71 
    72    /**
    73     * This listener pops up a modeless color chooser. The panel color is changed immediately when
    74     * the user picks a new color.
    75     */
    76    private class ImmediateListener implements ActionListener
    77    {
    78       private JDialog dialog;
    79       private JColorChooser chooser;
    80 
    81       public ImmediateListener()
    82       {
    83          chooser = new JColorChooser();
    84          chooser.getSelectionModel().addChangeListener(
    85                event -> setBackground(chooser.getColor()));
    86 
    87          dialog = new JDialog((Frame) null, false /* not modal */);
    88          dialog.add(chooser);
    89          dialog.pack();
    90       }
    91 
    92       public void actionPerformed(ActionEvent event)
    93       {
    94          chooser.setColor(getBackground());
    95          dialog.setVisible(true);
    96       }
    97    }
    98 }
    ColorChooserPanel
     1 package colorChooser;
     2 
     3 import java.awt.*;
     4 import javax.swing.*;
     5 
     6 /**
     7  * @version 1.04 2015-06-12
     8  * @author Cay Horstmann
     9  */
    10 public class ColorChooserTest
    11 {
    12    public static void main(String[] args)
    13    {
    14       EventQueue.invokeLater(() -> {
    15          JFrame frame = new ColorChooserFrame();
    16          frame.setTitle("ColorChooserTest");
    17          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    18          frame.setVisible(true);
    19       });
    20    }
    21 }
    ColorChooserTest

    运行截图:

      

      

    第三部分:实验心得

     

          这一周继续学习了Swing用户界面组件以及GUI相关组件。在学习过程中,知识内容较多,也比较庞杂,自己对理论知识的学习也学的比较混乱,混淆了这几部分的学习内容,实验都有很多相同和类似的地方,在实验过程中任然没有理解的太清楚。在查了课本上的内容之后,稍微有了掌握。在运行程序过程中,对程序中有的代码还是不能理解,通过查书、上网查找才得以理解的同时也希望老师可以讲解一下。

     
  • 相关阅读:
    在生成安装和部署项目时出现“Unrecoverable Build Error”(不可恢复的生成错误)错误信息
    SqlHelper(带详细中文注释)
    原创企业级控件库之大数据量分页控件
    MSSql技巧之快速得到表的记录总数
    ASP.NET 程序中常用的三十三种代码
    团队项目开发"编码规范"系列文章
    信息系统项目管理系列之二:项目生命期和组织
    原创企业级控件库之组合查询控件
    C# 中的常用正则表达式总结
    asp.net页面生存周期
  • 原文地址:https://www.cnblogs.com/JerryLau-213/p/12004960.html
Copyright © 2020-2023  润新知