201771010126 王燕《面向对象程序设计(Java)》第十四周学习总结(测试程序11)

实验十四  Swing图形界面组件

理论部分:

不使用布局管理器

有时候可能不想使用任何布局管理器,而只 是想把组件放在一个固定的位置上。下面是将一 个组件定位到某个绝对定位的步骤:

1)将布局管理器设置为null。

2)将组件添加到容器中。

3)指定想要放置的位置和大小。 frame.setLayout(null); Jbutton ok = new Jbutton("ok"); frame.add(ok); ok.setBounds(10,10,30,15);

定制布局管理器

 程序员可通过自己设计LayoutManager类来实现特殊的布局方式。定制布局管理器需要实现LayoutManager接口,并覆盖以下方法。 void addLayoutComponent(String s,Component c);      

将组件添加到布局中

参数:s:组件位置的标识符

   c:被添加的组件

void removeLayoutComponent(Component c);

从本布局中删除一个组件

Dimension preferredLayoutSize(Container parent);

返回本布局下的容器的首选尺寸

Dimension minimumLayoutSize(Container panent);

返回本布局下的容器的最小尺寸

void layoutContainer(container parent);

摆放容器内的组件

在添加或删除一个组件时会调用前面两个方法。如果不需要保存组件的任何附加信息那么可以让着两个方法什么都不做。接下来的两个方法计算组件的最小布局和首选布局所需要的空间。两者通常相等,第五个方法真正的实施操作,它调用所有组件的Setbounds方法。

遍历顺序

当把很多组件添加到窗口中时,需要考虑遍历顺序问题。窗口被初次使用时,遍历序列的第一个组件会有键盘焦点。没词用户按下TAB键,下一个组件就会获得焦点,

遍历顺序很直观,顺序是从左至右,从上至下,组件按照以下顺序进行遍历:

(1)外观组合框:

(2)示例文本区:

(3)尺寸组合框:

(4)加粗复选框:

(5)斜体复选框;

如果容器还包括其他的容器,情况会更加复杂。当然点给予另外一个容器时,那个容器左上角的组件就会自动的活动焦点,然后再遍历那个额容器中的所有组件。最后,将焦点移交给紧跟着那个容器的组件。利用这一点可以将相关元素组织在一起并放置在一个容器中。例如放置在一个面板中。

实验时间 20178-11-29

1、实验目的与要求

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

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

2、实验内容和步骤

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

测试程序1

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

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

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

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

 1 package calculator;
 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 Calculator
11 {
12    public static void main(String[] args)
13    {
14       EventQueue.invokeLater(() -> {
15          CalculatorFrame frame = new CalculatorFrame();
16          frame.setTitle("Calculator");
17          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
18          frame.setVisible(true);
19       });
20    }
21 }
View Code
 1 package calculator;
 2 
 3 import javax.swing.*;
 4 
 5 /**
 6  * A frame with a calculator panel.
 7  */
 8 public class CalculatorFrame extends JFrame
 9 {
10    public CalculatorFrame()
11    {
12       add(new CalculatorPanel());
13       pack();
14    }
15 }
View Code
  1 package calculator;
  2 
  3 import java.awt.*;
  4 import java.awt.event.*;
  5 import javax.swing.*;
  6 
  7 /**
  8  * A panel with calculator buttons and a result display.
  9  */
 10 public class CalculatorPanel extends JPanel
 11 {
 12    private JButton display;
 13    private JPanel panel;
 14    private double result;
 15    private String lastCommand;
 16    private boolean start;
 17 
 18    public CalculatorPanel()
 19    {
 20       setLayout(new BorderLayout());
 21 
 22       result = 0;
 23       lastCommand = "=";
 24       start = true;
 25 
 26       // add the display
 27 
 28       display = new JButton("0");
 29       display.setEnabled(false);
 30       add(display, BorderLayout.NORTH);
 31 
 32       ActionListener insert = new InsertAction();
 33       ActionListener command = new CommandAction();
 34 
 35       // add the buttons in a 4 x 4 grid
 36 
 37       panel = new JPanel();
 38       panel.setLayout(new GridLayout(4, 4));
 39 
 40       addButton("7", insert);
 41       addButton("8", insert);
 42       addButton("9", insert);
 43       addButton("/", command);
 44 
 45       addButton("4", insert);
 46       addButton("5", insert);
 47       addButton("6", insert);
 48       addButton("*", command);
 49 
 50       addButton("1", insert);
 51       addButton("2", insert);
 52       addButton("3", insert);
 53       addButton("-", command);
 54 
 55       addButton("0", insert);
 56       addButton(".", insert);
 57       addButton("=", command);
 58       addButton("+", command);
 59 
 60       add(panel, BorderLayout.CENTER);
 61    }
 62 
 63    /**
 64     * Adds a button to the center panel.
 65     * @param label the button label
 66     * @param listener the button listener
 67     */
 68    private void addButton(String label, ActionListener listener)
 69    {
 70       JButton button = new JButton(label);
 71       button.addActionListener(listener);
 72       panel.add(button);
 73    }
 74 
 75    /**
 76     * This action inserts the button action string to the end of the display text.
 77     */
 78    private class InsertAction implements ActionListener
 79    {
 80       public void actionPerformed(ActionEvent event)
 81       {
 82          String input = event.getActionCommand();
 83          if (start)
 84          {
 85             display.setText("");
 86             start = false;
 87          }
 88          display.setText(display.getText() + input);
 89       }
 90    }
 91 
 92    /**
 93     * This action executes the command that the button action string denotes.
 94     */
 95    private class CommandAction implements ActionListener
 96    {
 97       public void actionPerformed(ActionEvent event)
 98       {
 99          String command = event.getActionCommand();
100 
101          if (start)
102          {
103             if (command.equals("-"))
104             {
105                display.setText(command);
106                start = false;
107             }
108             else lastCommand = command;
109          }
110          else
111          {
112             calculate(Double.parseDouble(display.getText()));
113             lastCommand = command;
114             start = true;
115          }
116       }
117    }
118 
119    /**
120     * Carries out the pending calculation.
121     * @param x the value to be accumulated with the prior result.
122     */
123    public void calculate(double x)
124    {
125       if (lastCommand.equals("+")) result += x;
126       else if (lastCommand.equals("-")) result -= x;
127       else if (lastCommand.equals("*")) result *= x;
128       else if (lastCommand.equals("/")) result /= x;
129       else if (lastCommand.equals("=")) result = x;
130       display.setText("" + result);
131    }
132 }
View Code

 测试程序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 }
View Code
 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()) + "\n"));
52 
53       add(southPanel, BorderLayout.SOUTH);
54       pack();
55    }
56 }
View Code

 测试程序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("The quick brown fox jumps over the lazy dog.");
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 }
View Code
 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 }
View Code

 

 测试程序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 }
View Code
 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 }
View Code

 

测试程序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 }
View Code
 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 }
View Code

 

测试程序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 }
View Code
 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 }
View Code

 

 测试程序7

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

 掌握滑动条组件的用法;

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

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

 

 测试程序8

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

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

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

 1 package menu;
 2 
 3 import java.awt.*;
 4 import javax.swing.*;
 5 
 6 /**
 7  * @version 1.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 }
View Code
  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 }
View Code

 测试程序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 }
View Code
 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 }
View Code

 

测试程序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.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 }
View Code
  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 }
View Code
 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 }
View Code

 

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

  

测试程序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;//定义布尔值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;        //首选宽度初始化为0;
 32       preferredHeight = 0;//首选高度初始化为0;
 33       minWidth = 0;//最小宽度初始化为0;
 34       minHeight = 0;//最小宽度初始化为0;
 35       maxComponentWidth = 0;//组件的最大宽度初始化为0;
 36       maxComponentHeight = 0;//组件的最大高度初始化为0;
 37 
 38       // 计算最大分量宽度和高度
 39       //将首选大小设置为组件大小的和 
 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);//使用math方法计算组件的最大宽度
 47             maxComponentHeight = Math.max(maxComponentHeight, d.height);//使用math方法计算组件的最大高度
 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       // 计算圆的中心
 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       // 计算圆的半径
 89 
 90       int xradius = (containerWidth - maxComponentWidth) / 2;//计算圆半径横坐标
 91       int yradius = (containerHeight - maxComponentHeight) / 2;//计算圆半径纵坐标
 92       int radius = Math.min(xradius, yradius);
 93 
 94       // 沿圆布局组件
 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             // 组件中心点
105             int x = xcenter + (int) (Math.cos(angle) * radius);
106             int y = ycenter + (int) (Math.sin(angle) * radius);
107 
108             // 移动组件,使其中心为(x,y)
109             // 尺寸为首选尺寸
110             Dimension d = c.getPreferredSize();
111             c.setBounds(x - d.width / 2, y - d.height / 2, d.width, d.height);
112          }
113       }
114    }
115 }
View Code
 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//CircleLayoutFrame类继承JFrame类
 9 {
10    public CircleLayoutFrame()
11    {
12       setLayout(new CircleLayout());//设置布局为环形布局
13       add(new JButton("Yellow"));//添加一个名为“Yellow”的按钮
14       add(new JButton("Blue"));//添加一个名为“Blue”的按钮
15       add(new JButton("Red"));//添加一个名为“Red”的按钮
16       add(new JButton("Green"));//添加一个名为“Green”的按钮
17       add(new JButton("Orange"));//添加一个名为“Orange”的按钮
18       add(new JButton("Fuchsia"));//添加一个名为“Fuchsia”的按钮
19       add(new JButton("Indigo"));//添加一个名为“Indigo”的按钮
20       pack();
21    }
22 }
View Code
 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");//框架标题为“CircleLayoutTest”
17          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//点击框架右上角的关闭按钮车能续结束运行
18          frame.setVisible(true);//将框架设置为可见
19       });
20    }
21 }
View Code

 

测试程序12

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

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

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

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

 

 测试程序13

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

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

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

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

  

 测试程序14

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

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

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

 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 }
View Code
  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 }
View Code
 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 }
View Code
 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())) + "\n");
64          }
65       }
66    }
67 }
View Code

  

 测试程序15

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

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

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

 

 测试程序16

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

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

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

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

 

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

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

 实验总结:在学习了十一章的基础上,通过对本章的学习,对用户界面有了更加复杂的设计,是的用户界面更加美观,功能更更加丰富,学习了多种布局方式

(1)FlowLayout: 流布局(Applet和Panel的默认布局管理器)
(2)BorderLayout:边框布局( Window、Frame和Dialog的默认布局管理器)
(3)GridLayout: 网格布局
(4)GridBagLayout: 网格组布局
(5)CardLayout :卡片布局
除此之外,通过协同合作学习了环形布局管理器,用户通过计算圆的圆心坐标,以及半径长度,自定义按钮的放置位置

猜你喜欢

转载自www.cnblogs.com/wy201771010126/p/10039429.html