epubjs
Version:
Render ePub documents in the browser, across many devices
91 lines (84 loc) • 15.2 kB
HTML
<html xmlns="http://www.w3.org/1999/xhtml"><head><title>BorderLayout</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="BorderLayout"><div class="titlepage"><div><div><h1 class="title"><a id="learnjava3-CHP-19-SECT-3"/>BorderLayout</h1></div></div></div><p><a id="idx11044" class="indexterm"/> <a id="idx11064" class="indexterm"/> <code class="literal">BorderLayout</code> is a little
more interesting. It tries to arrange objects in one of five geographical
locations, represented by constants in the <code class="literal">BorderLayout</code> class: <a id="I_indexterm19_id805407" class="indexterm"/><code class="literal">NORTH</code>, <a id="I_indexterm19_id805420" class="indexterm"/><code class="literal">SOUTH</code>, <a id="I_indexterm19_id805432" class="indexterm"/><code class="literal">EAST</code>, <a id="I_indexterm19_id805445" class="indexterm"/><code class="literal">WEST</code>, and <a id="I_indexterm19_id805458" class="indexterm"/><code class="literal">CENTER</code>, optionally with
some padding between. <code class="literal">BorderLayout</code> is
the default layout for the content panes of <code class="literal">JWindow</code> and <code class="literal">JFrame</code> objects. Because each component is
associated with a direction, <code class="literal">BorderLayout</code> can manage at most five components;
it squashes or stretches those components to fit its constraints. As we’ll
see in the second example, this means that you often want to have <code class="literal">BorderLayout</code> manage sets of components in their
own panels.</p><p>When we add a component to a container with a border layout, we need
to specify both the component and the position at which to add it. To do
so, we use an overloaded version of the container’s <code class="literal">add()</code> method that takes an additional argument
as a <a id="I_indexterm19_id805514" class="indexterm"/><span class="emphasis"><em>constraint</em></span>. The constraint specifies
the name of a position within the <code class="literal">BorderLayout</code>.</p><p>The following application sets a <code class="literal">BorderLayout</code> and adds our five buttons again,
named for their locations:</p><a id="I_19_tt1109"/><pre class="programlisting"> <code class="c1">//file: Border1.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">Border1</code> <code class="kd">extends</code> <code class="n">JPanel</code> <code class="o">{</code>
<code class="kd">public</code> <code class="nf">Border1</code><code class="o">()</code> <code class="o">{</code>
<code class="n">setLayout</code><code class="o">(</code><code class="k">new</code> <code class="n">BorderLayout</code><code class="o">());</code>
<code class="n">add</code><code class="o">(</code><code class="k">new</code> <code class="n">JButton</code><code class="o">(</code><code class="s">"North"</code><code class="o">),</code> <code class="n">BorderLayout</code><code class="o">.</code><code class="na">NORTH</code> <code class="o">);</code>
<code class="n">add</code><code class="o">(</code><code class="k">new</code> <code class="n">JButton</code><code class="o">(</code><code class="s">"South"</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="n">add</code><code class="o">(</code><code class="k">new</code> <code class="n">JButton</code><code class="o">(</code><code class="s">"East"</code><code class="o">),</code> <code class="n">BorderLayout</code><code class="o">.</code><code class="na">EAST</code> <code class="o">);</code>
<code class="n">add</code><code class="o">(</code><code class="k">new</code> <code class="n">JButton</code><code class="o">(</code><code class="s">"West"</code><code class="o">),</code> <code class="n">BorderLayout</code><code class="o">.</code><code class="na">WEST</code> <code class="o">);</code>
<code class="n">add</code><code class="o">(</code><code class="k">new</code> <code class="n">JButton</code><code class="o">(</code><code class="s">"Center"</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="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">"Border1"</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">300</code><code class="o">);</code>
<code class="n">frame</code><code class="o">.</code><code class="na">setLocation</code><code class="o">(</code><code class="mi">200</code><code class="o">,</code> <code class="mi">200</code><code class="o">);</code>
<code class="n">frame</code><code class="o">.</code><code class="na">setContentPane</code><code class="o">(</code><code class="k">new</code> <code class="n">Border1</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>The result is shown in <a class="xref" href="ch19s03.html#learnjava3-CHP-19-FIG-4" title="Figure 19-4. A border layout">Figure 19-4</a>.</p><div class="figure"><a id="learnjava3-CHP-19-FIG-4"/><div class="figure-contents"><div class="mediaobject"><a id="I_19_tt1110"/><img src="httpatomoreillycomsourceoreillyimages1707681.png.jpg" alt="A border layout"/></div></div><p class="title">Figure 19-4. A border layout</p></div><p>So, how exactly is the area divided up? Well, the objects at
<code class="literal">NORTH</code> and <code class="literal">SOUTH</code> get their preferred height and fill the
display area horizontally. <code class="literal">EAST</code> and
<code class="literal">WEST</code> components, on the other hand, get
their preferred width and fill the remaining area between <code class="literal">NORTH</code> and <code class="literal">SOUTH</code> vertically. Finally, the <code class="literal">CENTER</code> object takes all the rest of the space.
As you can see in <a class="xref" href="ch19s03.html#learnjava3-CHP-19-FIG-4" title="Figure 19-4. A border layout">Figure 19-4</a>, our buttons
get distorted into interesting shapes.</p><p>What if we don’t want <code class="literal">BorderLayout</code> messing with the sizes of our
components? One option would be to put each button in its own <code class="literal">JPanel</code>. The default layout for a <code class="literal">JPanel</code> is <code class="literal">FlowLayout</code>, which respects the preferred size of
components. The preferred sizes of the panels are effectively the
preferred sizes of the buttons, but if the panels are stretched, they
won’t pull their buttons with them. The following application illustrates
this approach:</p><a id="I_19_tt1111"/><pre class="programlisting"> <code class="c1">//file: Border2.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">Border2</code> <code class="kd">extends</code> <code class="n">JPanel</code> <code class="o">{</code>
<code class="kd">public</code> <code class="nf">Border2</code><code class="o">()</code> <code class="o">{</code>
<code class="n">setLayout</code><code class="o">(</code><code class="k">new</code> <code class="n">BorderLayout</code><code class="o">());</code>
<code class="n">JPanel</code> <code class="n">p</code> <code class="o">=</code> <code class="k">new</code> <code class="n">JPanel</code><code class="o">();</code>
<code class="n">p</code><code class="o">.</code><code class="na">add</code><code class="o">(</code><code class="k">new</code> <code class="n">JButton</code><code class="o">(</code><code class="s">"North"</code><code class="o">));</code>
<code class="n">add</code><code class="o">(</code><code class="n">p</code><code class="o">,</code> <code class="n">BorderLayout</code><code class="o">.</code><code class="na">NORTH</code><code class="o">);</code>
<code class="n">p</code> <code class="o">=</code> <code class="k">new</code> <code class="n">JPanel</code><code class="o">();</code>
<code class="n">p</code><code class="o">.</code><code class="na">add</code><code class="o">(</code><code class="k">new</code> <code class="n">JButton</code><code class="o">(</code><code class="s">"South"</code><code class="o">));</code>
<code class="n">add</code><code class="o">(</code><code class="n">p</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="n">p</code> <code class="o">=</code> <code class="k">new</code> <code class="n">JPanel</code><code class="o">();</code>
<code class="n">p</code><code class="o">.</code><code class="na">add</code><code class="o">(</code><code class="k">new</code> <code class="n">JButton</code><code class="o">(</code><code class="s">"East"</code><code class="o">));</code>
<code class="n">add</code><code class="o">(</code><code class="n">p</code><code class="o">,</code> <code class="n">BorderLayout</code><code class="o">.</code><code class="na">EAST</code><code class="o">);</code>
<code class="n">p</code> <code class="o">=</code> <code class="k">new</code> <code class="n">JPanel</code><code class="o">();</code>
<code class="n">p</code><code class="o">.</code><code class="na">add</code><code class="o">(</code><code class="k">new</code> <code class="n">JButton</code><code class="o">(</code><code class="s">"West"</code><code class="o">));</code>
<code class="n">add</code><code class="o">(</code><code class="n">p</code><code class="o">,</code> <code class="n">BorderLayout</code><code class="o">.</code><code class="na">WEST</code><code class="o">);</code>
<code class="n">p</code> <code class="o">=</code> <code class="k">new</code> <code class="n">JPanel</code><code class="o">();</code>
<code class="n">p</code><code class="o">.</code><code class="na">add</code><code class="o">(</code><code class="k">new</code> <code class="n">JButton</code><code class="o">(</code><code class="s">"Center"</code><code class="o">));</code>
<code class="n">add</code><code class="o">(</code><code class="n">p</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="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">"Border2"</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">225</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">setLocation</code><code class="o">(</code><code class="mi">200</code><code class="o">,</code> <code class="mi">200</code><code class="o">);</code>
<code class="n">frame</code><code class="o">.</code><code class="na">setContentPane</code><code class="o">(</code><code class="k">new</code> <code class="n">Border2</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>The result is shown in <a class="xref" href="ch19s03.html#learnjava3-CHP-19-FIG-5" title="Figure 19-5. Another border layout">Figure 19-5</a>.</p><p>In the example, we create a number of panels, put our buttons inside
the panels, and put the panels into
the frame window, which has the <code class="literal">BorderLayout</code> manager. Now, the <code class="literal">JPanel</code> for the <code class="literal">CENTER</code> button soaks up the extra space that
comes from the <code class="literal">BorderLayout</code>. Each <code class="literal">JPanel</code>’s <code class="literal">FlowLayout</code> centers the button in the panel and
uses the button’s preferred size. In this case, it’s all a bit awkward.
We’ll see how we could accomplish this more directly using <code class="literal">GridBagLayout</code> shortly.<a id="I_indexterm19_id805735" class="indexterm"/><a id="I_indexterm19_id805742" class="indexterm"/></p><div class="figure"><a id="learnjava3-CHP-19-FIG-5"/><div class="figure-contents"><div class="mediaobject"><a id="I_19_tt1112"/><img src="httpatomoreillycomsourceoreillyimages1707682.png.jpg" alt="Another border layout"/></div></div><p class="title">Figure 19-5. Another border layout</p></div></div></body></html>