第十四周作业

本人学号:201771010138

姓名:邹丰蔚

面向对象程序设计java十四周学习总结

1、实验目的与要求

(1) 掌握GUI布局管理器用法;

(2) 掌握各类Java Swing组件用途及常用API;

2、实验内容和步骤

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

测试程序1

elipse IDE中运行教材479页程序12-1,结合运行结果理解程序;

掌握各种布局管理器的用法;

理解GUI界面中事件处理技术的用途。

在布局管理应用代码处添加注释;

Calculator:

package calculator;

 

import java.awt.*;

import javax.swing.*;

 

/**

 * @version 1.34 2015-06-12

 * @author Cay Horstmann

 */

public class Calculator

{

   public static void main(String[] args)

   {

      EventQueue.invokeLater(() -> {

         CalculatorFrame frame = new CalculatorFrame();

         frame.setTitle("Calculator");

         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

         frame.setVisible(true);

      });

   }

}

 

CalculatorFrame:

package calculator;

 

import javax.swing.*;

 

/**

 * A frame with a calculator panel.

 */

public class CalculatorFrame extends JFrame

{

   public CalculatorFrame()

   {

      add(new CalculatorPanel());

      pack();

   }

}

 

CalculatorPanel:

package calculator;

 

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

 

/**

 * A panel with calculator buttons and a result display.

 */

public class CalculatorPanel extends JPanel

{

   private JButton display;

   private JPanel panel;

   private double result;

   private String lastCommand;

   private boolean start;

 

   public CalculatorPanel()

   {

      setLayout(new BorderLayout());

 

      result = 0;

      lastCommand = "=";

      start = true;

 

      // add the display

 

      display = new JButton("0");

      display.setEnabled(false);

      add(display, BorderLayout.NORTH);

 

      ActionListener insert = new InsertAction();

      ActionListener command = new CommandAction();

 

      // add the buttons in a 4 x 4 grid

 

      panel = new JPanel();

      panel.setLayout(new GridLayout(4, 4));

 

      addButton("7", insert);

      addButton("8", insert);

      addButton("9", insert);

      addButton("/", command);

 

      addButton("4", insert);

      addButton("5", insert);

      addButton("6", insert);

      addButton("*", command);

 

      addButton("1", insert);

      addButton("2", insert);

      addButton("3", insert);

      addButton("-", command);

 

      addButton("0", insert);

      addButton(".", insert);

      addButton("=", command);

      addButton("+", command);

 

      add(panel, BorderLayout.CENTER);

   }

 

   /**

    * Adds a button to the center panel.

    * @param label the button label

    * @param listener the button listener

    */

   private void addButton(String label, ActionListener listener)

   {

      JButton button = new JButton(label);

      button.addActionListener(listener);

      panel.add(button);

   }

 

   /**

    * This action inserts the button action string to the end of the display text.

    */

   private class InsertAction implements ActionListener

   {

      public void actionPerformed(ActionEvent event)

      {

         String input = event.getActionCommand();

         if (start)

         {

            display.setText("");

            start = false;

         }

         display.setText(display.getText() + input);

      }

   }

 

   /**

    * This action executes the command that the button action string denotes.

    */

   private class CommandAction implements ActionListener

   {

      public void actionPerformed(ActionEvent event)

      {

         String command = event.getActionCommand();

 

         if (start)

         {

            if (command.equals("-"))

            {

               display.setText(command);

               start = false;

            }

            else lastCommand = command;

         }

         else

         {

            calculate(Double.parseDouble(display.getText()));

            lastCommand = command;

            start = true;

         }

      }

   }

 

   /**

    * Carries out the pending calculation.

    * @param x the value to be accumulated with the prior result.

    */

   public void calculate(double x)

   {

      if (lastCommand.equals("+")) result += x;

      else if (lastCommand.equals("-")) result -= x;

      else if (lastCommand.equals("*")) result *= x;

      else if (lastCommand.equals("/")) result /= x;

      else if (lastCommand.equals("=")) result = x;

      display.setText("" + result);

   }

}

得出结果:

 

测试程序2

elipse IDE中调试运行教材486页程序12-2,结合运行结果理解程序;

掌握各种文本组件的用法;

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

TextComponentTest:

package text;

 

import java.awt.*;

import javax.swing.*;

 

/**

 * @version 1.41 2015-06-12

 * @author Cay Horstmann

 */

public class TextComponentTest

{

   public static void main(String[] args)

   {

      EventQueue.invokeLater(() -> {

         JFrame frame = new TextComponentFrame();

         frame.setTitle("TextComponentTest");

         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

         frame.setVisible(true);

      });

   }

}

TextComponentFrame:

package text;

 

import java.awt.BorderLayout;

import java.awt.GridLayout;

 

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.JPasswordField;

import javax.swing.JScrollPane;

import javax.swing.JTextArea;

import javax.swing.JTextField;

import javax.swing.SwingConstants;

 

/**

 * A frame with sample text components.

 */

public class TextComponentFrame extends JFrame

{

   public static final int TEXTAREA_ROWS = 8;

   public static final int TEXTAREA_COLUMNS = 20;

 

   public TextComponentFrame()

   {

      JTextField textField = new JTextField();

      JPasswordField passwordField = new JPasswordField();

 

      JPanel northPanel = new JPanel();

      northPanel.setLayout(new GridLayout(2, 2));

      northPanel.add(new JLabel("User name: ", SwingConstants.RIGHT));

      northPanel.add(textField);

      northPanel.add(new JLabel("Password: ", SwingConstants.RIGHT));

      northPanel.add(passwordField);

 

      add(northPanel, BorderLayout.NORTH);

 

      JTextArea textArea = new JTextArea(TEXTAREA_ROWS, TEXTAREA_COLUMNS);

      JScrollPane scrollPane = new JScrollPane(textArea);

 

      add(scrollPane, BorderLayout.CENTER);

 

      // add button to append text into the text area

 

      JPanel southPanel = new JPanel();

 

      JButton insertButton = new JButton("Insert");

      southPanel.add(insertButton);

      insertButton.addActionListener(event ->

         textArea.append("User name: " + textField.getText() + " Password: "

            + new String(passwordField.getPassword()) + "\n"));

 

      add(southPanel, BorderLayout.SOUTH);

      pack();

   }

}

得出结果:

 

测试程序3

elipse IDE中调试运行教材489页程序12-3,结合运行结果理解程序;

掌握复选框组件的用法;

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

CheckBoxTest:

package checkBox;

 

import java.awt.*;

import javax.swing.*;

 

/**

 * @version 1.34 2015-06-12

 * @author Cay Horstmann

 */

public class CheckBoxTest

{

   public static void main(String[] args)

   {

      EventQueue.invokeLater(() -> {

         JFrame frame = new CheckBoxFrame();

         frame.setTitle("CheckBoxTest");

         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

         frame.setVisible(true);

      });

   }

}

 

CheckBoxFrame:

package checkBox;

 

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

 

/**

 * A frame with a sample text label and check boxes for selecting font

 * attributes.

 */

public class CheckBoxFrame extends JFrame

{

   private JLabel label;

   private JCheckBox bold;

   private JCheckBox italic;

   private static final int FONTSIZE = 24;

 

   public CheckBoxFrame()

   {

      // add the sample text label

 

      label = new JLabel("The quick brown fox jumps over the lazy dog.");

      label.setFont(new Font("Serif", Font.BOLD, FONTSIZE));

      add(label, BorderLayout.CENTER);

 

      // this listener sets the font attribute of

      // the label to the check box state

 

      ActionListener listener = event -> {

         int mode = 0;

         if (bold.isSelected()) mode += Font.BOLD;

         if (italic.isSelected()) mode += Font.ITALIC;

         label.setFont(new Font("Serif", mode, FONTSIZE));

      };

 

      // add the check boxes

 

      JPanel buttonPanel = new JPanel();

 

      bold = new JCheckBox("Bold");

      bold.addActionListener(listener);

      bold.setSelected(true);

      buttonPanel.add(bold);

 

      italic = new JCheckBox("Italic");

      italic.addActionListener(listener);

      buttonPanel.add(italic);

 

      add(buttonPanel, BorderLayout.SOUTH);

      pack();

   }

}

得出结果:

 

测试程序4

elipse IDE中调试运行教材491页程序12-4,运行结果理解程序;

掌握单选按钮组件的用法;

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

RadioButtonTest:

package radioButton;

 

import java.awt.*;

import javax.swing.*;

 

/**

 * @version 1.34 2015-06-12

 * @author Cay Horstmann

 */

public class RadioButtonTest

{

   public static void main(String[] args)

   {

      EventQueue.invokeLater(() -> {

         JFrame frame = new RadioButtonFrame();

         frame.setTitle("RadioButtonTest");

         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

         frame.setVisible(true);

      });

   }

}

RadioButtonFrame:

package radioButton;

 

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

 

/**

 * A frame with a sample text label and radio buttons for selecting font sizes.

 */

public class RadioButtonFrame extends JFrame

{

   private JPanel buttonPanel;

   private ButtonGroup group;

   private JLabel label;

   private static final int DEFAULT_SIZE = 36;

 

   public RadioButtonFrame()

   {      

      // add the sample text label

 

      label = new JLabel("The quick brown fox jumps over the lazy dog.");

      label.setFont(new Font("Serif", Font.PLAIN, DEFAULT_SIZE));

      add(label, BorderLayout.CENTER);

 

      // add the radio buttons

 

      buttonPanel = new JPanel();

      group = new ButtonGroup();

 

      addRadioButton("Small", 8);

      addRadioButton("Medium", 12);

      addRadioButton("Large", 18);

      addRadioButton("Extra large", 36);

 

      add(buttonPanel, BorderLayout.SOUTH);

      pack();

   }

 

   /**

    * Adds a radio button that sets the font size of the sample text.

    * @param name the string to appear on the button

    * @param size the font size that this button sets

    */

   public void addRadioButton(String name, int size)

   {

      boolean selected = size == DEFAULT_SIZE;

      JRadioButton button = new JRadioButton(name, selected);

      group.add(button);

      buttonPanel.add(button);

 

      // this listener sets the label font size

 

      ActionListener listener = event -> label.setFont(new Font("Serif", Font.PLAIN, size));

 

      button.addActionListener(listener);

   }

}

得出结果:

 

测试程序5

elipse IDE中调试运行教材494页程序12-5,结合运行结果理解程序;

掌握边框的用法;

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

BorderTest:

package border;

 

import java.awt.*;

import javax.swing.*;

 

/**

 * @version 1.34 2015-06-13

 * @author Cay Horstmann

 */

public class BorderTest

{

   public static void main(String[] args)

   {

      EventQueue.invokeLater(() -> {

         JFrame frame = new BorderFrame();

         frame.setTitle("BorderTest");

         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

         frame.setVisible(true);

      });

   }

}

 

BorderFrame:

package border;

 

import java.awt.*;

import javax.swing.*;

import javax.swing.border.*;

 

/**

 * A frame with radio buttons to pick a border style.

 */

public class BorderFrame extends JFrame

{

   private JPanel demoPanel;

   private JPanel buttonPanel;

   private ButtonGroup group;

 

   public BorderFrame()

   {

      demoPanel = new JPanel();

      buttonPanel = new JPanel();

      group = new ButtonGroup();

 

      addRadioButton("Lowered bevel", BorderFactory.createLoweredBevelBorder());

      addRadioButton("Raised bevel", BorderFactory.createRaisedBevelBorder());

      addRadioButton("Etched", BorderFactory.createEtchedBorder());

      addRadioButton("Line", BorderFactory.createLineBorder(Color.BLUE));

      addRadioButton("Matte", BorderFactory.createMatteBorder(10, 10, 10, 10, Color.BLUE));

      addRadioButton("Empty", BorderFactory.createEmptyBorder());

 

      Border etched = BorderFactory.createEtchedBorder();

      Border titled = BorderFactory.createTitledBorder(etched, "Border types");

      buttonPanel.setBorder(titled);

 

      setLayout(new GridLayout(2, 1));

      add(buttonPanel);

      add(demoPanel);

      pack();

   }

 

   public void addRadioButton(String buttonName, Border b)

   {

      JRadioButton button = new JRadioButton(buttonName);

      button.addActionListener(event -> demoPanel.setBorder(b));

      group.add(button);

      buttonPanel.add(button);

   }

}

 

得出结果:

 

测试程序6

elipse IDE中调试运行教材498页程序12-6,结合运行结果理解程序;

掌握组合框组件的用法;

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

ComboBoxTest:

package comboBox;

 

import java.awt.*;

import javax.swing.*;

 

/**

 * @version 1.35 2015-06-12

 * @author Cay Horstmann

 */

public class ComboBoxTest

{

   public static void main(String[] args)

   {

      EventQueue.invokeLater(() -> {

         JFrame frame = new ComboBoxFrame();

         frame.setTitle("ComboBoxTest");

         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

         frame.setVisible(true);

      });

   }

}

ComboBoxFrame:

package comboBox;

 

import java.awt.BorderLayout;

import java.awt.Font;

 

import javax.swing.JComboBox;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

 

/**

 * A frame with a sample text label and a combo box for selecting font faces.

 */

public class ComboBoxFrame extends JFrame

{

   private JComboBox<String> faceCombo;

   private JLabel label;

   private static final int DEFAULT_SIZE = 24;

 

   public ComboBoxFrame()

   {

      // add the sample text label

 

      label = new JLabel("The quick brown fox jumps over the lazy dog.");

      label.setFont(new Font("Serif", Font.PLAIN, DEFAULT_SIZE));

      add(label, BorderLayout.CENTER);

 

      // make a combo box and add face names

 

      faceCombo = new JComboBox<>();

      faceCombo.addItem("Serif");

      faceCombo.addItem("SansSerif");

      faceCombo.addItem("Monospaced");

      faceCombo.addItem("Dialog");

      faceCombo.addItem("DialogInput");

 

      // the combo box listener changes the label font to the selected face name

 

      faceCombo.addActionListener(event ->

         label.setFont(

            new Font(faceCombo.getItemAt(faceCombo.getSelectedIndex()),

               Font.PLAIN, DEFAULT_SIZE)));

 

      // add combo box to a panel at the frame's southern border

 

      JPanel comboPanel = new JPanel();

      comboPanel.add(faceCombo);

      add(comboPanel, BorderLayout.SOUTH);

      pack();

   }

}

得出结果:

 

测试程序7

elipse IDE中调试运行教材501页程序12-7,结合运行结果理解程序;

掌握滑动条组件的用法;

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

SliderTest:

package slider;

 

import java.awt.*;

import javax.swing.*;

 

/**

 * @version 1.15 2015-06-12

 * @author Cay Horstmann

 */

public class SliderTest

{

   public static void main(String[] args)

   {

      EventQueue.invokeLater(() -> {

         SliderFrame frame = new SliderFrame();

         frame.setTitle("SliderTest");

         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

         frame.setVisible(true);

      });

   }

}

SliderFrame:

package slider;

 

import java.awt.*;

import java.util.*;

import javax.swing.*;

import javax.swing.event.*;

 

/**

 * A frame with many sliders and a text field to show slider values.

 */

public class SliderFrame extends JFrame

{

   private JPanel sliderPanel;

   private JTextField textField;

   private ChangeListener listener;

 

   public SliderFrame()

   {

      sliderPanel = new JPanel();

      sliderPanel.setLayout(new GridBagLayout());

 

      // common listener for all sliders

      listener = event -> {

         // update text field when the slider value changes

         JSlider source = (JSlider) event.getSource();

         textField.setText("" + source.getValue());

      };

 

      // add a plain slider

 

      JSlider slider = new JSlider();

      addSlider(slider, "Plain");

 

      // add a slider with major and minor ticks

 

      slider = new JSlider();

      slider.setPaintTicks(true);

      slider.setMajorTickSpacing(20);

      slider.setMinorTickSpacing(5);

      addSlider(slider, "Ticks");

 

      // add a slider that snaps to ticks

 

      slider = new JSlider();

      slider.setPaintTicks(true);

      slider.setSnapToTicks(true);

      slider.setMajorTickSpacing(20);

      slider.setMinorTickSpacing(5);

      addSlider(slider, "Snap to ticks");

 

      // add a slider with no track

 

      slider = new JSlider();

      slider.setPaintTicks(true);

      slider.setMajorTickSpacing(20);

      slider.setMinorTickSpacing(5);

      slider.setPaintTrack(false);

      addSlider(slider, "No track");

 

      // add an inverted slider

 

      slider = new JSlider();

      slider.setPaintTicks(true);

      slider.setMajorTickSpacing(20);

      slider.setMinorTickSpacing(5);

      slider.setInverted(true);

      addSlider(slider, "Inverted");

 

      // add a slider with numeric labels

 

      slider = new JSlider();

      slider.setPaintTicks(true);

      slider.setPaintLabels(true);

      slider.setMajorTickSpacing(20);

      slider.setMinorTickSpacing(5);

      addSlider(slider, "Labels");

 

      // add a slider with alphabetic labels

 

      slider = new JSlider();

      slider.setPaintLabels(true);

      slider.setPaintTicks(true);

      slider.setMajorTickSpacing(20);

      slider.setMinorTickSpacing(5);

 

      Dictionary<Integer, Component> labelTable = new Hashtable<>();

      labelTable.put(0, new JLabel("A"));

      labelTable.put(20, new JLabel("B"));

      labelTable.put(40, new JLabel("C"));

      labelTable.put(60, new JLabel("D"));

      labelTable.put(80, new JLabel("E"));

      labelTable.put(100, new JLabel("F"));

 

      slider.setLabelTable(labelTable);

      addSlider(slider, "Custom labels");

 

      // add a slider with icon labels

 

      slider = new JSlider();

      slider.setPaintTicks(true);

      slider.setPaintLabels(true);

      slider.setSnapToTicks(true);

      slider.setMajorTickSpacing(20);

      slider.setMinorTickSpacing(20);

 

      labelTable = new Hashtable<Integer, Component>();

 

      // add card images

 

      labelTable.put(0, new JLabel(new ImageIcon("nine.gif")));

      labelTable.put(20, new JLabel(new ImageIcon("ten.gif")));

      labelTable.put(40, new JLabel(new ImageIcon("jack.gif")));

      labelTable.put(60, new JLabel(new ImageIcon("queen.gif")));

      labelTable.put(80, new JLabel(new ImageIcon("king.gif")));

      labelTable.put(100, new JLabel(new ImageIcon("ace.gif")));

 

      slider.setLabelTable(labelTable);

      addSlider(slider, "Icon labels");

 

      // add the text field that displays the slider value

 

      textField = new JTextField();

      add(sliderPanel, BorderLayout.CENTER);

      add(textField, BorderLayout.SOUTH);

      pack();

   }

 

   /**

    * Adds a slider to the slider panel and hooks up the listener

    * @param s the slider

    * @param description the slider description

    */

   public void addSlider(JSlider s, String description)

   {

      s.addChangeListener(listener);

      JPanel panel = new JPanel();

      panel.add(s);

      panel.add(new JLabel(description));

      panel.setAlignmentX(Component.LEFT_ALIGNMENT);

      GridBagConstraints gbc = new GridBagConstraints();

      gbc.gridy = sliderPanel.getComponentCount();

      gbc.anchor = GridBagConstraints.WEST;

      sliderPanel.add(panel, gbc);

   }

}

得出结果:

 

测试程序8

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

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

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

MenuTest:

package menu;

 

import java.awt.*;

import javax.swing.*;

 

/**

 * @version 1.24 2012-06-12

 * @author Cay Horstmann

 */

public class MenuTest

{

   public static void main(String[] args)

   {

      EventQueue.invokeLater(() -> {

         JFrame frame = new MenuFrame();

         frame.setTitle("MenuTest");

         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

         frame.setVisible(true);

      });

   }

}

MenuFrame:

package menu;

 

import java.awt.event.*;

import javax.swing.*;

 

/**

 * A frame with a sample menu bar.

 */

public class MenuFrame extends JFrame

{

   private static final int DEFAULT_WIDTH = 300;

   private static final int DEFAULT_HEIGHT = 200;

   private Action saveAction;

   private Action saveAsAction;

   private JCheckBoxMenuItem readonlyItem;

   private JPopupMenu popup;

 

   /**

    * A sample action that prints the action name to System.out

    */

   class TestAction extends AbstractAction

   {

      public TestAction(String name)

      {

         super(name);

      }

 

      public void actionPerformed(ActionEvent event)

      {

         System.out.println(getValue(Action.NAME) + " selected.");

      }

   }

 

   public MenuFrame()

   {

      setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);

 

      JMenu fileMenu = new JMenu("File");

      fileMenu.add(new TestAction("New"));

 

      // demonstrate accelerators

 

      JMenuItem openItem = fileMenu.add(new TestAction("Open"));

      openItem.setAccelerator(KeyStroke.getKeyStroke("ctrl O"));

 

      fileMenu.addSeparator();

 

      saveAction = new TestAction("Save");

      JMenuItem saveItem = fileMenu.add(saveAction);

      saveItem.setAccelerator(KeyStroke.getKeyStroke("ctrl S"));

 

      saveAsAction = new TestAction("Save As");

      fileMenu.add(saveAsAction);

      fileMenu.addSeparator();

 

      fileMenu.add(new AbstractAction("Exit")

         {

            public void actionPerformed(ActionEvent event)

            {

               System.exit(0);

            }

         });

 

      // demonstrate checkbox and radio button menus

 

      readonlyItem = new JCheckBoxMenuItem("Read-only");

      readonlyItem.addActionListener(new ActionListener()

         {

            public void actionPerformed(ActionEvent event)

            {

               boolean saveOk = !readonlyItem.isSelected();

               saveAction.setEnabled(saveOk);

               saveAsAction.setEnabled(saveOk);

            }

         });

 

      ButtonGroup group = new ButtonGroup();

 

      JRadioButtonMenuItem insertItem = new JRadioButtonMenuItem("Insert");

      insertItem.setSelected(true);

      JRadioButtonMenuItem overtypeItem = new JRadioButtonMenuItem("Overtype");

 

      group.add(insertItem);

      group.add(overtypeItem);

 

      // demonstrate icons

 

      Action cutAction = new TestAction("Cut");

      cutAction.putValue(Action.SMALL_ICON, new ImageIcon("cut.gif"));

      Action copyAction = new TestAction("Copy");

      copyAction.putValue(Action.SMALL_ICON, new ImageIcon("copy.gif"));

      Action pasteAction = new TestAction("Paste");

      pasteAction.putValue(Action.SMALL_ICON, new ImageIcon("paste.gif"));

 

      JMenu editMenu = new JMenu("Edit");

      editMenu.add(cutAction);

      editMenu.add(copyAction);

      editMenu.add(pasteAction);

 

      // demonstrate nested menus

 

      JMenu optionMenu = new JMenu("Options");

 

      optionMenu.add(readonlyItem);

      optionMenu.addSeparator();

      optionMenu.add(insertItem);

      optionMenu.add(overtypeItem);

 

      editMenu.addSeparator();

      editMenu.add(optionMenu);

 

      // demonstrate mnemonics

 

      JMenu helpMenu = new JMenu("Help");

      helpMenu.setMnemonic('H');

 

      JMenuItem indexItem = new JMenuItem("Index");

      indexItem.setMnemonic('I');

      helpMenu.add(indexItem);

 

      // you can also add the mnemonic key to an action

      Action aboutAction = new TestAction("About");

      aboutAction.putValue(Action.MNEMONIC_KEY, new Integer('A'));

      helpMenu.add(aboutAction);

      

      // add all top-level menus to menu bar

 

      JMenuBar menuBar = new JMenuBar();

      setJMenuBar(menuBar);

 

      menuBar.add(fileMenu);

      menuBar.add(editMenu);

      menuBar.add(helpMenu);

 

      // demonstrate pop-ups

 

      popup = new JPopupMenu();

      popup.add(cutAction);

      popup.add(copyAction);

      popup.add(pasteAction);

 

      JPanel panel = new JPanel();

      panel.setComponentPopupMenu(popup);

      add(panel);

   }

}

 

得出结果:

 

测试程序9

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

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

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

ToolBarText:

package toolBar;

 

import java.awt.*;

import javax.swing.*;

 

/**

 * @version 1.14 2015-06-12

 * @author Cay Horstmann

 */

public class ToolBarTest

{

   public static void main(String[] args)

   {

      EventQueue.invokeLater(() -> {

         ToolBarFrame frame = new ToolBarFrame();

         frame.setTitle("ToolBarTest");

         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

         frame.setVisible(true);

      });

   }

}

ToolBarFrame:

package toolBar;

 

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

 

/**

 * A frame with a toolbar and menu for color changes.

 */

public class ToolBarFrame extends JFrame

{

   private static final int DEFAULT_WIDTH = 300;

   private static final int DEFAULT_HEIGHT = 200;

   private JPanel panel;

 

   public ToolBarFrame()

   {

      setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);

 

      // add a panel for color change

 

      panel = new JPanel();

      add(panel, BorderLayout.CENTER);

 

      // set up actions

 

      Action blueAction = new ColorAction("Blue", new ImageIcon("blue-ball.gif"), Color.BLUE);

      Action yellowAction = new ColorAction("Yellow", new ImageIcon("yellow-ball.gif"),

            Color.YELLOW);

      Action redAction = new ColorAction("Red", new ImageIcon("red-ball.gif"), Color.RED);

 

      Action exitAction = new AbstractAction("Exit", new ImageIcon("exit.gif"))

         {

            public void actionPerformed(ActionEvent event)

            {

               System.exit(0);

            }

         };

      exitAction.putValue(Action.SHORT_DESCRIPTION, "Exit");

 

      // populate toolbar

 

      JToolBar bar = new JToolBar();

      bar.add(blueAction);

      bar.add(yellowAction);

      bar.add(redAction);

      bar.addSeparator();

      bar.add(exitAction);

      add(bar, BorderLayout.NORTH);

 

      // populate menu

 

      JMenu menu = new JMenu("Color");

      menu.add(yellowAction);

      menu.add(blueAction);

      menu.add(redAction);

      menu.add(exitAction);

      JMenuBar menuBar = new JMenuBar();

      menuBar.add(menu);

      setJMenuBar(menuBar);

   }

 

   /**

    * The color action sets the background of the frame to a given color.

    */

   class ColorAction extends AbstractAction

   {

      public ColorAction(String name, Icon icon, Color c)

      {

         putValue(Action.NAME, name);

         putValue(Action.SMALL_ICON, icon);

         putValue(Action.SHORT_DESCRIPTION, name + " background");

         putValue("Color", c);

      }

 

      public void actionPerformed(ActionEvent event)

      {

         Color c = (Color) getValue("Color");

         panel.setBackground(c);

      }

   }

}

得出结果:

 

测试程序10

elipse IDE中调试运行教材524页程序12-1012-11,结合运行结果理解程序,了解GridbagLayout的用法。

elipse IDE中调试运行教材533页程序12-12,结合程序运行结果理解程序,了解GroupLayout的用法。

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

GridLayoutTest

package gridbag;

 

import java.awt.EventQueue;

 

import javax.swing.JFrame;

 

/**

 * @version 1.35 2015-06-12

 * @author Cay Horstmann

 */

public class GridBagLayoutTest

{

   public static void main(String[] args)

   {

      EventQueue.invokeLater(() ->           {

               JFrame frame = new FontFrame();

               frame.setTitle("GridBagLayoutTest");

               frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

               frame.setVisible(true);

         });

   }

}

GBC:

package gridbag;

 

import java.awt.*;

 

/**

 * This class simplifies the use of the GridBagConstraints class.

 * @version 1.01 2004-05-06

 * @author Cay Horstmann

 */

public class GBC extends GridBagConstraints

{

   /**

    * Constructs a GBC with a given gridx and gridy position and all other grid

    * bag constraint values set to the default.

    * @param gridx the gridx position

    * @param gridy the gridy position

    */

   public GBC(int gridx, int gridy)

   {

      this.gridx = gridx;

      this.gridy = gridy;

   }

 

   /**

    * Constructs a GBC with given gridx, gridy, gridwidth, gridheight and all

    * other grid bag constraint values set to the default.

    * @param gridx the gridx position

    * @param gridy the gridy position

    * @param gridwidth the cell span in x-direction

    * @param gridheight the cell span in y-direction

    */

   public GBC(int gridx, int gridy, int gridwidth, int gridheight)

   {

      this.gridx = gridx;

      this.gridy = gridy;

      this.gridwidth = gridwidth;

      this.gridheight = gridheight;

   }

 

   /**

    * Sets the anchor.

    * @param anchor the anchor value

    * @return this object for further modification

    */

   public GBC setAnchor(int anchor)

   {

      this.anchor = anchor;

      return this;

   }

 

   /**

    * Sets the fill direction.

    * @param fill the fill direction

    * @return this object for further modification

    */

   public GBC setFill(int fill)

   {

      this.fill = fill;

      return this;

   }

 

   /**

    * Sets the cell weights.

    * @param weightx the cell weight in x-direction

    * @param weighty the cell weight in y-direction

    * @return this object for further modification

    */

   public GBC setWeight(double weightx, double weighty)

   {

      this.weightx = weightx;

      this.weighty = weighty;

      return this;

   }

 

   /**

    * Sets the insets of this cell.

    * @param distance the spacing to use in all directions

    * @return this object for further modification

    */

   public GBC setInsets(int distance)

   {

      this.insets = new Insets(distance, distance, distance, distance);

      return this;

   }

 

   /**

    * Sets the insets of this cell.

    * @param top the spacing to use on top

    * @param left the spacing to use to the left

    * @param bottom the spacing to use on the bottom

    * @param right the spacing to use to the right

    * @return this object for further modification

    */

   public GBC setInsets(int top, int left, int bottom, int right)

   {

      this.insets = new Insets(top, left, bottom, right);

      return this;

   }

 

   /**

    * Sets the internal padding

    * @param ipadx the internal padding in x-direction

    * @param ipady the internal padding in y-direction

    * @return this object for further modification

    */

   public GBC setIpad(int ipadx, int ipady)

   {

      this.ipadx = ipadx;

      this.ipady = ipady;

      return this;

   }

}

 

FontFrame:

package gridbag;

 

import java.awt.Font;

import java.awt.GridBagLayout;

import java.awt.event.ActionListener;

 

import javax.swing.BorderFactory;

import javax.swing.JCheckBox;

import javax.swing.JComboBox;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JTextArea;

 

/**

 * A frame that uses a grid bag layout to arrange font selection components.

 */

public class FontFrame extends JFrame

{

   public static final int TEXT_ROWS = 10;

   public static final int TEXT_COLUMNS = 20;

 

   private JComboBox<String> face;

   private JComboBox<Integer> size;

   private JCheckBox bold;

   private JCheckBox italic;

   private JTextArea sample;

 

   public FontFrame()

   {

      GridBagLayout layout = new GridBagLayout();

      setLayout(layout);

 

      ActionListener listener = event -> updateSample();

 

      // construct components

 

      JLabel faceLabel = new JLabel("Face: ");

 

      face = new JComboBox<>(new String[] { "Serif", "SansSerif", "Monospaced",

            "Dialog", "DialogInput" });

 

      face.addActionListener(listener);

 

      JLabel sizeLabel = new JLabel("Size: ");

 

      size = new JComboBox<>(new Integer[] { 8, 10, 12, 15, 18, 24, 36, 48 });

 

      size.addActionListener(listener);

 

      bold = new JCheckBox("Bold");

      bold.addActionListener(listener);

 

      italic = new JCheckBox("Italic");

      italic.addActionListener(listener);

 

      sample = new JTextArea(TEXT_ROWS, TEXT_COLUMNS);

      sample.setText("The quick brown fox jumps over the lazy dog");

      sample.setEditable(false);

      sample.setLineWrap(true);

      sample.setBorder(BorderFactory.createEtchedBorder());

 

      // add components to grid, using GBC convenience class

 

      add(faceLabel, new GBC(0, 0).setAnchor(GBC.EAST));

      add(face, new GBC(1, 0).setFill(GBC.HORIZONTAL).setWeight(100, 0)

            .setInsets(1));

      add(sizeLabel, new GBC(0, 1).setAnchor(GBC.EAST));

      add(size, new GBC(1, 1).setFill(GBC.HORIZONTAL).setWeight(100, 0)

            .setInsets(1));

      add(bold, new GBC(0, 2, 2, 1).setAnchor(GBC.CENTER).setWeight(100, 100));

      add(italic, new GBC(0, 3, 2, 1).setAnchor(GBC.CENTER).setWeight(100, 100));

      add(sample, new GBC(2, 0, 1, 4).setFill(GBC.BOTH).setWeight(100, 100));

      pack();

      updateSample();

   }

 

   public void updateSample()

   {

      String fontFace = (String) face.getSelectedItem();

      int fontStyle = (bold.isSelected() ? Font.BOLD : 0)

            + (italic.isSelected() ? Font.ITALIC : 0);

      int fontSize = size.getItemAt(size.getSelectedIndex());

      Font font = new Font(fontFace, fontStyle, fontSize);

      sample.setFont(font);

      sample.repaint();

   }

}

得出结果:

 

GroupLayoutTest:

package groupLayout;

 

import java.awt.EventQueue;

 

import javax.swing.JFrame;

 

/**

 * @version 1.01 2015-06-12

 * @author Cay Horstmann

 */

public class GroupLayoutTest

{

   public static void main(String[] args)

   {

      EventQueue.invokeLater(() -> {

         JFrame frame = new FontFrame();

         frame.setTitle("GroupLayoutTest");

         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

         frame.setVisible(true);

      });

   }

}

FontFrame:

package groupLayout;

 

import java.awt.Font;

import java.awt.event.ActionListener;

 

import javax.swing.BorderFactory;

import javax.swing.GroupLayout;

import javax.swing.JCheckBox;

import javax.swing.JComboBox;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JScrollPane;

import javax.swing.JTextArea;

import javax.swing.LayoutStyle;

import javax.swing.SwingConstants;

 

/**

 * A frame that uses a group layout to arrange font selection components.

 */

public class FontFrame extends JFrame

{

   public static final int TEXT_ROWS = 10;

   public static final int TEXT_COLUMNS = 20;

 

   private JComboBox<String> face;

   private JComboBox<Integer> size;

   private JCheckBox bold;

   private JCheckBox italic;

   private JScrollPane pane;

   private JTextArea sample;

 

   public FontFrame()

   {

      ActionListener listener = event -> updateSample();

 

      // construct components

 

      JLabel faceLabel = new JLabel("Face: ");

 

      face = new JComboBox<>(new String[] { "Serif", "SansSerif", "Monospaced", "Dialog",

            "DialogInput" });

 

      face.addActionListener(listener);

 

      JLabel sizeLabel = new JLabel("Size: ");

 

      size = new JComboBox<>(new Integer[] { 8, 10, 12, 15, 18, 24, 36, 48 });

 

      size.addActionListener(listener);

 

      bold = new JCheckBox("Bold");

      bold.addActionListener(listener);

 

      italic = new JCheckBox("Italic");

      italic.addActionListener(listener);

 

      sample = new JTextArea(TEXT_ROWS, TEXT_COLUMNS);

      sample.setText("The quick brown fox jumps over the lazy dog");

      sample.setEditable(false);

      sample.setLineWrap(true);

      sample.setBorder(BorderFactory.createEtchedBorder());

 

      pane = new JScrollPane(sample);

 

      GroupLayout layout = new GroupLayout(getContentPane());

      setLayout(layout);

      layout.setHorizontalGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)

            .addGroup(

                  layout.createSequentialGroup().addContainerGap().addGroup(

                        layout.createParallelGroup(GroupLayout.Alignment.LEADING).addGroup(

                              GroupLayout.Alignment.TRAILING,

                              layout.createSequentialGroup().addGroup(

                                    layout.createParallelGroup(GroupLayout.Alignment.TRAILING)

                                          .addComponent(faceLabel).addComponent(sizeLabel))

                                    .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)

                                    .addGroup(

                                          layout.createParallelGroup(

                                                GroupLayout.Alignment.LEADING, false)

                                                .addComponent(size).addComponent(face)))

                              .addComponent(italic).addComponent(bold)).addPreferredGap(

                        LayoutStyle.ComponentPlacement.RELATED).addComponent(pane)

                        .addContainerGap()));

 

      layout.linkSize(SwingConstants.HORIZONTAL, new java.awt.Component[] { face, size });

 

      layout.setVerticalGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)

            .addGroup(

                  layout.createSequentialGroup().addContainerGap().addGroup(

                        layout.createParallelGroup(GroupLayout.Alignment.LEADING).addComponent(

                              pane, GroupLayout.Alignment.TRAILING).addGroup(

                              layout.createSequentialGroup().addGroup(

                                    layout.createParallelGroup(GroupLayout.Alignment.BASELINE)

                                          .addComponent(face).addComponent(faceLabel))

                                    .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)

                                    .addGroup(

                                          layout.createParallelGroup(

                                                GroupLayout.Alignment.BASELINE).addComponent(size)

                                                .addComponent(sizeLabel)).addPreferredGap(

                                          LayoutStyle.ComponentPlacement.RELATED).addComponent(

                                          italic, GroupLayout.DEFAULT_SIZE,

                                          GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

                                    .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)

                                    .addComponent(bold, GroupLayout.DEFAULT_SIZE,

                                          GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))

                        .addContainerGap()));

      pack();

   }

   

   public void updateSample()

   {

      String fontFace = (String) face.getSelectedItem();

      int fontStyle = (bold.isSelected() ? Font.BOLD : 0)

            + (italic.isSelected() ? Font.ITALIC : 0);

      int fontSize = size.getItemAt(size.getSelectedIndex());

      Font font = new Font(fontFace, fontStyle, fontSize);

      sample.setFont(font);

      sample.repaint();

   }

}

 

得出结果:

 

测试程序11

elipse IDE中调试运行教材539页程序12-1312-14,结合运行结果理解程序;

掌握定制布局管理器的用法。

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

CircleLayoutTest:

package circleLayout;

 

import java.awt.*;

import javax.swing.*;

 

/**

 * @version 1.33 2015-06-12

 * @author Cay Horstmann

 */

public class CircleLayoutTest

{

   public static void main(String[] args)

   {

      EventQueue.invokeLater(() -> {

         JFrame frame = new CircleLayoutFrame();

         frame.setTitle("CircleLayoutTest");

         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

         frame.setVisible(true);

      });

   }

}

CircleLayoutFrame:

package circleLayout;

 

import javax.swing.*;

 

/**

 * A frame that shows buttons arranged along a circle.

 */

public class CircleLayoutFrame extends JFrame

{

   public CircleLayoutFrame()

   {

      setLayout(new CircleLayout());

      add(new JButton("Yellow"));

      add(new JButton("Blue"));

      add(new JButton("Red"));

      add(new JButton("Green"));

      add(new JButton("Orange"));

      add(new JButton("Fuchsia"));

      add(new JButton("Indigo"));

      pack();

   }

}

CircleLayout:

package circleLayout;

 

import java.awt.*;

 

/**

 * A layout manager that lays out components along a circle.

 */

public class CircleLayout implements LayoutManager

{

   private int minWidth = 0;

   private int minHeight = 0;

   private int preferredWidth = 0;

   private int preferredHeight = 0;

   private boolean sizesSet = false;

   private int maxComponentWidth = 0;

   private int maxComponentHeight = 0;

 

   public void addLayoutComponent(String name, Component comp)

   {

   }

 

   public void removeLayoutComponent(Component comp)

   {

   }

 

   public void setSizes(Container parent)

   {

      if (sizesSet) return;

      int n = parent.getComponentCount();

 

      preferredWidth = 0;

      preferredHeight = 0;

      minWidth = 0;

      minHeight = 0;

      maxComponentWidth = 0;

      maxComponentHeight = 0;

 

      // compute the maximum component widths and heights

      // and set the preferred size to the sum of the component sizes.

      for (int i = 0; i < n; i++)

      {

         Component c = parent.getComponent(i);

         if (c.isVisible())

         {

            Dimension d = c.getPreferredSize();

            maxComponentWidth = Math.max(maxComponentWidth, d.width);

            maxComponentHeight = Math.max(maxComponentHeight, d.height);

            preferredWidth += d.width;

            preferredHeight += d.height;

         }

      }

      minWidth = preferredWidth / 2;

      minHeight = preferredHeight / 2;

      sizesSet = true;

   }

 

   public Dimension preferredLayoutSize(Container parent)

   {

      setSizes(parent);

      Insets insets = parent.getInsets();

      int width = preferredWidth + insets.left + insets.right;

      int height = preferredHeight + insets.top + insets.bottom;

      return new Dimension(width, height);

   }

 

   public Dimension minimumLayoutSize(Container parent)

   {

      setSizes(parent);

      Insets insets = parent.getInsets();

      int width = minWidth + insets.left + insets.right;

      int height = minHeight + insets.top + insets.bottom;

      return new Dimension(width, height);

   }

 

   public void layoutContainer(Container parent)

   {

      setSizes(parent);

 

      // compute center of the circle

 

      Insets insets = parent.getInsets();

      int containerWidth = parent.getSize().width - insets.left - insets.right;

      int containerHeight = parent.getSize().height - insets.top - insets.bottom;

 

      int xcenter = insets.left + containerWidth / 2;

      int ycenter = insets.top + containerHeight / 2;

 

      // compute radius of the circle

 

      int xradius = (containerWidth - maxComponentWidth) / 2;

      int yradius = (containerHeight - maxComponentHeight) / 2;

      int radius = Math.min(xradius, yradius);

 

      // lay out components along the circle

 

      int n = parent.getComponentCount();

      for (int i = 0; i < n; i++)

      {

         Component c = parent.getComponent(i);

         if (c.isVisible())

         {

            double angle = 2 * Math.PI * i / n;

 

            // center point of component

            int x = xcenter + (int) (Math.cos(angle) * radius);

            int y = ycenter + (int) (Math.sin(angle) * radius);

 

            // move component so that its center is (x, y)

            // and its size is its preferred size

            Dimension d = c.getPreferredSize();

            c.setBounds(x - d.width / 2, y - d.height / 2, d.width, d.height);

         }

      }

   }

}

得出结果:

 

测试程序12

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

掌握选项对话框的用法。

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

OptionDialogTest:

package optionDialog;

 

import java.awt.*;

import javax.swing.*;

 

/**

 * @version 1.34 2015-06-12

 * @author Cay Horstmann

 */

public class OptionDialogTest

{

   public static void main(String[] args)

   {

      EventQueue.invokeLater(() -> {

         JFrame frame = new OptionDialogFrame();

         frame.setTitle("OptionDialogTest");

         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

         frame.setVisible(true);

      });

   }

}

 

OptionDialogFrame:

package optionDialog;

 

import java.awt.*;

import java.awt.event.*;

import java.awt.geom.*;

import java.util.*;

import javax.swing.*;

 

/**

 * A frame that contains settings for selecting various option dialogs.

 */

public class OptionDialogFrame extends JFrame

{

   private ButtonPanel typePanel;

   private ButtonPanel messagePanel;

   private ButtonPanel messageTypePanel;

   private ButtonPanel optionTypePanel;

   private ButtonPanel optionsPanel;

   private ButtonPanel inputPanel;

   private String messageString = "Message";

   private Icon messageIcon = new ImageIcon("blue-ball.gif");

   private Object messageObject = new Date();

   private Component messageComponent = new SampleComponent();

 

   public OptionDialogFrame()

   {

      JPanel gridPanel = new JPanel();

      gridPanel.setLayout(new GridLayout(2, 3));

 

      typePanel = new ButtonPanel("Type", "Message", "Confirm", "Option", "Input");

      messageTypePanel = new ButtonPanel("Message Type", "ERROR_MESSAGE", "INFORMATION_MESSAGE",

            "WARNING_MESSAGE", "QUESTION_MESSAGE", "PLAIN_MESSAGE");

      messagePanel = new ButtonPanel("Message", "String", "Icon", "Component", "Other",

            "Object[]");

      optionTypePanel = new ButtonPanel("Confirm", "DEFAULT_OPTION", "YES_NO_OPTION",

            "YES_NO_CANCEL_OPTION", "OK_CANCEL_OPTION");

      optionsPanel = new ButtonPanel("Option", "String[]", "Icon[]", "Object[]");

      inputPanel = new ButtonPanel("Input", "Text field", "Combo box");

 

      gridPanel.add(typePanel);

      gridPanel.add(messageTypePanel);

      gridPanel.add(messagePanel);

      gridPanel.add(optionTypePanel);

      gridPanel.add(optionsPanel);

      gridPanel.add(inputPanel);

 

      // add a panel with a Show button

 

      JPanel showPanel = new JPanel();

      JButton showButton = new JButton("Show");

      showButton.addActionListener(new ShowAction());

      showPanel.add(showButton);

 

      add(gridPanel, BorderLayout.CENTER);

      add(showPanel, BorderLayout.SOUTH);

      pack();

   }

 

   /**

    * Gets the currently selected message.

    * @return a string, icon, component, or object array, depending on the Message panel selection

    */

   public Object getMessage()

   {

      String s = messagePanel.getSelection();

      if (s.equals("String")) return messageString;

      else if (s.equals("Icon")) return messageIcon;

      else if (s.equals("Component")) return messageComponent;

      else if (s.equals("Object[]")) return new Object[] { messageString, messageIcon,

            messageComponent, messageObject };

      else if (s.equals("Other")) return messageObject;

      else return null;

   }

 

   /**

    * Gets the currently selected options.

    * @return an array of strings, icons, or objects, depending on the Option panel selection

    */

   public Object[] getOptions()

   {

      String s = optionsPanel.getSelection();

      if (s.equals("String[]")) return new String[] { "Yellow", "Blue", "Red" };

      else if (s.equals("Icon[]")) return new Icon[] { new ImageIcon("yellow-ball.gif"),

            new ImageIcon("blue-ball.gif"), new ImageIcon("red-ball.gif") };

      else if (s.equals("Object[]")) return new Object[] { messageString, messageIcon,

            messageComponent, messageObject };

      else return null;

   }

 

   /**

    * Gets the selected message or option type

    * @param panel the Message Type or Confirm panel

    * @return the selected XXX_MESSAGE or XXX_OPTION constant from the JOptionPane class

    */

   public int getType(ButtonPanel panel)

   {

      String s = panel.getSelection();

      try

      {

         return JOptionPane.class.getField(s).getInt(null);

      }

      catch (Exception e)

      {

         return -1;

      }

   }

 

   /**

    * The action listener for the Show button shows a Confirm, Input, Message, or Option dialog

    * depending on the Type panel selection.

    */

   private class ShowAction implements ActionListener

   {

      public void actionPerformed(ActionEvent event)

      {

         if (typePanel.getSelection().equals("Confirm")) JOptionPane.showConfirmDialog(

               OptionDialogFrame.this, getMessage(), "Title", getType(optionTypePanel),

               getType(messageTypePanel));

         else if (typePanel.getSelection().equals("Input"))

         {

            if (inputPanel.getSelection().equals("Text field")) JOptionPane.showInputDialog(

                  OptionDialogFrame.this, getMessage(), "Title", getType(messageTypePanel));

            else JOptionPane.showInputDialog(OptionDialogFrame.this, getMessage(), "Title",

                  getType(messageTypePanel), null, new String[] { "Yellow", "Blue", "Red" },

                  "Blue");

         }

         else if (typePanel.getSelection().equals("Message")) JOptionPane.showMessageDialog(

               OptionDialogFrame.this, getMessage(), "Title", getType(messageTypePanel));

         else if (typePanel.getSelection().equals("Option")) JOptionPane.showOptionDialog(

               OptionDialogFrame.this, getMessage(), "Title", getType(optionTypePanel),

               getType(messageTypePanel), null, getOptions(), getOptions()[0]);

      }

   }

}

 

/**

 * A component with a painted surface

 */

 

class SampleComponent extends JComponent

{

   public void paintComponent(Graphics g)

   {

      Graphics2D g2 = (Graphics2D) g;

      Rectangle2D rect = new Rectangle2D.Double(0, 0, getWidth() - 1, getHeight() - 1);

      g2.setPaint(Color.YELLOW);

      g2.fill(rect);

      g2.setPaint(Color.BLUE);

      g2.draw(rect);

   }

 

   public Dimension getPreferredSize()

   {

      return new Dimension(10, 10);

   }

}

 

ButtonPanel:

package optionDialog;

 

import javax.swing.*;

 

/**

 * A panel with radio buttons inside a titled border.

 */

public class ButtonPanel extends JPanel

{

   private ButtonGroup group;

 

   /**

    * Constructs a button panel.

    * @param title the title shown in the border

    * @param options an array of radio button labels

    */

   public ButtonPanel(String title, String... options)

   {

      setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), title));

      setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));

      group = new ButtonGroup();

 

      // make one radio button for each option

      for (String option : options)

      {

         JRadioButton b = new JRadioButton(option);

         b.setActionCommand(option);

         add(b);

         group.add(b);

         b.setSelected(option == options[0]);

      }

   }

 

   /**

    * Gets the currently selected option.

    * @return the label of the currently selected radio button.

    */

   public String getSelection()

   {

      return group.getSelection().getActionCommand();

   }

}

 

得出结果:

 

测试程序13

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

掌握对话框的创建方法;

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

DialogTest:

package dialog;

 

import java.awt.*;

import javax.swing.*;

 

/**

 * @version 1.34 2012-06-12

 * @author Cay Horstmann

 */

public class DialogTest

{

   public static void main(String[] args)

   {

      EventQueue.invokeLater(() -> {

         JFrame frame = new DialogFrame();

         frame.setTitle("DialogTest");

         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

         frame.setVisible(true);

      });

   }

}

DialogFrame:

package dialog;

 

import javax.swing.JFrame;

import javax.swing.JMenu;

import javax.swing.JMenuBar;

import javax.swing.JMenuItem;

 

/**

 * A frame with a menu whose File->About action shows a dialog.

 */

public class DialogFrame extends JFrame

{

   private static final int DEFAULT_WIDTH = 300;

   private static final int DEFAULT_HEIGHT = 200;

   private AboutDialog dialog;

 

   public DialogFrame()

   {

      setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);

 

      // Construct a File menu.

 

      JMenuBar menuBar = new JMenuBar();

      setJMenuBar(menuBar);

      JMenu fileMenu = new JMenu("File");

      menuBar.add(fileMenu);

 

      // Add About and Exit menu items.

 

      // The About item shows the About dialog.

 

      JMenuItem aboutItem = new JMenuItem("About");

      aboutItem.addActionListener(event -> {

         if (dialog == null) // first time

            dialog = new AboutDialog(DialogFrame.this);

         dialog.setVisible(true); // pop up dialog

      });

      fileMenu.add(aboutItem);

 

      // The Exit item exits the program.

 

      JMenuItem exitItem = new JMenuItem("Exit");

      exitItem.addActionListener(event -> System.exit(0));

      fileMenu.add(exitItem);

   }

}

 

AboutDialog:

package dialog;

 

import java.awt.BorderLayout;

 

import javax.swing.JButton;

import javax.swing.JDialog;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

 

/**

 * A sample modal dialog that displays a message and waits for the user to click the OK button.

 */

public class AboutDialog extends JDialog

{

   public AboutDialog(JFrame owner)

   {

      super(owner, "About DialogTest", true);

 

      // add HTML label to center

 

      add(

            new JLabel(

                  "<html><h1><i>Core Java</i></h1><hr>By Cay Horstmann</html>"),

            BorderLayout.CENTER);

 

      // OK button closes the dialog

 

      JButton ok = new JButton("OK");

      ok.addActionListener(event -> setVisible(false));

 

      // add OK button to southern border

 

      JPanel panel = new JPanel();

      panel.add(ok);

      add(panel, BorderLayout.SOUTH);

 

      pack();

   }

}

得出结果:

 

测试程序14

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

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

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

DataExchangeTest:

package dataExchange;

 

import java.awt.*;

import javax.swing.*;

 

/**

 * @version 1.34 2015-06-12

 * @author Cay Horstmann

 */

public class DataExchangeTest

{

   public static void main(String[] args)

   {

      EventQueue.invokeLater(() -> {

         JFrame frame = new DataExchangeFrame();

         frame.setTitle("DataExchangeTest");

         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

         frame.setVisible(true);

      });

   }

}

DataExchangeFrame:

package dataExchange;

 

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

 

/**

 * A frame with a menu whose File->Connect action shows a password dialog.

 */

public class DataExchangeFrame extends JFrame

{

   public static final int TEXT_ROWS = 20;

   public static final int TEXT_COLUMNS = 40;

   private PasswordChooser dialog = null;

   private JTextArea textArea;

 

   public DataExchangeFrame()

   {

      // construct a File menu

 

      JMenuBar mbar = new JMenuBar();

      setJMenuBar(mbar);

      JMenu fileMenu = new JMenu("File");

      mbar.add(fileMenu);

 

      // add Connect and Exit menu items

 

      JMenuItem connectItem = new JMenuItem("Connect");

      connectItem.addActionListener(new ConnectAction());

      fileMenu.add(connectItem);

 

      // The Exit item exits the program

 

      JMenuItem exitItem = new JMenuItem("Exit");

      exitItem.addActionListener(event -> System.exit(0));

      fileMenu.add(exitItem);

 

      textArea = new JTextArea(TEXT_ROWS, TEXT_COLUMNS);

      add(new JScrollPane(textArea), BorderLayout.CENTER);

      pack();

   }

 

   /**

    * The Connect action pops up the password dialog.

    */

   private class ConnectAction implements ActionListener

   {

      public void actionPerformed(ActionEvent event)

      {

         // if first time, construct dialog

 

         if (dialog == null) dialog = new PasswordChooser();

 

         // set default values

         dialog.setUser(new User("yourname", null));

 

         // pop up dialog

         if (dialog.showDialog(DataExchangeFrame.this, "Connect"))

         {

            // if accepted, retrieve user input

            User u = dialog.getUser();

            textArea.append("user name = " + u.getName() + ", password = "

                  + (new String(u.getPassword())) + "\n");

         }

      }

   }

}

PasswordChooser:

package dataExchange;

 

import java.awt.BorderLayout;

import java.awt.Component;

import java.awt.Frame;

import java.awt.GridLayout;

 

import javax.swing.JButton;

import javax.swing.JDialog;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.JPasswordField;

import javax.swing.JTextField;

import javax.swing.SwingUtilities;

 

/**

 * A password chooser that is shown inside a dialog

 */

public class PasswordChooser extends JPanel

{

   private JTextField username;

   private JPasswordField password;

   private JButton okButton;

   private boolean ok;

   private JDialog dialog;

 

   public PasswordChooser()

   {

      setLayout(new BorderLayout());

 

      // construct a panel with user name and password fields

 

      JPanel panel = new JPanel();

      panel.setLayout(new GridLayout(2, 2));

      panel.add(new JLabel("User name:"));

      panel.add(username = new JTextField(""));

      panel.add(new JLabel("Password:"));

      panel.add(password = new JPasswordField(""));

      add(panel, BorderLayout.CENTER);

 

      // create Ok and Cancel buttons that terminate the dialog

 

      okButton = new JButton("Ok");

      okButton.addActionListener(event -> {

         ok = true;

         dialog.setVisible(false);

      });

 

      JButton cancelButton = new JButton("Cancel");

      cancelButton.addActionListener(event -> dialog.setVisible(false));

 

      // add buttons to southern border

 

      JPanel buttonPanel = new JPanel();

      buttonPanel.add(okButton);

      buttonPanel.add(cancelButton);

      add(buttonPanel, BorderLayout.SOUTH);

   }

 

   /**

    * Sets the dialog defaults.

    * @param u the default user information

    */

   public void setUser(User u)

   {

      username.setText(u.getName());

   }

 

   /**

    * Gets the dialog entries.

    * @return a User object whose state represents the dialog entries

    */

   public User getUser()

   {

      return new User(username.getText(), password.getPassword());

   }

 

   /**

    * Show the chooser panel in a dialog

    * @param parent a component in the owner frame or null

    * @param title the dialog window title

    */

   public boolean showDialog(Component parent, String title)

   {

      ok = false;

 

      // locate the owner frame

 

      Frame owner = null;

      if (parent instanceof Frame)

         owner = (Frame) parent;

      else

         owner = (Frame) SwingUtilities.getAncestorOfClass(Frame.class, parent);

 

      // if first time, or if owner has changed, make new dialog

 

      if (dialog == null || dialog.getOwner() != owner)

      {

         dialog = new JDialog(owner, true);

         dialog.add(this);

         dialog.getRootPane().setDefaultButton(okButton);

         dialog.pack();

      }

 

      // set title and show dialog

 

      dialog.setTitle(title);

      dialog.setVisible(true);

      return ok;

   }

}

User:

package dataExchange;

 

/**

 * A user has a name and password. For security reasons, the password is stored as a char[], not a

 * String.

 */

public class User

{

   private String name;

   private char[] password;

 

   public User(String aName, char[] aPassword)

   {

      name = aName;

      password = aPassword;

   }

 

   public String getName()

   {

      return name;

   }

 

   public char[] getPassword()

   {

      return password;

   }

 

   public void setName(String aName)

   {

      name = aName;

   }

 

   public void setPassword(char[] aPassword)

   {

      password = aPassword;

   }

}

得出结果:

 

测试程序15

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

掌握文件对话框的用法;

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

FileChooserTest:

package fileChooser;

 

import java.awt.*;

import javax.swing.*;

 

/**

 * @version 1.25 2015-06-12

 * @author Cay Horstmann

 */

public class FileChooserTest

{

   public static void main(String[] args)

   {

      EventQueue.invokeLater(() -> {

         JFrame frame = new ImageViewerFrame();

         frame.setTitle("FileChooserTest");

         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

         frame.setVisible(true);

      });

   }

}

FileIconView:

package fileChooser;

 

import java.io.*;

import javax.swing.*;

import javax.swing.filechooser.*;

import javax.swing.filechooser.FileFilter;

 

/**

 * A file view that displays an icon for all files that match a file filter.

 */

public class FileIconView extends FileView

{

   private FileFilter filter;

   private Icon icon;

 

   /**

    * Constructs a FileIconView.

    * @param aFilter a file filter--all files that this filter accepts will be shown

    * with the icon.

    * @param anIcon--the icon shown with all accepted files.

    */

   public FileIconView(FileFilter aFilter, Icon anIcon)

   {

      filter = aFilter;

      icon = anIcon;

   }

 

   public Icon getIcon(File f)

   {

      if (!f.isDirectory() && filter.accept(f)) return icon;

      else return null;

   }

}

ImagePreviwer:

package fileChooser;

 

import java.awt.*;

import java.io.*;

 

import javax.swing.*;

 

/**

 * A file chooser accessory that previews images.

 */

public class ImagePreviewer extends JLabel

{

   /**

    * Constructs an ImagePreviewer.

    * @param chooser the file chooser whose property changes trigger an image

    *        change in this previewer

    */

   public ImagePreviewer(JFileChooser chooser)

   {

      setPreferredSize(new Dimension(100, 100));

      setBorder(BorderFactory.createEtchedBorder());

 

      chooser.addPropertyChangeListener(event -> {

         if (event.getPropertyName() == JFileChooser.SELECTED_FILE_CHANGED_PROPERTY)

         {

            // the user has selected a new file

            File f = (File) event.getNewValue();

            if (f == null)

            {

               setIcon(null);

               return;

            }

 

            // read the image into an icon

            ImageIcon icon = new ImageIcon(f.getPath());

 

            // if the icon is too large to fit, scale it

            if (icon.getIconWidth() > getWidth())

               icon = new ImageIcon(icon.getImage().getScaledInstance(

                     getWidth(), -1, Image.SCALE_DEFAULT));

 

            setIcon(icon);

         }

      });

   }

}

 

ImageViewerFrame:

package fileChooser;

 

import java.io.*;

 

import javax.swing.*;

import javax.swing.filechooser.*;

import javax.swing.filechooser.FileFilter;

 

/**

 * A frame that has a menu for loading an image and a display area for the

 * loaded image.

 */

public class ImageViewerFrame extends JFrame

{

   private static final int DEFAULT_WIDTH = 300;

   private static final int DEFAULT_HEIGHT = 400;

   private JLabel label;

   private JFileChooser chooser;

 

   public ImageViewerFrame()

   {

      setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);

 

      // set up menu bar

      JMenuBar menuBar = new JMenuBar();

      setJMenuBar(menuBar);

 

      JMenu menu = new JMenu("File");

      menuBar.add(menu);

 

      JMenuItem openItem = new JMenuItem("Open");

      menu.add(openItem);

      openItem.addActionListener(event -> {

         chooser.setCurrentDirectory(new File("."));

 

         // show file chooser dialog

            int result = chooser.showOpenDialog(ImageViewerFrame.this);

 

            // if image file accepted, set it as icon of the label

            if (result == JFileChooser.APPROVE_OPTION)

            {

               String name = chooser.getSelectedFile().getPath();

               label.setIcon(new ImageIcon(name));

               pack();

            }

         });

 

      JMenuItem exitItem = new JMenuItem("Exit");

      menu.add(exitItem);

      exitItem.addActionListener(event -> System.exit(0));

 

      // use a label to display the images

      label = new JLabel();

      add(label);

 

      // set up file chooser

      chooser = new JFileChooser();

 

      // accept all image files ending with .jpg, .jpeg, .gif

      FileFilter filter = new FileNameExtensionFilter(

            "Image files", "jpg", "jpeg", "gif");

      chooser.setFileFilter(filter);

 

      chooser.setAccessory(new ImagePreviewer(chooser));

 

      chooser.setFileView(new FileIconView(filter, new ImageIcon("palette.gif")));

   }

}

得出结果:

 

测试程序16

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

了解颜色选择器的用法。

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

ColorChooserTest:

package colorChooser;

 

import java.awt.*;

import javax.swing.*;

 

/**

 * @version 1.04 2015-06-12

 * @author Cay Horstmann

 */

public class ColorChooserTest

{

   public static void main(String[] args)

   {

      EventQueue.invokeLater(() -> {

         JFrame frame = new ColorChooserFrame();

         frame.setTitle("ColorChooserTest");

         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

         frame.setVisible(true);

      });

   }

}

ColorChooserPanel:

package colorChooser;

 

import java.awt.Color;

import java.awt.Frame;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

 

import javax.swing.JButton;

import javax.swing.JColorChooser;

import javax.swing.JDialog;

import javax.swing.JPanel;

 

/**

 * A panel with buttons to pop up three types of color choosers

 */

public class ColorChooserPanel extends JPanel

{

   public ColorChooserPanel()

   {

      JButton modalButton = new JButton("Modal");

      modalButton.addActionListener(new ModalListener());

      add(modalButton);

 

      JButton modelessButton = new JButton("Modeless");

      modelessButton.addActionListener(new ModelessListener());

      add(modelessButton);

 

      JButton immediateButton = new JButton("Immediate");

      immediateButton.addActionListener(new ImmediateListener());

      add(immediateButton);

   }

 

   /**

    * This listener pops up a modal color chooser

    */

   private class ModalListener implements ActionListener

   {

      public void actionPerformed(ActionEvent event)

      {

         Color defaultColor = getBackground();

         Color selected = JColorChooser.showDialog(ColorChooserPanel.this, "Set background",

               defaultColor);

         if (selected != null) setBackground(selected);

      }

   }

 

   /**

    * This listener pops up a modeless color chooser. The panel color is changed when the user

    * clicks the OK button.

    */

   private class ModelessListener implements ActionListener

   {

      private JDialog dialog;

      private JColorChooser chooser;

 

      public ModelessListener()

      {

         chooser = new JColorChooser();

         dialog = JColorChooser.createDialog(ColorChooserPanel.this, "Background Color",

               false /* not modal */, chooser,

               event -> setBackground(chooser.getColor()),

               null /* no Cancel button listener */);

      }

 

      public void actionPerformed(ActionEvent event)

      {

         chooser.setColor(getBackground());

         dialog.setVisible(true);

      }

   }

 

   /**

    * This listener pops up a modeless color chooser. The panel color is changed immediately when

    * the user picks a new color.

    */

   private class ImmediateListener implements ActionListener

   {

      private JDialog dialog;

      private JColorChooser chooser;

 

      public ImmediateListener()

      {

         chooser = new JColorChooser();

         chooser.getSelectionModel().addChangeListener(

               event -> setBackground(chooser.getColor()));

 

         dialog = new JDialog((Frame) null, false /* not modal */);

         dialog.add(chooser);

         dialog.pack();

      }

 

      public void actionPerformed(ActionEvent event)

      {

         chooser.setColor(getBackground());

         dialog.setVisible(true);

      }

   }

}

ColorChooserFrame:

package colorChooser;

 

import javax.swing.*;

 

/**

 * A frame with a color chooser panel

 */

public class ColorChooserFrame extends JFrame

{

   private static final int DEFAULT_WIDTH = 300;

   private static final int DEFAULT_HEIGHT = 200;

 

   public ColorChooserFrame()

   {      

      setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);

 

      // add color chooser panel to frame

 

      ColorChooserPanel panel = new ColorChooserPanel();

      add(panel);

   }

}

得出结果:

 

实验2组内讨论反思本组负责程序,理解程序总体结构,梳理程序GUI设计中应用的相关组件,整理相关组件的API,对程序中组件应用的相关代码添加注释。

所添加注释:

package 课本示例13;

import java.awt.*; import javax.swing.*;

/** * @version 1.34 2015-06-12 * @author Cay Horstmann */ public class OptionDialogTest { public static void main(String[] args) { EventQueue.invokeLater(() -> { JFrame frame = new OptionDialogFrame(); frame.setTitle("OptionDialogTest"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); }); } }

 

package 课本示例13;

import java.awt.*; import java.awt.event.*; import java.awt.geom.*; import java.util.*; import javax.swing.*;

/** * 包含用于选择各种选项对话框的设置的框架。 */ public class OptionDialogFrame extends JFrame { private ButtonPanel typePanel; private ButtonPanel messagePanel; private ButtonPanel messageTypePanel; private ButtonPanel optionTypePanel; private ButtonPanel optionsPanel; private ButtonPanel inputPanel; private String messageString = "Message"; private Icon messageIcon = new ImageIcon("blue-ball.gif"); private Object messageObject = new Date(); private Component messageComponent = new SampleComponent();

public OptionDialogFrame() { JPanel gridPanel = new JPanel(); gridPanel.setLayout(new GridLayout(2, 3));

typePanel = new ButtonPanel("Type", "Message", "Confirm", "Option", "Input"); messageTypePanel = new ButtonPanel("Message Type", "ERROR_MESSAGE", "INFORMATION_MESSAGE", "WARNING_MESSAGE", "QUESTION_MESSAGE", "PLAIN_MESSAGE"); messagePanel = new ButtonPanel("Message", "String", "Icon", "Component", "Other", "Object[]"); optionTypePanel = new ButtonPanel("Confirm", "DEFAULT_OPTION", "YES_NO_OPTION", "YES_NO_CANCEL_OPTION", "OK_CANCEL_OPTION"); optionsPanel = new ButtonPanel("Option", "String[]", "Icon[]", "Object[]"); inputPanel = new ButtonPanel("Input", "Text field", "Combo box");

gridPanel.add(typePanel); gridPanel.add(messageTypePanel); gridPanel.add(messagePanel); gridPanel.add(optionTypePanel); gridPanel.add(optionsPanel); gridPanel.add(inputPanel);

// add a panel with a Show button

JPanel showPanel = new JPanel(); JButton showButton = new JButton("Show"); showButton.addActionListener(new ShowAction()); showPanel.add(showButton);

add(gridPanel, BorderLayout.CENTER); add(showPanel, BorderLayout.SOUTH); pack(); }

/** * Gets the currently selected message. * @return a string, icon, component, or object array, depending on the Message panel selection */ public Object getMessage() { String s = messagePanel.getSelection(); if (s.equals("String")) return messageString; else if (s.equals("Icon")) return messageIcon; else if (s.equals("Component")) return messageComponent; else if (s.equals("Object[]")) return new Object[] { messageString, messageIcon, messageComponent, messageObject }; else if (s.equals("Other")) return messageObject; else return null; }

/** * Gets the currently selected options. * @return an array of strings, icons, or objects, depending on the Option panel selection */ public Object[] getOptions() { String s = optionsPanel.getSelection(); if (s.equals("String[]")) return new String[] { "Yellow", "Blue", "Red" }; else if (s.equals("Icon[]")) return new Icon[] { new ImageIcon("yellow-ball.gif"), new ImageIcon("blue-ball.gif"), new ImageIcon("red-ball.gif") }; else if (s.equals("Object[]")) return new Object[] { messageString, messageIcon, messageComponent, messageObject }; else return null; }

/** * 获取所选消息或选项类型 * @param面板消息类型或确认面板 * @return JOptionPane类中选定的XXX_MESSAGE或XXX_OPTION常量 */ public int getType(ButtonPanel panel) { String s = panel.getSelection(); try { return JOptionPane.class.getField(s).getInt(null); } catch (Exception e) { return -1; } }

/** * “显示”按钮的动作侦听器显示“确认”,“输入”,“消息”或“选项”对话框 *取决于“类型”面板选择。 */ private class ShowAction implements ActionListener { public void actionPerformed(ActionEvent event) { if (typePanel.getSelection().equals("Confirm")) JOptionPane.showConfirmDialog( OptionDialogFrame.this, getMessage(), "Title", getType(optionTypePanel), getType(messageTypePanel)); else if (typePanel.getSelection().equals("Input")) { if (inputPanel.getSelection().equals("Text field")) JOptionPane.showInputDialog( OptionDialogFrame.this, getMessage(), "Title", getType(messageTypePanel)); else JOptionPane.showInputDialog(OptionDialogFrame.this, getMessage(), "Title", getType(messageTypePanel), null, new String[] { "Yellow", "Blue", "Red" }, "Blue"); } else if (typePanel.getSelection().equals("Message")) JOptionPane.showMessageDialog( OptionDialogFrame.this, getMessage(), "Title", getType(messageTypePanel)); else if (typePanel.getSelection().equals("Option")) JOptionPane.showOptionDialog( OptionDialogFrame.this, getMessage(), "Title", getType(optionTypePanel), getType(messageTypePanel), null, getOptions(), getOptions()[0]); } } }

/** * 具有涂漆表面的组件 */

class SampleComponent extends JComponent { public void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D) g; Rectangle2D rect = new Rectangle2D.Double(0, 0, getWidth() - 1, getHeight() - 1); g2.setPaint(Color.YELLOW); g2.fill(rect); g2.setPaint(Color.BLUE); g2.draw(rect); }

public Dimension getPreferredSize() { return new Dimension(10, 10); } }

 

package 课本示例13;

 

import javax.swing.*;

 

/**

 * 带标题边框内的单选按钮的面板.

 */

public class ButtonPanel extends JPanel

{

   private ButtonGroup group;

 

   /**

    * 构造一个按钮面板.

    * @param标题边框中显示的标题

    * @param选项一组单选按钮标签

    */

   public ButtonPanel(String title, String... options)

   {

      setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), title));

      setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));

      group = new ButtonGroup();

 

      // make one radio button for each option

      for (String option : options)

      {

         JRadioButton b = new JRadioButton(option);

         b.setActionCommand(option);

         add(b);

         group.add(b);

         b.setSelected(option == options[0]);

      }

   }

 

   /**

    * 获取当前选定的选项。

    * @return当前所选单选按钮的标签。

    */

   public String getSelection()

   {

      return group.getSelection().getActionCommand();

   }

}

GUI相关组件: 

GUI窗口

  Jframe是窗体组件。创建该组件即创建了一个窗口。窗口是一个容器组件,所有内容均可以放入其中。

  创建窗体对象:

  JFrame frame = newJFrame(“标题”);

  // 在这里需要简单设置属性:

  frame.setSize(int 宽,int 高); //设置窗体尺寸

  frame.setLocation(int x轴,int y轴); //设置窗体位置

  frame. setVisible(true); //设置窗体可见

  this.setResizable(false); //设置窗体大小固定

  this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 关闭窗口默认操作

  向窗体中添加其他组件:

  frame.add(其他组件);

GUI布局

  布局是指界面存放组件位置的方式。

  如果组件凌乱地存放在容器当中不好看,通常可以采用对应布局方式,来规范组件的位置,Java也提供了常见的布局对象。

  LayoutManager: 布局接口,各种布局类均为其子类

  frame.setLayout(布局对象) //设置窗口布局

  null:不使用布局,此时可以容器内的组件可以调用方法,通过坐标以及尺寸进行组件定位:

  组件定位方法为void setBounds(int x轴,int y轴,int 宽度,int 高度)

  BorderLayout:边界布局,将界面分为东西南北中5个方位,frame的默认布局

  GUI面板

  JPanel面板与JFrame窗体类似,属于容器组件,可以存放其他组件内容。通常用来划分区域,完成一个完整的功能。

  通常的方式是: JFrame存放JPanel,JPanel存放其他组件。

  GUI按钮

  在容器内最终完成数据展示与交互的均为功能组件。组件众多,其他组件的使用方法均类似,这里不一一介绍。欢迎界面中使用到了Button组件。

  Button btn = new Button();

  通用步骤:

  1、创建功能组件对象;

  2、给功能组件绑定监听器;

  3、将功能组件添加到容器组件中;

   GUI监听器

  页面中的各种组件均包含一些Java预设的用户操作(如鼠标点击,键盘按键等),如何在用户完成对应操作时,执行对应的代码,是事件监听机制完成的。

  将发生预设事件的组件绑定监听器,监听器某个组件是否发生了用户操作,当用户进行对应的操作后,执行对应代码。

  我们最常见的操作是鼠标点击按钮,是按钮的动作。这里介绍按钮的事件监听。

  事件监听步骤:

  ① 被监听的组件调用方法与监听器关联

  按钮组件关联监听器方法:addActionListener(监听器对象)

  按钮动作监听器接口:ActionListener

  ② 在监听器中定义用户操作对应的执行代码

实验3:组间协同学习:在本班课程QQ群内,各位同学对实验1中存在的问题进行提问,提问时注明实验1中的测试程序编号,负责对应程序的小组需及时对群内提问进行回答。

 

总结:

本周学习内容较多,所以我们采用了自小组协作学习模式通过小组内的商讨大致理解了这些测试程序的基本思路;也在合作伙伴的身上学到了一些学习的方法。通过本周的小组学习,我们收获了自主学习所得不到的好处,那就是学习理解别人的学习感悟和知识理解。希望在这周学习完之后,可以对此问题有了更深入的了解

posted on 2018-12-02 15:06  wxsfzfw  阅读(147)  评论(0编辑  收藏  举报

导航