epubjs
Version:
Render ePub documents in the browser, across many devices
91 lines (82 loc) • 13.3 kB
HTML
<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Scrollbars and Sliders</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="Scrollbars and Sliders"><div class="titlepage"><div><div><h1 class="title"><a id="learnjava3-CHP-17-SECT-13"/>Scrollbars and Sliders</h1></div></div></div><p><a id="idx10988" class="indexterm"/> <a id="idx10989" class="indexterm"/> <a id="idx11003" class="indexterm"/> <a id="idx11004" class="indexterm"/> <code class="literal">JScrollPane</code> is such a
handy component that you may not ever need to use scrollbars by
themselves. In fact, if you ever do find yourself using a scrollbar by
itself, chances are that you really want to use another component called a
<span class="emphasis"><em>slider</em></span>.</p><p>There’s not much point in describing the appearance and
functionality of scrollbars and sliders. Instead, let’s jump right in with
an example that includes both components. <a class="xref" href="ch17s11.html#learnjava3-CHP-17-FIG-12" title="Figure 17-12. Using a scrollbar and a slider">Figure 17-12</a> shows a simple example with both a
scrollbar and a slider.</p><div class="figure"><a id="learnjava3-CHP-17-FIG-12"/><div class="figure-contents"><div class="mediaobject"><a id="I_17_tt1040"/><img src="httpatomoreillycomsourceoreillyimages1707664.png.jpg" alt="Using a scrollbar and a slider"/></div></div><p class="title">Figure 17-12. Using a scrollbar and a slider</p></div><p>Here is the source code for this example:</p><a id="I_17_tt1041"/><pre class="programlisting"> <code class="c1">//file: Slippery.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="kn">import</code> <code class="nn">javax.swing.event.*</code><code class="o">;</code>
<code class="kd">public</code> <code class="kd">class</code> <code class="nc">Slippery</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">"Slippery v1.0"</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">JPanel</code> <code class="n">main</code> <code class="o">=</code> <code class="k">new</code> <code class="n">JPanel</code><code class="o">(</code><code class="k">new</code> <code class="n">GridLayout</code><code class="o">(</code><code class="mi">2</code><code class="o">,</code> <code class="mi">1</code><code class="o">));</code>
<code class="n">JPanel</code> <code class="n">scrollBarPanel</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">JScrollBar</code> <code class="n">scrollBar</code> <code class="o">=</code>
<code class="k">new</code> <code class="nf">JScrollBar</code><code class="o">(</code><code class="n">JScrollBar</code><code class="o">.</code><code class="na">HORIZONTAL</code><code class="o">,</code> <code class="mi">0</code><code class="o">,</code> <code class="mi">48</code><code class="o">,</code> <code class="mi">0</code><code class="o">,</code> <code class="mi">255</code><code class="o">);</code>
<code class="kt">int</code> <code class="n">height</code> <code class="o">=</code> <code class="n">scrollBar</code><code class="o">.</code><code class="na">getPreferredSize</code><code class="o">().</code><code class="na">height</code><code class="o">;</code>
<code class="n">scrollBar</code><code class="o">.</code><code class="na">setPreferredSize</code><code class="o">(</code><code class="k">new</code> <code class="n">Dimension</code><code class="o">(</code><code class="mi">175</code><code class="o">,</code> <code class="n">height</code><code class="o">));</code>
<code class="n">scrollBarPanel</code><code class="o">.</code><code class="na">add</code><code class="o">(</code><code class="n">scrollBar</code><code class="o">);</code>
<code class="n">main</code><code class="o">.</code><code class="na">add</code><code class="o">(</code><code class="n">scrollBarPanel</code><code class="o">);</code>
<code class="n">JPanel</code> <code class="n">sliderPanel</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">JSlider</code> <code class="n">slider</code> <code class="o">=</code>
<code class="k">new</code> <code class="nf">JSlider</code><code class="o">(</code><code class="n">JSlider</code><code class="o">.</code><code class="na">HORIZONTAL</code><code class="o">,</code> <code class="mi">0</code><code class="o">,</code> <code class="mi">255</code><code class="o">,</code> <code class="mi">128</code><code class="o">);</code>
<code class="n">slider</code><code class="o">.</code><code class="na">setMajorTickSpacing</code><code class="o">(</code><code class="mi">48</code><code class="o">);</code>
<code class="n">slider</code><code class="o">.</code><code class="na">setMinorTickSpacing</code><code class="o">(</code><code class="mi">16</code><code class="o">);</code>
<code class="n">slider</code><code class="o">.</code><code class="na">setPaintTicks</code><code class="o">(</code><code class="kc">true</code><code class="o">);</code>
<code class="n">sliderPanel</code><code class="o">.</code><code class="na">add</code><code class="o">(</code><code class="n">slider</code><code class="o">);</code>
<code class="n">main</code><code class="o">.</code><code class="na">add</code><code class="o">(</code><code class="n">sliderPanel</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">main</code><code class="o">,</code> <code class="n">BorderLayout</code><code class="o">.</code><code class="na">CENTER</code><code class="o">);</code>
<code class="kd">final</code> <code class="n">JLabel</code> <code class="n">statusLabel</code> <code class="o">=</code>
<code class="k">new</code> <code class="nf">JLabel</code><code class="o">(</code><code class="s">"Welcome to Slippery v1.0"</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">statusLabel</code><code class="o">,</code> <code class="n">BorderLayout</code><code class="o">.</code><code class="na">SOUTH</code><code class="o">);</code>
<code class="c1">// wire up the event handlers</code>
<code class="n">scrollBar</code><code class="o">.</code><code class="na">addAdjustmentListener</code><code class="o">(</code><code class="k">new</code> <code class="n">AdjustmentListener</code><code class="o">()</code> <code class="o">{</code>
<code class="kd">public</code> <code class="kt">void</code> <code class="nf">adjustmentValueChanged</code><code class="o">(</code><code class="n">AdjustmentEvent</code> <code class="n">e</code><code class="o">)</code> <code class="o">{</code>
<code class="n">statusLabel</code><code class="o">.</code><code class="na">setText</code><code class="o">(</code><code class="s">"JScrollBar's current value = "</code>
<code class="o">+</code> <code class="n">scrollBar</code><code class="o">.</code><code class="na">getValue</code><code class="o">());</code>
<code class="o">}</code>
<code class="o">});</code>
<code class="n">slider</code><code class="o">.</code><code class="na">addChangeListener</code><code class="o">(</code><code class="k">new</code> <code class="n">ChangeListener</code><code class="o">()</code> <code class="o">{</code>
<code class="kd">public</code> <code class="kt">void</code> <code class="nf">stateChanged</code><code class="o">(</code><code class="n">ChangeEvent</code> <code class="n">e</code><code class="o">)</code> <code class="o">{</code>
<code class="n">statusLabel</code><code class="o">.</code><code class="na">setText</code><code class="o">(</code><code class="s">"JSlider's current value = "</code>
<code class="o">+</code> <code class="n">slider</code><code class="o">.</code><code class="na">getValue</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">pack</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">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>All we’ve really done here is added a <code class="literal">JScrollBar</code> and a <a id="I_indexterm17_id797902" class="indexterm"/><code class="literal">JSlider</code> to our main
window. If the user adjusts either of these components, the current value
of the component is displayed in a <code class="literal">JLabel</code> at the bottom of the window.</p><p>You create both the <code class="literal">JScrollBar</code>
and <code class="literal">JSlider</code> by specifying an
orientation, either <a id="I_indexterm17_id797932" class="indexterm"/><code class="literal">HORIZONTAL</code> or <a id="I_indexterm17_id797943" class="indexterm"/><code class="literal">VERTICAL</code>. You can also
specify the minimum and maximum values for the components, as well as the
initial value. The <code class="literal">JScrollBar</code> supports
one additional parameter, the <a id="I_indexterm17_id797960" class="indexterm"/><span class="emphasis"><em>extent</em></span>. The extent simply refers to
what range of values is represented by the slider within the scroll bar.
For example, in a scrollbar that runs from 0 to 255, an extent of 128
means that the slider will be half the width of the scrollable area of the
scrollbar.</p><p><code class="literal">JSlider</code> supports the idea of
<span class="emphasis"><em>tick marks</em></span>, lines drawn at certain values along the
slider’s length. <em class="firstterm">Major tick marks</em> are slightly
larger than <em class="firstterm">minor tick marks</em>. To draw tick marks,
just specify an interval for major and minor tick marks, and then paint
the tick marks:</p><a id="I_17_tt1042"/><pre class="programlisting"> <code class="n">slider</code><code class="o">.</code><code class="na">setMajorTickSpacing</code><code class="o">(</code><code class="mi">48</code><code class="o">);</code>
<code class="n">slider</code><code class="o">.</code><code class="na">setMinorTickSpacing</code><code class="o">(</code><code class="mi">16</code><code class="o">);</code>
<code class="n">slider</code><code class="o">.</code><code class="na">setPaintTicks</code><code class="o">(</code><code class="kc">true</code><code class="o">);</code></pre><p><code class="literal">JSlider</code> also supports labeling
the ticks with text strings, using the <a id="I_indexterm17_id798007" class="indexterm"/><code class="literal">setLabelTable()</code>
method.</p><p>Responding to events from the two components is straightforward. The
<code class="literal">JScrollBar</code> sends out <code class="literal">AdjustmentEvent</code>s every time something happens;
the <code class="literal">JSlider</code> fires off <code class="literal">ChangeEvent</code>s when its value changes. In our
simple example, we display the new value of the changed component in the
<code class="literal">JLabel</code> at the bottom of the
window.<a id="I_indexterm17_id798048" class="indexterm"/><a id="I_indexterm17_id798055" class="indexterm"/><a id="I_indexterm17_id798062" class="indexterm"/><a id="I_indexterm17_id798070" class="indexterm"/></p></div></body></html>