UNPKG

epubjs

Version:

Render ePub documents in the browser, across many devices

91 lines (84 loc) 15.2 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>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>