201771010102 常惠琢 2018面向对象程序设计(Java)第14周学习总结

Posted hongyanohongyan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了201771010102 常惠琢 2018面向对象程序设计(Java)第14周学习总结相关的知识,希望对你有一定的参考价值。

  1 package gridbag;
  2 
  3 import java.awt.*;
  4 
  5 /**
  6  * This class simplifies the use of the GridBagConstraints class.
  7  * @version 1.01 2004-05-06
  8  * @author Cay Horstmann
  9  */
 10 public class GBC extends GridBagConstraints
 11 {
 12    /**
 13     * Constructs a GBC with a given gridx and gridy position and all other grid
 14     * bag constraint values set to the default.
 15     * @param gridx the gridx position
 16     * @param gridy the gridy position
 17     */
 18    public GBC(int gridx, int gridy)
 19    {
 20       this.gridx = gridx;
 21       this.gridy = gridy;
 22    }
 23 
 24    /**
 25     * Constructs a GBC with given gridx, gridy, gridwidth, gridheight and all
 26     * other grid bag constraint values set to the default.
 27     * @param gridx the gridx position
 28     * @param gridy the gridy position
 29     * @param gridwidth the cell span in x-direction
 30     * @param gridheight the cell span in y-direction
 31     */
 32    public GBC(int gridx, int gridy, int gridwidth, int gridheight)
 33    {
 34       this.gridx = gridx;
 35       this.gridy = gridy;
 36       this.gridwidth = gridwidth;
 37       this.gridheight = gridheight;
 38    }
 39 
 40    /**
 41     * Sets the anchor.
 42     * @param anchor the anchor value
 43     * @return this object for further modification
 44     */
 45    public GBC setAnchor(int anchor)
 46    {
 47       this.anchor = anchor;
 48       return this;
 49    }
 50 
 51    /**
 52     * Sets the fill direction.
 53     * @param fill the fill direction
 54     * @return this object for further modification
 55     */
 56    public GBC setFill(int fill)
 57    {
 58       this.fill = fill;
 59       return this;
 60    }
 61 
 62    /**
 63     * Sets the cell weights.
 64     * @param weightx the cell weight in x-direction
 65     * @param weighty the cell weight in y-direction
 66     * @return this object for further modification
 67     */
 68    public GBC setWeight(double weightx, double weighty)
 69    {
 70       this.weightx = weightx;
 71       this.weighty = weighty;
 72       return this;
 73    }
 74 
 75    /**
 76     * Sets the insets of this cell.
 77     * @param distance the spacing to use in all directions
 78     * @return this object for further modification
 79     */
 80    public GBC setInsets(int distance)
 81    {
 82       this.insets = new Insets(distance, distance, distance, distance);
 83       return this;
 84    }
 85 
 86    /**
 87     * Sets the insets of this cell.
 88     * @param top the spacing to use on top
 89     * @param left the spacing to use to the left
 90     * @param bottom the spacing to use on the bottom
 91     * @param right the spacing to use to the right
 92     * @return this object for further modification
 93     */
 94    public GBC setInsets(int top, int left, int bottom, int right)
 95    {
 96       this.insets = new Insets(top, left, bottom, right);
 97       return this;
 98    }
 99 
100    /**
101     * Sets the internal padding
102     * @param ipadx the internal padding in x-direction
103     * @param ipady the internal padding in y-direction
104     * @return this object for further modification
105     */
106    public GBC setIpad(int ipadx, int ipady)
107    {
108       this.ipadx = ipadx;
109       this.ipady = ipady;
110       return this;
111    }
112 }

实验十四  Swing图形界面组件

实验时间 20178-11-29

1、实验目的与要求

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

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

2、实验内容和步骤

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

测试程序1

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

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

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

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

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("3", insert);
      addButton("6", insert);
      addButton("9", insert);//数字用insert
      addButton("+", command);//命令用command

      addButton("2", insert);
      addButton("5", insert);
      addButton("8", insert);
      addButton("-", command);

      addButton("1", insert);
      addButton("4", insert);
      addButton("7", insert);
      addButton("*", command);

      addButton("0", insert);
      addButton(".", insert);
      addButton("=", command);
      addButton("/", command);

      add(panel, BorderLayout.CENTER);
      //add(display, BorderLayout.NORTH);CENTER
   
      
      JButton b1 = new JButton("验证");
      add(b1,BorderLayout.SOUTH);
      
      JButton br = new JButton("验证1");
      add(br,BorderLayout.WEST);
      
      JButton b2 = new JButton("验证2");
      add(b2,BorderLayout.EAST);
   }

   /**
    * 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()));//用parseDouble把字符串转换成对应的数据
            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);//display的更改器方法;""会吧result转换成字符串数据
   }
}

 

 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       // add color chooser panel to frame
18 
19       ColorChooserPanel panel = new ColorChooserPanel();
20       add(panel);
21    }
22 }
 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 }

技术分享图片

测试程序2

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

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

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

 1 package text;
 2 
 3 import java.awt.*;
 4 import javax.swing.*;
 5 
 6 /**
 7  * @version 1.41 2015-06-12
 8  * @author Cay Horstmann
 9  */
10 public class TextComponentTest
11 {
12    public static void main(String[] args)
13    {
14       EventQueue.invokeLater(() -> {
15          JFrame frame = new TextComponentFrame();
16          frame.setTitle("TextComponentTest");
17          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
18          frame.setVisible(true);
19       });
20    }
21 }
 1 package text;
 2 
 3 import java.awt.BorderLayout;
 4 import java.awt.GridLayout;
 5 
 6 import javax.swing.JButton;
 7 import javax.swing.JFrame;
 8 import javax.swing.JLabel;
 9 import javax.swing.JPanel;
10 import javax.swing.JPasswordField;
11 import javax.swing.JScrollPane;
12 import javax.swing.JTextArea;
13 import javax.swing.JTextField;
14 import javax.swing.SwingConstants;
15 
16 /**
17  * A frame with sample text components.
18  */
19 public class TextComponentFrame extends JFrame
20 {
21    public static final int TEXTAREA_ROWS = 8;
22    public static final int TEXTAREA_COLUMNS = 20;
23 
24    public TextComponentFrame()
25    {
26       JTextField textField = new JTextField();
27       JPasswordField passwordField = new JPasswordField();
28 
29       JPanel northPanel = new JPanel();
30       northPanel.setLayout(new GridLayout(2, 2));
31       northPanel.add(new JLabel("User name: ", SwingConstants.RIGHT));
32       northPanel.add(textField);
33       northPanel.add(new JLabel("Password: ", SwingConstants.RIGHT));
34       northPanel.add(passwordField);
35 
36       add(northPanel, BorderLayout.NORTH);
37 
38       JTextArea textArea = new JTextArea(TEXTAREA_ROWS, TEXTAREA_COLUMNS);
39       JScrollPane scrollPane = new JScrollPane(textArea);
40 
41       add(scrollPane, BorderLayout.CENTER);
42 
43       // add button to append text into the text area
44 
45       JPanel southPanel = new JPanel();
46 
47       JButton insertButton = new JButton("Insert");
48       southPanel.add(insertButton);
49       insertButton.addActionListener(event ->
50          textArea.append("User name: " + textField.getText() + " Password: "
51             + new String(passwordField.getPassword()) + "
"));
52 
53       add(southPanel, BorderLayout.SOUTH);
54       pack();
55    }
56 }

技术分享图片

测试程序3

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

l 掌握复选框组件的用法;

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

 1 package checkBox;
 2 
 3 import java.awt.*;
 4 import java.awt.event.*;
 5 import javax.swing.*;
 6 
 7 /**
 8  * A frame with a sample text label and check boxes for selecting font
 9  * attributes.
10  */
11 public class CheckBoxFrame extends JFrame
12 {
13    private JLabel label;
14    private JCheckBox bold;
15    private JCheckBox italic;
16    private static final int FONTSIZE = 24;
17 
18    public CheckBoxFrame()
19    {
20       // add the sample text label
21 
22       label = new JLabel("ijnjoijojoippkp[kpiooijoijnnjnoi-=0");
23       label.setFont(new Font("Serif", Font.BOLD, FONTSIZE));
24       add(label, BorderLayout.CENTER);
25 
26       // this listener sets the font attribute of
27       // the label to the check box state
28 
29       ActionListener listener = event -> {
30          int mode = 0;
31          if (bold.isSelected()) mode += Font.BOLD;
32          if (italic.isSelected()) mode += Font.ITALIC;
33          label.setFont(new Font("Serif", mode, FONTSIZE));
34       };
35 
36       // add the check boxes
37 
38       JPanel buttonPanel = new JPanel();
39 
40       bold = new JCheckBox("Bold");
41       bold.addActionListener(listener);
42       bold.setSelected(true);
43       buttonPanel.add(bold);
44 
45       italic = new JCheckBox("Italic");
46       italic.addActionListener(listener);
47       buttonPanel.add(italic);
48 
49       add(buttonPanel, BorderLayout.SOUTH);
50       pack();
51    }
52 }
 1 package checkBox;
 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 CheckBoxTest
11 {
12    public static void main(String[] args)
13    {
14       EventQueue.invokeLater(() -> {
15          JFrame frame = new CheckBoxFrame();
16          frame.setTitle("CheckBoxTest");
17          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
18          frame.setVisible(true);
19       });
20    }
21 }

技术分享图片

测试程序4

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

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

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

 1 package radioButton;
 2 
 3 import java.awt.*;
 4 import java.awt.event.*;
 5 import javax.swing.*;
 6 
 7 /**
 8  * A frame with a sample text label and radio buttons for selecting font sizes.
 9  */
10 public class RadioButtonFrame extends JFrame
11 {
12    private JPanel buttonPanel;
13    private ButtonGroup group;
14    private JLabel label;
15    private static final int DEFAULT_SIZE = 36;
16 
17    public RadioButtonFrame()
18    {      
19       // add the sample text label
20 
21       label = new JLabel("The quick brown fox jumps over the lazy dog.");
22       label.setFont(new Font("Serif", Font.PLAIN, DEFAULT_SIZE));
23       add(label, BorderLayout.CENTER);
24 
25       // add the radio buttons
26 
27       buttonPanel = new JPanel();
28       group = new ButtonGroup();
29 
30       addRadioButton("Small", 8);
31       addRadioButton("Medium", 12);
32       addRadioButton("Large", 18);
33       addRadioButton("Extra large", 36);
34 
35       add(buttonPanel, BorderLayout.SOUTH);
36       pack();
37    }
38 
39    /**
40     * Adds a radio button that sets the font size of the sample text.
41     * @param name the string to appear on the button
42     * @param size the font size that this button sets
43     */
44    public void addRadioButton(String name, int size)
45    {
46       boolean selected = size == DEFAULT_SIZE;
47       JRadioButton button = new JRadioButton(name, selected);
48       group.add(button);
49       buttonPanel.add(button);
50 
51       // this listener sets the label font size
52 
53       ActionListener listener = event -> label.setFont(new Font("Serif", Font.PLAIN, size));
54 
55       button.addActionListener(listener);
56    }
57 }
 1 package radioButton;
 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 RadioButtonTest
11 {
12    public static void main(String[] args)
13    {
14       EventQueue.invokeLater(() -> {
15          JFrame frame = new RadioButtonFrame();
16          frame.setTitle("RadioButtonTest");
17          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
18          frame.setVisible(true);
19       });
20    }
21 }

技术分享图片

测试程序5

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

l 掌握边框的用法;

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

 1 package border;
 2 
 3 import java.awt.*;
 4 import javax.swing.*;
 5 import javax.swing.border.*;
 6 
 7 /**
 8  * A frame with radio buttons to pick a border style.
 9  */
10 public class BorderFrame extends JFrame
11 {
12    private JPanel demoPanel;
13    private JPanel buttonPanel;
14    private ButtonGroup group;
15 
16    public BorderFrame()
17    {
18       demoPanel = new JPanel();
19       buttonPanel = new JPanel();
20       group = new ButtonGroup();
21 
22       addRadioButton("Lowered bevel", BorderFactory.createLoweredBevelBorder());
23       addRadioButton("Raised bevel", BorderFactory.createRaisedBevelBorder());
24       addRadioButton("Etched", BorderFactory.createEtchedBorder());
25       addRadioButton("Line", BorderFactory.createLineBorder(Color.BLUE));
26       addRadioButton("Matte", BorderFactory.createMatteBorder(10, 10, 10, 10, Color.BLUE));
27       addRadioButton("Empty", BorderFactory.createEmptyBorder());
28 
29       Border etched = BorderFactory.createEtchedBorder();
30       Border titled = BorderFactory.createTitledBorder(etched, "Border types");
31       buttonPanel.setBorder(titled);
32 
33       setLayout(new GridLayout(2, 1));
34       add(buttonPanel);
35       add(demoPanel);
36       pack();
37    }
38 
39    public void addRadioButton(String buttonName, Border b)
40    {
41       JRadioButton button = new JRadioButton(buttonName);
42       button.addActionListener(event -> demoPanel.setBorder(b));
43       group.add(button);
44       buttonPanel.add(button);
45    }
46 }
 1 package border;
 2 
 3 import java.awt.*;
 4 import javax.swing.*;
 5 
 6 /**
 7  * @version 1.34 2015-06-13
 8  * @author Cay Horstmann
 9  */
10 public class BorderTest
11 {
12    public static void main(String[] args)
13    {
14       EventQueue.invokeLater(() -> {
15          JFrame frame = new BorderFrame();
16          frame.setTitle("BorderTest");
17          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
18          frame.setVisible(true);
19       });
20    }
21 }

技术分享图片

测试程序6

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

l 掌握组合框组件的用法;

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

 1 package comboBox;
 2 
 3 import java.awt.BorderLayout;
 4 import java.awt.Font;
 5 
 6 import javax.swing.JComboBox;
 7 import javax.swing.JFrame;
 8 import javax.swing.JLabel;
 9 import javax.swing.JPanel;
10 
11 /**
12  * A frame with a sample text label and a combo box for selecting font faces.
13  */
14 public class ComboBoxFrame extends JFrame
15 {
16    private JComboBox<String> faceCombo;
17    private JLabel label;
18    private static final int DEFAULT_SIZE = 24;
19 
20    public ComboBoxFrame()
21    {
22       // add the sample text label
23 
24       label = new JLabel("The quick brown fox jumps over the lazy dog.");
25       label.setFont(new Font("Serif", Font.PLAIN, DEFAULT_SIZE));
26       add(label, BorderLayout.CENTER);
27 
28       // make a combo box and add face names
29 
30       faceCombo = new JComboBox<>();
31       faceCombo.addItem("Serif");
32       faceCombo.addItem("SansSerif");
33       faceCombo.addItem("Monospaced");
34       faceCombo.addItem("Dialog");
35       faceCombo.addItem("DialogInput");
36 
37       // the combo box listener changes the label font to the selected face name
38 
39       faceCombo.addActionListener(event ->
40          label.setFont(
41             new Font(faceCombo.getItemAt(faceCombo.getSelectedIndex()), 
42                Font.PLAIN, DEFAULT_SIZE)));
43 
44       // add combo box to a panel at the frame‘s southern border
45 
46       JPanel comboPanel = new JPanel();
47       comboPanel.add(faceCombo);
48       add(comboPanel, BorderLayout.SOUTH);
49       pack();
50    }
51 }
 1 package comboBox;
 2 
 3 import java.awt.*;
 4 import javax.swing.*;
 5 
 6 /**
 7  * @version 1.35 2015-06-12
 8  * @author Cay Horstmann
 9  */
10 public class ComboBoxTest
11 {
12    public static void main(String[] args)
13    {
14       EventQueue.invokeLater(() -> {
15          JFrame frame = new ComboBoxFrame();
16          frame.setTitle("ComboBoxTest");
17          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
18          frame.setVisible(true);
19       });
20    }
21 }

技术分享图片

测试程序7

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

l 掌握滑动条组件的用法;

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

  1 package slider;
  2 
  3 import java.awt.*;
  4 import java.util.*;
  5 import javax.swing.*;
  6 import javax.swing.event.*;
  7 
  8 /**
  9  * A frame with many sliders and a text field to show slider values.
 10  */
 11 public class SliderFrame extends JFrame
 12 {
 13    private JPanel sliderPanel;
 14    private JTextField textField;
 15    private ChangeListener listener;
 16 
 17    public SliderFrame()
 18    {
 19       sliderPanel = new JPanel();
 20       sliderPanel.setLayout(new GridBagLayout());
 21 
 22       // common listener for all sliders
 23       listener = event -> {
 24          // update text field when the slider value changes
 25          JSlider source = (JSlider) event.getSource();
 26          textField.setText("" + source.getValue());
 27       };
 28 
 29       // add a plain slider
 30 
 31       JSlider slider = new JSlider();
 32       addSlider(slider, "Plain");
 33 
 34       // add a slider with major and minor ticks
 35 
 36       slider = new JSlider();
 37       slider.setPaintTicks(true);
 38       slider.setMajorTickSpacing(20);
 39       slider.setMinorTickSpacing(5);
 40       addSlider(slider, "Ticks");
 41 
 42       // add a slider that snaps to ticks
 43 
 44       slider = new JSlider();
 45       slider.setPaintTicks(true);
 46       slider.setSnapToTicks(true);
 47       slider.setMajorTickSpacing(20);
 48       slider.setMinorTickSpacing(5);
 49       addSlider(slider, "Snap to ticks");
 50 
 51       // add a slider with no track
 52 
 53       slider = new JSlider();
 54       slider.setPaintTicks(true);
 55       slider.setMajorTickSpacing(20);
 56       slider.setMinorTickSpacing(5);
 57       slider.setPaintTrack(false);
 58       addSlider(slider, "No track");
 59 
 60       // add an inverted slider
 61 
 62       slider = new JSlider();
 63       slider.setPaintTicks(true);
 64       slider.setMajorTickSpacing(20);
 65       slider.setMinorTickSpacing(5);
 66       slider.setInverted(true);
 67       addSlider(slider, "Inverted");
 68 
 69       // add a slider with numeric labels
 70 
 71       slider = new JSlider();
 72       slider.setPaintTicks(true);
 73       slider.setPaintLabels(true);
 74       slider.setMajorTickSpacing(20);
 75       slider.setMinorTickSpacing(5);
 76       addSlider(slider, "Labels");
 77 
 78       // add a slider with alphabetic labels
 79 
 80       slider = new JSlider();
 81       slider.setPaintLabels(true);
 82       slider.setPaintTicks(true);
 83       slider.setMajorTickSpacing(20);
 84       slider.setMinorTickSpacing(5);
 85 
 86       Dictionary<Integer, Component> labelTable = new Hashtable<>();
 87       labelTable.put(0, new JLabel("A"));
 88       labelTable.put(20, new JLabel("B"));
 89       labelTable.put(40, new JLabel("C"));
 90       labelTable.put(60, new JLabel("D"));
 91       labelTable.put(80, new JLabel("E"));
 92       labelTable.put(100, new JLabel("F"));
 93 
 94       slider.setLabelTable(labelTable);
 95       addSlider(slider, "Custom labels");
 96 
 97       // add a slider with icon labels
 98 
 99       slider = new JSlider();
100       slider.setPaintTicks(true);
101       slider.setPaintLabels(true);
102       slider.setSnapToTicks(true);
103       slider.setMajorTickSpacing(20);
104       slider.setMinorTickSpacing(20);
105 
106       labelTable = new Hashtable<Integer, Component>();
107 
108       // add card images
109 
110       labelTable.put(0, new JLabel(new ImageIcon("nine.gif")));
111       labelTable.put(20, new JLabel(new ImageIcon("ten.gif")));
112       labelTable.put(40, new JLabel(new ImageIcon("jack.gif")));
113       labelTable.put(60, new JLabel(new ImageIcon("queen.gif")));
114       labelTable.put(80, new JLabel(new ImageIcon("king.gif")));
115       labelTable.put(100, new JLabel(new ImageIcon("ace.gif")));
116 
117       slider.setLabelTable(labelTable);
118       addSlider(slider, "Icon labels");
119 
120       // add the text field that displays the slider value
121 
122       textField = new JTextField();
123       add(sliderPanel, BorderLayout.CENTER);
124       add(textField, BorderLayout.SOUTH);
125       pack();
126    }
127 
128    /**
129     * Adds a slider to the slider panel and hooks up the listener
130     * @param s the slider
131     * @param description the slider description
132     */
133    public void addSlider(JSlider s, String description)
134    {
135       s.addChangeListener(listener);
136       JPanel panel = new JPanel();
137       panel.add(s);
138       panel.add(new JLabel(description));
139       panel.setAlignmentX(Component.LEFT_ALIGNMENT);
140       GridBagConstraints gbc = new GridBagConstraints();
141       gbc.gridy = sliderPanel.getComponentCount();
142       gbc.anchor = GridBagConstraints.WEST;
143       sliderPanel.add(panel, gbc);
144    }
145 }
 1 package slider;
 2 
 3 import java.awt.*;
 4 import javax.swing.*;
 5 
 6 /**
 7  * @version 1.15 2015-06-12
 8  * @author Cay Horstmann
 9  */
10 public class SliderTest
11 {
12    public static void main(String[] args)
13    {
14       EventQueue.invokeLater(() -> {
15          SliderFrame frame = new SliderFrame();
16          frame.setTitle("SliderTest");
17          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
18          frame.setVisible(true);
19       });
20    }
21 }

技术分享图片

测试程序8

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

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

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

  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 
 18    /**
 19     * A sample action that prints the action name to System.out
 20     */
 21    class TestAction extends AbstractAction
 22    {
 23       public TestAction(String name)
 24       {
 25          super(name);
 26       }
 27 
 28       public void actionPerformed(ActionEvent event)
 29       {
 30          System.out.println(getValue(Action.NAME) + " selected.");
 31       }
 32    }
 33 
 34    public MenuFrame()
 35    {
 36       setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
 37 
 38       JMenu fileMenu = new JMenu("File");
 39       fileMenu.add(new TestAction("New"));
 40 
 41       // demonstrate accelerators
 42 
 43       JMenuItem openItem = fileMenu.add(new TestAction("Open"));
 44       openItem.setAccelerator(KeyStroke.getKeyStroke("ctrl O"));
 45 
 46       fileMenu.addSeparator();
 47 
 48       saveAction = new TestAction("Save");
 49       JMenuItem saveItem = fileMenu.add(saveAction);
 50       saveItem.setAccelerator(KeyStroke.getKeyStroke("ctrl S"));
 51 
 52       saveAsAction = new TestAction("Save As");
 53       fileMenu.add(saveAsAction);
 54       fileMenu.addSeparator();
 55 
 56       fileMenu.add(new AbstractAction("Exit")
 57          {
 58             public void actionPerformed(ActionEvent event)
 59             {
 60                System.exit(0);
 61             }
 62          });
 63 
 64       // demonstrate checkbox and radio button menus
 65 
 66       readonlyItem = new JCheckBoxMenuItem("Read-only");
 67       readonlyItem.addActionListener(new ActionListener()
 68          {
 69             public void actionPerformed(ActionEvent event)
 70             {
 71                boolean saveOk = !readonlyItem.isSelected();
 72                saveAction.setEnabled(saveOk);
 73                saveAsAction.setEnabled(saveOk);
 74             }
 75          });
 76 
 77       ButtonGroup group = new ButtonGroup();
 78 
 79       JRadioButtonMenuItem insertItem = new JRadioButtonMenuItem("Insert");
 80       insertItem.setSelected(true);
 81       JRadioButtonMenuItem overtypeItem = new JRadioButtonMenuItem("Overtype");
 82 
 83       group.add(insertItem);
 84       group.add(overtypeItem);
 85 
 86       // demonstrate icons
 87 
 88       Action cutAction = new TestAction("Cut");
 89       cutAction.putValue(Action.SMALL_ICON, new ImageIcon("cut.gif"));
 90       Action copyAction = new TestAction("Copy");
 91       copyAction.putValue(Action.SMALL_ICON, new ImageIcon("copy.gif"));
 92       Action pasteAction = new TestAction("Paste");
 93       pasteAction.putValue(Action.SMALL_ICON, new ImageIcon("paste.gif"));
 94 
 95       JMenu editMenu = new JMenu("Edit");
 96       editMenu.add(cutAction);
 97       editMenu.add(copyAction);
 98       editMenu.add(pasteAction);
 99 
100       // demonstrate nested menus
101 
102       JMenu optionMenu = new JMenu("Options");
103 
104       optionMenu.add(readonlyItem);
105       optionMenu.addSeparator();
106       optionMenu.add(insertItem);
107       optionMenu.add(overtypeItem);
108 
109       editMenu.addSeparator();
110       editMenu.add(optionMenu);
111 
112       // demonstrate mnemonics
113 
114       JMenu helpMenu = new JMenu("Help");
115       helpMenu.setMnemonic(‘H‘);
116 
117       JMenuItem indexItem = new JMenuItem("Index");
118       indexItem.setMnemonic(‘I‘);
119       helpMenu.add(indexItem);
120 
121       // you can also add the mnemonic key to an action
122       Action aboutAction = new TestAction("About");
123       aboutAction.putValue(Action.MNEMONIC_KEY, new Integer(‘A‘));
124       helpMenu.add(aboutAction);
125       
126       // add all top-level menus to menu bar
127 
128       JMenuBar menuBar = new JMenuBar();
129       setJMenuBar(menuBar);
130 
131       menuBar.add(fileMenu);
132       menuBar.add(editMenu);
133       menuBar.add(helpMenu);
134 
135       // demonstrate pop-ups
136 
137       popup = new JPopupMenu();
138       popup.add(cutAction);
139       popup.add(copyAction);
140       popup.add(pasteAction);
141 
142       JPanel panel = new JPanel();
143       panel.setComponentPopupMenu(popup);
144       add(panel);
145    }
146 }
 1 package menu;
 2 
 3 import java.awt.*;
 4 import javax.swing.*;
 5 
 6 /**
 7  * @version 1.24 2012-06-12
 8  * @author Cay Horstmann
 9  */
10 public class MenuTest
11 {
12    public static void main(String[] args)
13    {
14       EventQueue.invokeLater(() -> {
15          JFrame frame = new MenuFrame();
16          frame.setTitle("MenuTest");
17          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
18          frame.setVisible(true);
19       });
20    }
21 }

技术分享图片

测试程序9

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

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

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

 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       // add a panel for color change
21 
22       panel = new JPanel();
23       add(panel, BorderLayout.CENTER);
24 
25       // set up actions
26 
27       Action blueAction = new ColorAction("Blue", new ImageIcon("blue-ball.gif"), Color.BLUE);
28       Action yellowAction = new ColorAction("Yellow", new ImageIcon("yellow-ball.gif"),
29             Color.YELLOW);
30       Action redAction = new ColorAction("Red", new ImageIcon("red-ball.gif"), Color.RED);
31 
32       Action exitAction = new AbstractAction("Exit", new ImageIcon("exit.gif"))
33          {
34             public void actionPerformed(ActionEvent event)
35             {
36                System.exit(0);
37             }
38          };
39       exitAction.putValue(Action.SHORT_DESCRIPTION, "Exit");
40 
41       // populate toolbar
42 
43       JToolBar 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       // populate menu
52 
53       JMenu menu = new JMenu("Color");
54       menu.add(yellowAction);
55       menu.add(blueAction);
56       menu.add(redAction);
57       menu.add(exitAction);
58       JMenuBar menuBar = new JMenuBar();
59       menuBar.add(menu);
60       setJMenuBar(menuBar);
61    }
62 
63    /**
64     * The color action sets the background of the frame to a given color.
65     */
66    class ColorAction extends AbstractAction
67    {
68       public ColorAction(String name, Icon icon, Color c)
69       {
70          putValue(Action.NAME, name);
71          putValue(Action.SMALL_ICON, icon);
72          putValue(Action.SHORT_DESCRIPTION, name + " background");
73          putValue("Color", c);
74       }
75 
76       public void actionPerformed(ActionEvent event)
77       {
78          Color c = (Color) getValue("Color");
79          panel.setBackground(c);
80       }
81    }
82 }

 

 1 package toolBar;
 2 
 3 import java.awt.*;
 4 import javax.swing.*;
 5 
 6 /**
 7  * @version 1.14 2015-06-12
 8  * @author Cay Horstmann
 9  */
10 public class ToolBarTest
11 {
12    public static void main(String[] args)
13    {
14       EventQueue.invokeLater(() -> {
15          ToolBarFrame frame = new ToolBarFrame();
16          frame.setTitle("ToolBarTest");
17          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
18          frame.setVisible(true);
19       });
20    }
21 }

技术分享图片

测试程序10

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

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

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

 1 package gridbag;
 2 
 3 import java.awt.Font;
 4 import java.awt.GridBagLayout;
 5 import java.awt.event.ActionListener;
 6 
 7 import javax.swing.BorderFactory;
 8 import javax.swing.JCheckBox;
 9 import javax.swing.JComboBox;
10 import javax.swing.JFrame;
11 import javax.swing.JLabel;
12 import javax.swing.JTextArea;
13 
14 /**
15  * A frame that uses a grid bag layout to arrange font selection components.
16  */
17 public class FontFrame extends JFrame
18 {
19    public static final int TEXT_ROWS = 10;
20    public static final int TEXT_COLUMNS = 20;
21 
22    private JComboBox<String> face;
23    private JComboBox<Integer> size;
24    private JCheckBox bold;
25    private JCheckBox italic;
26    private JTextArea sample;
27 
28    public FontFrame()
29    {
30       GridBagLayout layout = new GridBagLayout();
31       setLayout(layout);
32 
33       ActionListener listener = event -> updateSample();
34 
35       // construct components
36 
37       JLabel faceLabel = new JLabel("Face: ");
38 
39       face = new JComboBox<>(new String[] { "Serif", "SansSerif", "Monospaced",
40             "Dialog", "DialogInput" });
41 
42       face.addActionListener(listener);
43 
44       JLabel sizeLabel = new JLabel("Size: ");
45 
46       size = new JComboBox<>(new Integer[] { 8, 10, 12, 15, 18, 24, 36, 48 });
47 
48       size.addActionListener(listener);
49 
50       bold = new JCheckBox("Bold");
51       bold.addActionListener(listener);
52 
53       italic = new JCheckBox("Italic");
54       italic.addActionListener(listener);
55 
56       sample = new JTextArea(TEXT_ROWS, TEXT_COLUMNS);
57       sample.setText("The quick brown fox jumps over the lazy dog");
58       sample.setEditable(false);
59       sample.setLineWrap(true);
60       sample.setBorder(BorderFactory.createEtchedBorder());
61 
62       // add components to grid, using GBC convenience class
63 
64       add(faceLabel, new GBC(0, 0).setAnchor(GBC.EAST));
65       add(face, new GBC(1, 0).setFill(GBC.HORIZONTAL).setWeight(100, 0)
66             .setInsets(1));
67       add(sizeLabel, new GBC(0, 1).setAnchor(GBC.EAST));
68       add(size, new GBC(1, 1).setFill(GBC.HORIZONTAL).setWeight(100, 0)
69             .setInsets(1));
70       add(bold, new GBC(0, 2, 2, 1).setAnchor(GBC.CENTER).setWeight(100, 100));
71       add(italic, new GBC(0, 3, 2, 1).setAnchor(GBC.CENTER).setWeight(100, 100));
72       add(sample, new GBC(2, 0, 1, 4).setFill(GBC.BOTH).setWeight(100, 100));
73       pack();
74       updateSample();
75    }
76 
77    public void updateSample()
78    {
79       String fontFace = (String) face.getSelectedItem();
80       int fontStyle = (bold.isSelected() ? Font.BOLD : 0)
81             + (italic.isSelected() ? Font.ITALIC : 0);
82       int fontSize = size.getItemAt(size.getSelectedIndex());
83       Font font = new Font(fontFace, fontStyle, fontSize);
84       sample.setFont(font);
85       sample.repaint();
86    }
87 }
 1 package gridbag;
 2 
 3 import java.awt.EventQueue;
 4 
 5 import javax.swing.JFrame;
 6 
 7 /**
 8  * @version 1.35 2015-06-12
 9  * @author Cay Horstmann
10  */
11 public class GridBagLayoutTest
12 {
13    public static void main(String[] args)
14    {
15       EventQueue.invokeLater(() ->           {
16                JFrame frame = new FontFrame();
17                frame.setTitle("GridBagLayoutTest");
18                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
19                frame.setVisible(true);
20          });
21    }
22 }

技术分享图片

  1 package groupLayout;
  2 
  3 import java.awt.Font;
  4 import java.awt.event.ActionListener;
  5 
  6 import javax.swing.BorderFactory;
  7 import javax.swing.GroupLayout;
  8 import javax.swing.JCheckBox;
  9 import javax.swing.JComboBox;
 10 import javax.swing.JFrame;
 11 import javax.swing.JLabel;
 12 import javax.swing.JScrollPane;
 13 import javax.swing.JTextArea;
 14 import javax.swing.LayoutStyle;
 15 import javax.swing.SwingConstants;
 16 
 17 /**
 18  * A frame that uses a group layout to arrange font selection components.
 19  */
 20 public class FontFrame extends JFrame
 21 {
 22    public static final int TEXT_ROWS = 10;
 23    public static final int TEXT_COLUMNS = 20;
 24 
 25    private JComboBox<String> face;
 26    private JComboBox<Integer> size;
 27    private JCheckBox bold;
 28    private JCheckBox italic;
 29    private JScrollPane pane;
 30    private JTextArea sample;
 31 
 32    public FontFrame()
 33    {
 34       ActionListener listener = event -> updateSample(); 
 35 
 36       // construct components
 37 
 38       JLabel faceLabel = new JLabel("Face: ");
 39 
 40       face = new JComboBox<>(new String[] { "Serif", "SansSerif", "Monospaced", "Dialog",
 41             "DialogInput" });
 42 
 43       face.addActionListener(listener);
 44 
 45       JLabel sizeLabel = new JLabel("Size: ");
 46 
 47       size = new JComboBox<>(new Integer[] { 8, 10, 12, 15, 18, 24, 36, 48 });
 48 
 49       size.addActionListener(listener);
 50 
 51       bold = new JCheckBox("Bold");
 52       bold.addActionListener(listener);
 53 
 54       italic = new JCheckBox("Italic");
 55       italic.addActionListener(listener);
 56 
 57       sample = new JTextArea(TEXT_ROWS, TEXT_COLUMNS);
 58       sample.setText("The quick brown fox jumps over the lazy dog");
 59       sample.setEditable(false);
 60       sample.setLineWrap(true);
 61       sample.setBorder(BorderFactory.createEtchedBorder());
 62 
 63       pane = new JScrollPane(sample);
 64 
 65       GroupLayout layout = new GroupLayout(getContentPane());
 66       setLayout(layout);
 67       layout.setHorizontalGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
 68             .addGroup(
 69                   layout.createSequentialGroup().addContainerGap().addGroup(
 70                         layout.createParallelGroup(GroupLayout.Alignment.LEADING).addGroup(
 71                               GroupLayout.Alignment.TRAILING,
 72                               layout.createSequentialGroup().addGroup(
 73                                     layout.createParallelGroup(GroupLayout.Alignment.TRAILING)
 74                                           .addComponent(faceLabel).addComponent(sizeLabel))
 75                                     .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
 76                                     .addGroup(
 77                                           layout.createParallelGroup(
 78                                                 GroupLayout.Alignment.LEADING, false)
 79                                                 .addComponent(size).addComponent(face)))
 80                               .addComponent(italic).addComponent(bold)).addPreferredGap(
 81                         LayoutStyle.ComponentPlacement.RELATED).addComponent(pane)
 82                         .addContainerGap()));
 83 
 84       layout.linkSize(SwingConstants.HORIZONTAL, new java.awt.Component[] { face, size });
 85 
 86       layout.setVerticalGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
 87             .addGroup(
 88                   layout.createSequentialGroup().addContainerGap().addGroup(
 89                         layout.createParallelGroup(GroupLayout.Alignment.LEADING).addComponent(
 90                               pane, GroupLayout.Alignment.TRAILING).addGroup(
 91                               layout.createSequentialGroup().addGroup(
 92                                     layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
 93                                           .addComponent(face).addComponent(faceLabel))
 94                                     .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
 95                                     .addGroup(
 96                                           layout.createParallelGroup(
 97                                                 GroupLayout.Alignment.BASELINE).addComponent(size)
 98                                                 .addComponent(sizeLabel)).addPreferredGap(
 99                                           LayoutStyle.ComponentPlacement.RELATED).addComponent(
100                                           italic, GroupLayout.DEFAULT_SIZE,
101                                           GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
102                                     .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
103                                     .addComponent(bold, GroupLayout.DEFAULT_SIZE,
104                                           GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
105                         .addContainerGap()));
106       pack();
107    }
108    
109    public void updateSample()
110    {
111       String fontFace = (String) face.getSelectedItem();
112       int fontStyle = (bold.isSelected() ? Font.BOLD : 0)
113             + (italic.isSelected() ? Font.ITALIC : 0);
114       int fontSize = size.getItemAt(size.getSelectedIndex());
115       Font font = new Font(fontFace, fontStyle, fontSize);
116       sample.setFont(font);
117       sample.repaint();
118    }
119 }
 1 package groupLayout;
 2 
 3 import java.awt.EventQueue;
 4 
 5 import javax.swing.JFrame;
 6 
 7 /**
 8  * @version 1.01 2015-06-12
 9  * @author Cay Horstmann
10  */
11 public class GroupLayoutTest
12 {
13    public static void main(String[] args)
14    {
15       EventQueue.invokeLater(() -> {
16          JFrame frame = new FontFrame();
17          frame.setTitle("GroupLayoutTest");
18          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
19          frame.setVisible(true);
20       });
21    }
22 }

技术分享图片

测试程序11

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

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

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

  1 package circleLayout;
  2 
  3 import java.awt.*;
  4 
  5 /**
  6  * A layout manager that lays out components along a circle.
  7  */
  8 public class CircleLayout implements LayoutManager
  9 {
 10    private int minWidth = 0;
 11    private int minHeight = 0;
 12    private int preferredWidth = 0;
 13    private int preferredHeight = 0;
 14    private boolean sizesSet = false;
 15    private int maxComponentWidth = 0;
 16    private int maxComponentHeight = 0;
 17 
 18    public void addLayoutComponent(String name, Component comp)
 19    {
 20    }
 21 
 22    public void removeLayoutComponent(Component comp)
 23    {
 24    }
 25 
 26    public void setSizes(Container parent)
 27    {
 28       if (sizesSet) return;
 29       int n = parent.getComponentCount();
 30 
 31       preferredWidth = 0;
 32       preferredHeight = 0;
 33       minWidth = 0;
 34       minHeight = 0;
 35       maxComponentWidth = 0;
 36       maxComponentHeight = 0;
 37 
 38       // compute the maximum component widths and heights
 39       // and set the preferred size to the sum of the component sizes.
 40       for (int i = 0; i < n; i++)
 41       {
 42          Component c = parent.getComponent(i);
 43          if (c.isVisible())
 44          {
 45             Dimension d = c.getPreferredSize();
 46             maxComponentWidth = Math.max(maxComponentWidth, d.width);
 47             maxComponentHeight = Math.max(maxComponentHeight, d.height);
 48             preferredWidth += d.width;
 49             preferredHeight += d.height;
 50          }
 51       }
 52       minWidth = preferredWidth / 2;
 53       minHeight = preferredHeight / 2;
 54       sizesSet = true;
 55    }
 56 
 57    public Dimension preferredLayoutSize(Container parent)
 58    {
 59       setSizes(parent);
 60       Insets insets = parent.getInsets();
 61       int width = preferredWidth + insets.left + insets.right;
 62       int height = preferredHeight + insets.top + insets.bottom;
 63       return new Dimension(width, height);
 64    }
 65 
 66    public Dimension minimumLayoutSize(Container parent)
 67    {
 68       setSizes(parent);
 69       Insets insets = parent.getInsets();
 70       int width = minWidth + insets.left + insets.right;
 71       int height = minHeight + insets.top + insets.bottom;
 72       return new Dimension(width, height);
 73    }
 74 
 75    public void layoutContainer(Container parent)
 76    {
 77       setSizes(parent);
 78 
 79       // compute center of the circle
 80 
 81       Insets insets = parent.getInsets();
 82       int containerWidth = parent.getSize().width - insets.left - insets.right;
 83       int containerHeight = parent.getSize().height - insets.top - insets.bottom;
 84 
 85       int xcenter = insets.left + containerWidth / 2;
 86       int ycenter = insets.top + containerHeight / 2;
 87 
 88       // compute radius of the circle
 89 
 90       int xradius = (containerWidth - maxComponentWidth) / 2;
 91       int yradius = (containerHeight - maxComponentHeight) / 2;
 92       int radius = Math.min(xradius, yradius);
 93 
 94       // lay out components along the circle
 95 
 96       int n = parent.getComponentCount();
 97       for (int i = 0; i < n; i++)
 98       {
 99          Component c = parent.getComponent(i);
100          if (c.isVisible())
101          {
102             double angle = 2 * Math.PI * i / n;
103 
104             // center point of component
105             int x = xcenter + (int) (Math.cos(angle) * radius);
106             int y = ycenter + (int) (Math.sin(angle) * radius);
107 
108             // move component so that its center is (x, y)
109             // and its size is its preferred size
110             Dimension d = c.getPreferredSize();
111             c.setBounds(x - d.width / 2, y - d.height / 2, d.width, d.height);
112          }
113       }
114    }
115 }
 1 package circleLayout;
 2 
 3 import javax.swing.*;
 4 
 5 /**
 6  * A frame that shows buttons arranged along a circle.
 7  */
 8 public class CircleLayoutFrame extends JFrame
 9 {
10    public CircleLayoutFrame()
11    {
12       setLayout(new CircleLayout());
13       add(new JButton("Yellow"));
14       add(new JButton("Blue"));
15       add(new JButton("Red"));
16       add(new JButton("Green"));
17       add(new JButton("Orange"));
18       add(new JButton("Fuchsia"));
19       add(new JButton("Indigo"));
20       pack();
21    }
22 }
 1 package circleLayout;
 2 
 3 import java.awt.*;
 4 import javax.swing.*;
 5 
 6 /**
 7  * @version 1.33 2015-06-12
 8  * @author Cay Horstmann
 9  */
10 public class CircleLayoutTest
11 {
12    public static void main(String[] args)
13    {
14       EventQueue.invokeLater(() -> {
15          JFrame frame = new CircleLayoutFrame();
16          frame.setTitle("CircleLayoutTest");
17          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
18          frame.setVisible(true);
19       });
20    }
21 }

技术分享图片

测试程序12

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

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

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

package optionDialog;

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();

      // 为每个选项做一个单选按钮
      for (String option : options)
      {
         JRadioButton b = new JRadioButton(option);
         b.setActionCommand(option);
         add(b);
         group.add(b);
         b.setSelected(option == options[0]);
      }
   }

   /**
    *获取当前选中的选项。
    * @返回当前选定的单选按钮的标签。
    */
   public String getSelection()
   {
      return group.getSelection().getActionCommand();
   }
}

 

  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  * 包含用于选择各种选项对话框的设置的框架。
 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     * 获取当前选定的消息
 61     *@返回字符串、图标、组件或对象数组,这取决于邮件面板的选择
 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     * 获取当前选中的选项。
 77     * @根据选项面板的选择,返回字符串、图标或对象的数组
 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     *获取选定的消息或选项类型
 92     * @param面板消息类型或确认面板
 93     *@返回从joptigan类中选择的xxx_消息或xxx_选项常量
 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     * 显示按钮的动作侦听器显示确认、输入、讯息或选项对话框
110     * 取决于类型面板选择。
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  * 有油漆表面的组件。
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 }

 

 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 }

 

技术分享图片

测试程序13

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       // add html label to center
21 
22       add(
23             new JLabel(
24                   "<html><h1><i>Core Java</i></h1><hr>By Cay Horstmann</html>"),
25             BorderLayout.CENTER);
26 
27       // OK button closes the dialog
28 
29       JButton ok = new JButton("OK");
30       ok.addActionListener(event -> setVisible(false));
31 
32       // add OK button to southern border
33 
34       JPanel panel = new JPanel();
35       panel.add(ok);
36       add(panel, BorderLayout.SOUTH);
37 
38       pack();
39    }
40 }
 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       // Construct a File menu.
22 
23       JMenuBar menuBar = new JMenuBar();
24       setJMenuBar(menuBar);
25       JMenu fileMenu = new JMenu("File");
26       menuBar.add(fileMenu);
27 
28       // Add About and Exit menu items.
29 
30       // The About item shows the About dialog.
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       // The Exit item exits the program.
41 
42       JMenuItem exitItem = new JMenuItem("Exit");
43       exitItem.addActionListener(event -> System.exit(0));
44       fileMenu.add(exitItem);
45    }
46 }
 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 }

技术分享图片

测试程序14

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       // construct a File menu
20 
21       JMenuBar mbar = new JMenuBar();
22       setJMenuBar(mbar);
23       JMenu fileMenu = new JMenu("File");
24       mbar.add(fileMenu);
25 
26       // add Connect and Exit menu items
27 
28       JMenuItem connectItem = new JMenuItem("Connect");
29       connectItem.addActionListener(new ConnectAction());
30       fileMenu.add(connectItem);
31 
32       // The Exit item exits the program
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          // if first time, construct dialog
51 
52          if (dialog == null) dialog = new PasswordChooser();
53 
54          // set default values
55          dialog.setUser(new User("yourname", null));
56 
57          // pop up dialog
58          if (dialog.showDialog(DataExchangeFrame.this, "Connect"))
59          {
60             // if accepted, retrieve user input
61             User u = dialog.getUser();
62             textArea.append("user name = " + u.getName() + ", password = "
63                   + (new String(u.getPassword())) + "
");
64          }
65       }
66    }
67 }
 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 }
  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       // construct a panel with user name and password fields
 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       // create Ok and Cancel buttons that terminate the dialog
 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       // add buttons to southern border
 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 }
 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 }

技术分享图片

测试程序15

l 在elipse IDE中调试运行教材556页程序12-21、12-2212-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 }
 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 }
 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             // read the image into an icon
35             ImageIcon icon = new ImageIcon(f.getPath());
36 
37             // if the icon is too large to fit, scale it
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 }
 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          // show file chooser dialog
37             int result = chooser.showOpenDialog(ImageViewerFrame.this);
38 
39             // if image file accepted, set it as icon of the label
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       // use a label to display the images
53       label = new JLabel();
54       add(label);
55 
56       // set up file chooser
57       chooser = new JFileChooser();
58 
59       // accept all image files ending with .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 }

技术分享图片

测试程序16

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

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

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 }
 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 }
 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 }

技术分享图片

实验总结:

BorderLayout( ) :创建新的BorderLayout,组件之间没有间距 ;setHgap(int hgap) :将组件间的水平间距设置为指定的值; setVgap(int vgap) :将组件间的垂直间距设置为指定的值

GridLayout (网格布局管理器):网格布局按行列排列所有的组件;在网格布局对象的构造器中,需要指定行数和列数: panel.setLayout(new GridLayout(6,10));放置组件的每个单元具有相同的尺寸。添加组件,从第一行和第一列开始,然后是第一行的第二列。以此类推。

GridLayout:指定网格中的行数和列数,创建网格布局

GridLayout的使用方法:GridLayout的构造函数如下:(1)GridLayout():生成一个单行单列的网格布局(2)GridLayout(int rows,int cols):生成一个设定行数和列数的网格布局 (3)GridLayout(int rows,int columns,int hgap,int vgap): 可以设置组件之间的水平和垂直间隔

由于网格中所有单元的宽度、高度是相同的,所以Grid布局管理器总是忽略组件的最佳大小。将组件添加到网格中的命令次序决定组件占有的单元。单元的列数是从左到右填充,而行是从上到下由行填充。

文本域(JTextField) : 用于获取单行文本输入。文本域的使用方法:JPanel panel = new JPanel(); JTextField textField = new JTextField("Default input", 20); panel.add(textField);第一个参数“Default input”:将文本域的缺省显示值为Default input ;第二个参数20:表示文本域显示宽度为20列。若要重新设置列数,可使用setColumns方法。

文本输入常用API:用于文本输入的组件继承于JTextComponent抽象类, java.swing.text.JTextComponent 1.2:String getText() ;  void setText(String text) 获取或设置文本组件中的文本 。 boolean isEditable() ; void setEditable(boolean b) 获取或设置editable特性,这个特性决定了用户是否可以编辑文本组件中的内容。 Java.swing. JComponent : void revalidate( ) :重新计算容器内所有组件的大小和位置,并对它们重新布局。 如 panel.revalidate()

文本域JTextField常用API : Java.swing. JTextField:  JTextField(int cols) 构造一个指定列数的空JTextField对象。  JTextField(String text,int cols) 构造一个指定列数、指定初始字符串的JTextField对象 。 int getColumns(int cols) ; void setColumns(int cols) 获取或设置文本域使用的列数

文本域初始化 :只要不为JTextField构造器提供字符串参数,就可以构造一个空白文本域。 JTextField textField=newJTextField(20);可在任何时候调用setText方法改变文本域内容。 textField.setText("Hello!"); 可调用getText方法获取键入的文本。要将返回的文本域内容的前后空格去掉,就需调用trim方法:String text=textField.getText().trim();若想改变显示文本的字体,则调用setFont方法。

文本区(JTextArea)组件可让用户输入多行文本。生成JTextArea组件对象时,可以指定文本区的行数和列数: textArea = new JTextArea(8, 40); // 8行40列。输入时,如果文本区的文本超出显示范围,则其余的文本会被剪裁;可以使用换行来避免过长的行被裁减: textArea.setLineWrap(true);在Swing中,文本区没有滚动条,需要手动安装 :JScrollPane scrollPane = new JScrollPane(textArea)

文本区与文本域的异同相同之处: 文本域和文本区组件都可用于获取文本输入。 不同之处:文本域只能接受单行文本的输入;文本区能够接受多行文本的输入。

文本区JTextArea的常用API:JTextArea(int rows, int cols) 构造一个rows行cols列的文本区对象 。JTextArea(String text,int rows, int cols) 用初始文本构造一个文本区对象。void setRows(int rows) 设置文本域使用的行数。 void append(String newText) 将给定文本附加到文本区中已有文本的后面。 void setLineWrap(boolean wrap) 打开或关闭换行。

标签是容纳文本的组件。它们没有任何修饰(如没有边界 ),也不响应用户输入。标签的常用用途之一就是标识组件,例如标识文本域。其使用步骤如下: 1. 创建一个JLabel组件。例: JLabel label = new JLabel(“hours”, SwingConstants.RIGHT); 或者 JLabel label = new JLabel(“hours”, JLabel.RIGHT);以上代码创建了一个label,并指定label的对齐方式为右对齐。 2. 将标签组件放置在距离被标识组件足够近的地方。

标签组件常用API:JLable(String text)   JLable(Icon icon)    JLable(String text,int align) JLable(String text,Icon icon,int align) 构造一个标签。 String getText()   void setText(String text) 获取或设置标签的文本。 Icon getIcon()   void setIcon(Icon icon) 获取或设置标签的图标

密码域是一种特殊类型的文本域。每个输入的字符都用回显字符实现,典型的回显字符为*。

复选框( JCheckBox ):如果想要接收的输入只是“是”或“非”,就可以使用复选框组件。用户通过单击某个复选框来选择相应的选项,再点击则取消选择。当复选框获得焦点时,用户也可以通过空格键来切换选择。

复选框构造器:1.bold = new JCheckBox("Bold"); 复选框自动地带有表示标签。 2. JCheckBox(String label,Icon icon); 构造带有标签与图标的复选框,默认初始未被选择。 3.JCheckBox(String label,boolean state); 用指定的标签和初始化选择状态构造一个复选框

复选框常用API: 1.void setSelected(boolean state); 设置复选框的选择状态 2.boolean isSelected(); 获取复选框的选择状态

单选按钮:当需要用户只选择几个选项中的一个。即当用户选择另一项的时候,前一项就自动的取消选择。

单选按钮的构造器:1.JRadioButton(String label,Icon icon); 创建一个带标签和图标的单选按钮 2.JRadioButton(String label,boolean state); 用指定的标签和初始化状态构造单选按钮

按钮组:为单选按钮组构造一个ButtonGroup的对象。 然后,再将JRadioButton类型的对象添加到按钮组中。按钮组负责在新按钮被按下的时,取消前一个按钮的选择状态。 ButtonGroup group = new ButtonGroup() group.add(JRadioButton对象); 注意:按钮组仅仅控制按钮的行为,如果想把这些按钮组织在一起布局,还需要把它们添加到容器中 ,如JPanel.

边框:如果在一个窗口中有多组复选框或单选按 钮,就需要可视化的形式指明哪些按钮属于同 一组。Swing提供了一 组很有用的边框 ( borders)来解决这个问题。

边框的创建方法:可以调用BorderFactory类的静态方法创建。可选的风格有:凹斜面:BorderFactory.createLoweredBevelBorder() 凸斜面:BorderFactory.createRaisedBevelBorder() 蚀刻:BorderFactory.createEtchedBorder() 直线:BorderFactory.createLineBorder(Color) 不光滑:BorderFactory.createMatteBorder()还可以给边框加标题 BorderFactory.createTitledBorder()

组合框:如果有多个选择项,使用单选按钮占据的屏幕空间太大时,就可以选择组合框。

组合框构造器与常用方法:faceCombo = new JComboBox(); faceCombo.setEditable(true); 让组合框可编辑 faceCombo.addItem("Serif"); faceCombo.insertItemAt("Monospace",0); 增加组合框选项 faceCombo.removeItem("Monospace"); faceCombo.removeItemAt(0); 删除组合框选项内容

滑动条( JSlider ):可以让用户从一组离散值中进行选择,并且它还允许进行连续值得选择。

滑动条的修饰可通过显示标尺(tricks)对滑动条进行修饰。 slider.setMajorTickSpacing(20); 大标尺标记 slider.setMinorTickSpacing(5); 小标尺标记要想显示以上标记,还需调用: slider.setPaintTicks(true);

可以调用下列方法为大标尺添加标尺标签: slider.setPaintLabels(true); 会根据构建标尺时的min,max,和大标尺的间距自动添加 还可以提供其他形式的标尺标记: Hashtable<integer,component> labelTable = new Hashtable<integer,component>(); 构造一个键为Integer类型且值为Component类型 的散列表。

菜单的创建:首先创建一个菜单栏菜单栏是一个可以添加到容器组件任何位置的组件。通常放置在框架的顶部。 JMenuBar menuBar=new JMenuBar();调用框架的setJMenuBar方法可将一个菜单栏对象添加到框架上 frame.setJMenuBar(menuBar); 创建菜单对象,并将菜单对象添加到菜单栏中 JMenu editMenu=new Jmenu("Edit"); menuBar.add(editMenu);向菜单对象添加一个菜单项。 JMenItem pasteItem=new JMenItem(); editMenu.add(pasteItem); 向菜单对象添加分隔符行。 editMenu.addSeperator();向菜单对象项添加子菜单。 JMenu optionsMenu=new Jmenu(“option”); editMenu.add(optionsMenu);

弹出菜单是不固定在菜单栏中随处浮动的菜单。

创建弹出菜单:创建一个弹出菜单与创建一个常规菜单的方法类似,但是弹出菜单没有标题: JPopupMenu popup = new JPopupMenu();然后用常规方法为弹出菜单添加菜单项: JMenuItem item = new JMenuItem("Cut"); item.addActionListener(listener); popup.add(item);弹出菜单调用show方法才能显示出来: popup.show(panel,x,y);

弹出式触发器(pop-up trigger):用户点击鼠标某个键时弹出菜单。在Windows或者Linux中,弹出式触发器是鼠标右键。要想在用户点击某一个组件的时候弹出菜单,该组件就要调用以下方法设置弹出式触发器:component.setComponentPopupMenu(popup);

快捷键:可以为菜单项设置快捷键。在当前菜单打开的情况下,可以按下某菜单项的快捷键,相当于鼠标单击了该菜单项。JMenuItem CutItem=new JMenuItem(" Index "); CutItem.setMnemonic(" I ");此快捷键就会自动显示在菜单项中,快捷键下面有一条下划线。

加速器:加速器可以在不打开菜单的情况下选中菜单项的快捷键。 例如,很多应用程序把CTRL + O和CTRL + S关 联到菜单中的Open和Save项。使用SetAccelerator方法可以将加速器关联到一个菜单项。该方法使用KeyStroke类型的对象作为参数。例如: openItem.setAccelerator(KeyStroke.getKeyStroke("ctrl o" ));当用户按下加速器组合键时,就自动选择了相应的菜单项,同时激活一个动作事件。加速器只能关联在菜单项,而不能关联菜单;加速器实际上并不打开菜单,而是直接激活菜单关联 的动作事件。

启用和禁用菜单项:在程序运行过程中,经常需要屏蔽某些暂时不适用的命令,待到条件允许时再使之重新可用。屏蔽 /启用菜单项的方法: aMenuItem.setEnabled(boolean):当参数值为false时,屏蔽该菜单项; 当参数值为true时,启用该菜单项; 如果需要动态启用 /屏蔽某菜单项,则需要为 “menu selected ”事件注册监听器。 javax.swing.event包定义了MenuListener接口,它有三个方法: void menuSelected(MenuEvent event)  ; void menuDeselected(MenuEvent event)  ; void menuCanceled(MenuEvent event) 。


以上是关于201771010102 常惠琢 2018面向对象程序设计(Java)第14周学习总结的主要内容,如果未能解决你的问题,请参考以下文章

201771010102 常惠琢 《2018面向对象程序设计(Java)》第9周学习总结

201771010102 常惠琢 《2018面向对象程序设计(Java)》第11周学习总结

201771010102 常惠琢《2018面向对象程序设计(Java)》第10周学习总结

常惠琢 201771010102《面向对象程序设计(java)》第七周学习总结

常惠琢 201771010102《面向对象程序设计(java)》第十七周学习总结

2018-3-5 面向对象