UNPKG

epubjs

Version:

Render ePub documents in the browser, across many devices

115 lines (107 loc) 16.3 kB
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"><head><title>Checkboxes and Radio Buttons</title><link rel="stylesheet" href="core.css" type="text/css"/><meta name="generator" content="DocBook XSL Stylesheets V1.74.0"/></head><body><div class="sect1" title="Checkboxes and Radio Buttons"><div class="titlepage"><div><div><h1 class="title"><a id="learnjava3-CHP-17-SECT-3"/>Checkboxes and Radio Buttons</h1></div></div></div><p><a id="idx10974" class="indexterm"/> <a id="idx10987" class="indexterm"/> <a id="idx10992" class="indexterm"/> <a id="idx11002" class="indexterm"/> A checkbox is a labeled toggle switch. Each time the user clicks it, its state toggles between checked and unchecked. Swing implements the checkbox as a special kind of button. Radio buttons are similar to checkboxes, but they are normally used in groups. Clicking on one radio button in the group automatically turns the others off. They are named for the mechanical preset buttons on old car radios (like some of us had in high school).</p><p>Checkboxes and radio buttons are represented by instances of <a id="I_indexterm17_id794367" class="indexterm"/><code class="literal">JCheckBox</code> and <a id="I_indexterm17_id794378" class="indexterm"/><code class="literal">JRadioButton</code>, respectively. Radio buttons can be tethered together using an instance of another class called <a id="I_indexterm17_id794389" class="indexterm"/><code class="literal">ButtonGroup</code> . By now you’re probably well into the swing of things (no pun intended) and could easily master these classes on your own. We’ll use an example to illustrate a different way of dealing with the state of components and to show off a few more things about containers.</p><p>A <code class="literal">JCheckBox</code> sends <code class="literal">ItemEvent</code>s when it’s pushed. Because a checkbox is a kind of button, it also fires <code class="literal">ActionEvent</code>s when checked. For something like a checkbox, we might want to be lazy and check on the state of the buttons only at some later time, such as when the user commits an action. For example, when filling out a form you may only care about the user’s choices when the submit button is finally pressed.</p><p>The next application, <code class="literal">DriveThrough</code>, lets us check off selections on a fast food menu, as shown in <a class="xref" href="ch17s02.html#learnjava3-CHP-17-FIG-3" title="Figure 17-3. The DriveThrough application">Figure 17-3</a>.</p><div class="figure-float"><div class="figure"><a id="learnjava3-CHP-17-FIG-3"/><div class="figure-contents"><div class="mediaobject"><a id="I_17_tt1010"/><img src="httpatomoreillycomsourceoreillyimages1707655.png.jpg" alt="The DriveThrough application"/></div></div><p class="title">Figure 17-3. The DriveThrough application</p></div></div><p><code class="literal">DriveThrough</code> prints the results when you press the Place Order button. Therefore, we can ignore all the events generated by our checkboxes and radio buttons and listen only for the action events generated by the submit button:</p><a id="I_17_tt1011"/><pre class="programlisting"> <code class="c1">//file: DriveThrough.java</code> <code class="kn">import</code> <code class="nn">java.awt.*</code><code class="o">;</code> <code class="kn">import</code> <code class="nn">java.awt.event.*</code><code class="o">;</code> <code class="kn">import</code> <code class="nn">javax.swing.*</code><code class="o">;</code> <code class="kd">public</code> <code class="kd">class</code> <code class="nc">DriveThrough</code> <code class="o">{</code> <code class="kd">public</code> <code class="kd">static</code> <code class="kt">void</code> <code class="nf">main</code><code class="o">(</code><code class="n">String</code><code class="o">[]</code> <code class="n">args</code><code class="o">)</code> <code class="o">{</code> <code class="n">JFrame</code> <code class="n">frame</code> <code class="o">=</code> <code class="k">new</code> <code class="n">JFrame</code><code class="o">(</code><code class="s">"Lister v1.0"</code><code class="o">);</code> <code class="n">JPanel</code> <code class="n">entreePanel</code> <code class="o">=</code> <code class="k">new</code> <code class="n">JPanel</code><code class="o">();</code> <code class="kd">final</code> <code class="n">ButtonGroup</code> <code class="n">entreeGroup</code> <code class="o">=</code> <code class="k">new</code> <code class="n">ButtonGroup</code><code class="o">();</code> <code class="n">JRadioButton</code> <code class="n">radioButton</code><code class="o">;</code> <code class="n">entreePanel</code><code class="o">.</code><code class="na">add</code><code class="o">(</code><code class="n">radioButton</code> <code class="o">=</code> <code class="k">new</code> <code class="n">JRadioButton</code><code class="o">(</code><code class="s">"Beef"</code><code class="o">));</code> <code class="n">radioButton</code><code class="o">.</code><code class="na">setActionCommand</code><code class="o">(</code><code class="s">"Beef"</code><code class="o">);</code> <code class="n">entreeGroup</code><code class="o">.</code><code class="na">add</code><code class="o">(</code><code class="n">radioButton</code><code class="o">);</code> <code class="n">entreePanel</code><code class="o">.</code><code class="na">add</code><code class="o">(</code><code class="n">radioButton</code> <code class="o">=</code> <code class="k">new</code> <code class="n">JRadioButton</code><code class="o">(</code><code class="s">"Chicken"</code><code class="o">));</code> <code class="n">radioButton</code><code class="o">.</code><code class="na">setActionCommand</code><code class="o">(</code><code class="s">"Chicken"</code><code class="o">);</code> <code class="n">entreeGroup</code><code class="o">.</code><code class="na">add</code><code class="o">(</code><code class="n">radioButton</code><code class="o">);</code> <code class="n">entreePanel</code><code class="o">.</code><code class="na">add</code><code class="o">(</code><code class="n">radioButton</code> <code class="o">=</code> <code class="k">new</code> <code class="n">JRadioButton</code><code class="o">(</code><code class="s">"Veggie"</code><code class="o">,</code> <code class="kc">true</code><code class="o">));</code> <code class="n">radioButton</code><code class="o">.</code><code class="na">setActionCommand</code><code class="o">(</code><code class="s">"Veggie"</code><code class="o">);</code> <code class="n">entreeGroup</code><code class="o">.</code><code class="na">add</code><code class="o">(</code><code class="n">radioButton</code><code class="o">);</code> <code class="kd">final</code> <code class="n">JPanel</code> <code class="n">condimentsPanel</code> <code class="o">=</code> <code class="k">new</code> <code class="n">JPanel</code><code class="o">();</code> <code class="n">condimentsPanel</code><code class="o">.</code><code class="na">add</code><code class="o">(</code><code class="k">new</code> <code class="n">JCheckBox</code><code class="o">(</code><code class="s">"Ketchup"</code><code class="o">));</code> <code class="n">condimentsPanel</code><code class="o">.</code><code class="na">add</code><code class="o">(</code><code class="k">new</code> <code class="n">JCheckBox</code><code class="o">(</code><code class="s">"Mustard"</code><code class="o">));</code> <code class="n">condimentsPanel</code><code class="o">.</code><code class="na">add</code><code class="o">(</code><code class="k">new</code> <code class="n">JCheckBox</code><code class="o">(</code><code class="s">"Pickles"</code><code class="o">));</code> <code class="n">JPanel</code> <code class="n">orderPanel</code> <code class="o">=</code> <code class="k">new</code> <code class="n">JPanel</code><code class="o">();</code> <code class="n">JButton</code> <code class="n">orderButton</code> <code class="o">=</code> <code class="k">new</code> <code class="n">JButton</code><code class="o">(</code><code class="s">"Place Order"</code><code class="o">);</code> <code class="n">orderPanel</code><code class="o">.</code><code class="na">add</code><code class="o">(</code><code class="n">orderButton</code><code class="o">);</code> <code class="n">Container</code> <code class="n">content</code> <code class="o">=</code> <code class="n">frame</code><code class="o">.</code><code class="na">getContentPane</code><code class="o">();</code> <code class="c1">// unnecessary in 5.0+</code> <code class="n">content</code><code class="o">.</code><code class="na">setLayout</code><code class="o">(</code><code class="k">new</code> <code class="n">GridLayout</code><code class="o">(</code><code class="mi">3</code><code class="o">,</code> <code class="mi">1</code><code class="o">));</code> <code class="n">content</code><code class="o">.</code><code class="na">add</code><code class="o">(</code><code class="n">entreePanel</code><code class="o">);</code> <code class="n">content</code><code class="o">.</code><code class="na">add</code><code class="o">(</code><code class="n">condimentsPanel</code><code class="o">);</code> <code class="n">content</code><code class="o">.</code><code class="na">add</code><code class="o">(</code><code class="n">orderPanel</code><code class="o">);</code> <code class="n">orderButton</code><code class="o">.</code><code class="na">addActionListener</code><code class="o">(</code><code class="k">new</code> <code class="n">ActionListener</code><code class="o">()</code> <code class="o">{</code> <code class="kd">public</code> <code class="kt">void</code> <code class="nf">actionPerformed</code><code class="o">(</code><code class="n">ActionEvent</code> <code class="n">ae</code><code class="o">)</code> <code class="o">{</code> <code class="n">String</code> <code class="n">entree</code> <code class="o">=</code> <code class="n">entreeGroup</code><code class="o">.</code><code class="na">getSelection</code><code class="o">().</code><code class="na">getActionCommand</code><code class="o">();</code> <code class="n">System</code><code class="o">.</code><code class="na">out</code><code class="o">.</code><code class="na">println</code><code class="o">(</code><code class="n">entree</code> <code class="o">+</code> <code class="s">" sandwich"</code><code class="o">);</code> <code class="n">Component</code><code class="o">[]</code> <code class="n">components</code> <code class="o">=</code> <code class="n">condimentsPanel</code><code class="o">.</code><code class="na">getComponents</code><code class="o">();</code> <code class="k">for</code> <code class="o">(</code> <code class="n">Component</code> <code class="n">c</code> <code class="o">:</code> <code class="n">components</code> <code class="o">)</code> <code class="o">{</code> <code class="n">JCheckBox</code> <code class="n">cb</code> <code class="o">=</code> <code class="o">(</code><code class="n">JCheckBox</code><code class="o">)</code><code class="n">c</code><code class="o">;</code> <code class="k">if</code> <code class="o">(</code><code class="n">cb</code><code class="o">.</code><code class="na">isSelected</code><code class="o">())</code> <code class="n">System</code><code class="o">.</code><code class="na">out</code><code class="o">.</code><code class="na">println</code><code class="o">(</code><code class="s">"With "</code> <code class="o">+</code> <code class="n">cb</code><code class="o">.</code><code class="na">getText</code><code class="o">());</code> <code class="o">}</code> <code class="o">}</code> <code class="o">});</code> <code class="n">frame</code><code class="o">.</code><code class="na">setDefaultCloseOperation</code><code class="o">(</code> <code class="n">JFrame</code><code class="o">.</code><code class="na">EXIT_ON_CLOSE</code> <code class="o">);</code> <code class="n">frame</code><code class="o">.</code><code class="na">setSize</code><code class="o">(</code><code class="mi">300</code><code class="o">,</code> <code class="mi">150</code><code class="o">);</code> <code class="n">frame</code><code class="o">.</code><code class="na">setVisible</code><code class="o">(</code><code class="kc">true</code><code class="o">);</code> <code class="o">}</code> <code class="o">}</code></pre><p><code class="literal">DriveThrough</code> lays out three panels. The radio buttons in the <code class="literal">entreePanel</code> are tied together through a <a id="I_indexterm17_id794508" class="indexterm"/><code class="literal">ButtonGroup</code> object. We <code class="literal">add()</code> the buttons to a <code class="literal">ButtonGroup</code> to make them mutually exclusive. The <code class="literal">ButtonGroup</code> object is an odd animal. One might expect it to be a container or a component, but it isn’t; it’s simply a helper object that allows only one <code class="literal">RadioButton</code> to be selected at a time.</p><p>In this example, the button group forces you to choose a beef, chicken, or veggie entree, but not more than one. The condiment choices, which are <code class="literal">JCheckBox</code>es, aren’t in a button group, so you can request any combination of ketchup, mustard, and pickles on your sandwich.</p><p>When the <span class="emphasis"><em>Place Order</em></span> button is pushed, we receive an <code class="literal">ActionEvent</code> in the <code class="literal">actionPerformed()</code> method of our inner <code class="literal">ActionListener</code>. At this point, we gather the information in the radio buttons and checkboxes and print it. <code class="literal">actionPerformed()</code> simply reads the state of the various buttons. We could have saved references to the buttons in a number of ways; this example demonstrates two. First, we find out which entree was selected. To do so, we call the <code class="literal">ButtonGroup</code>’s <a id="I_indexterm17_id794590" class="indexterm"/><code class="literal">getSelection()</code> method. This returns a <code class="literal">ButtonModel</code>, upon which we immediately call <code class="literal">getActionCommand()</code>. This returns the action command as we set it when we created the radio buttons. The action commands for the buttons are the entrée names, which is exactly what we need.</p><p>To find which condiments were selected, we use a more complicated procedure. The problem is that condiments aren’t mutually exclusive, so we don’t have the convenience of a <code class="literal">ButtonGroup</code>. Instead, we ask the condiments <code class="literal">JPanel</code> for a list of its components. The <code class="literal">getComponents()</code> method returns an array of references to the container’s child components. We’ll use this to loop over the components and print the results. We cast each element of the array back to <a id="I_indexterm17_id794641" class="indexterm"/><code class="literal">JCheckBox</code> and call its <a id="I_indexterm17_id794652" class="indexterm"/><code class="literal">isSelected()</code> method to see if the checkbox is on or off. If we were dealing with different types of components in the array, we could determine each component’s type with the <code class="literal">instanceof</code> operator. Or, more generally, we could maintain references to the elements of our form in some explicit way (a map by name, perhaps).<a id="I_indexterm17_id794672" class="indexterm"/><a id="I_indexterm17_id794679" class="indexterm"/><a id="I_indexterm17_id794686" class="indexterm"/><a id="I_indexterm17_id794693" class="indexterm"/></p></div></body></html>