UNPKG

epubjs

Version:

Render ePub documents in the browser, across many devices

91 lines (86 loc) 16.7 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>Borders</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="Borders"><div class="titlepage"><div><div><h1 class="title"><a id="learnjava3-CHP-17-SECT-6"/>Borders</h1></div></div></div><p><a id="idx10972" class="indexterm"/> <a id="idx10990" class="indexterm"/> Any Swing component can have a decorative border. <code class="literal">JComponent</code> includes a method called <a id="I_indexterm17_id795802" class="indexterm"/><code class="literal">setBorder()</code> ; all you have to do is call it, passing it an appropriate implementation of the <a id="I_indexterm17_id795814" class="indexterm"/><code class="literal">Border</code> interface.</p><p>Swing provides many useful <code class="literal">Border</code> implementations in the <a id="I_indexterm17_id795833" class="indexterm"/><code class="literal">javax.swing.border</code> package. You could create an instance of one of these classes and pass it to a component’s <code class="literal">setBorder()</code> method, but there’s an even simpler technique.</p><p>The <code class="literal">BorderFactory</code> class creates any kind of border for you using static “factory” methods. Creating and setting a component’s border, then, is simple:</p><a id="I_17_tt1019"/><pre class="programlisting"> <code class="n">JLabel</code> <code class="n">labelTwo</code> <code class="o">=</code> <code class="k">new</code> <code class="n">JLabel</code><code class="o">(</code><code class="s">"I have an etched border."</code><code class="o">);</code> <code class="n">labelTwo</code><code class="o">.</code><code class="na">setBorder</code><code class="o">(</code><code class="n">BorderFactory</code><code class="o">.</code><code class="na">createEtchedBorder</code><code class="o">());</code></pre><p>Every component has a <code class="literal">setBorder()</code> method, from simple labels and buttons right up to the fancy text and table components that we cover in <a class="xref" href="ch18.html" title="Chapter 18. More Swing Components">Chapter 18</a>.</p><p><code class="literal">BorderFactory</code> is convenient, but it does not offer every option of every border type. For example, if you want to create a raised <a id="I_indexterm17_id795892" class="indexterm"/><code class="literal">EtchedBorder</code> instead of the default lowered border, you’ll need to use <code class="literal">EtchedBorder</code>’s constructor, like this:</p><a id="I_17_tt1020"/><pre class="programlisting"> <code class="n">JLabel</code> <code class="n">labelTwo</code> <code class="o">=</code> <code class="k">new</code> <code class="n">JLabel</code><code class="o">(</code><code class="s">"I have a raised etched border."</code><code class="o">);</code> <code class="n">labelTwo</code><code class="o">.</code><code class="na">setBorder</code><code class="o">(</code> <code class="k">new</code> <code class="n">EtchedBorder</code><code class="o">(</code><code class="n">EtchedBorder</code><code class="o">.</code><code class="na">RAISED</code><code class="o">)</code> <code class="o">);</code></pre><p>The <code class="literal">Border</code> implementation classes are listed and briefly described here:</p><div class="variablelist"><dl><dt><span class="term"><code class="literal">BevelBorder</code></span></dt><dd><p><a id="I_indexterm17_id795936" class="indexterm"/>This border draws raised or lowered beveled edges, giving an illusion of depth.</p></dd><dt><span class="term"><code class="literal">SoftBevelBorder</code></span></dt><dd><p><a id="I_indexterm17_id795952" class="indexterm"/>This border is similar to <code class="literal">BevelBorder</code>, but thinner.</p></dd><dt><span class="term"><code class="literal">EmptyBorder</code></span></dt><dd><p><a id="I_indexterm17_id795972" class="indexterm"/>Doesn’t do any drawing, but does take up space. You can use it to give a component a little breathing room in a crowded user interface.</p></dd><dt><span class="term"><code class="literal">EtchedBorder</code></span></dt><dd><p>A lowered etched border gives the appearance of a rectangle that has been chiseled into a piece of stone. A raised etched border looks like it is standing out from the surface of the screen.</p></dd><dt><span class="term"><code class="literal">LineBorder</code></span></dt><dd><p><a id="I_indexterm17_id796001" class="indexterm"/>Draws a simple rectangle around a component. You can specify the color and width of the line in <code class="literal">LineBorder</code>’s constructor.</p></dd><dt><span class="term"><code class="literal">MatteBorder</code></span></dt><dd><p><a id="I_indexterm17_id796023" class="indexterm"/>A souped-up version of <code class="literal">LineBorder</code>. You can create a <code class="literal">MatteBorder</code> with a certain color and specify the size of the border on the left, top, right, and bottom of the component. <code class="literal">MatteBorder</code> also allows you to pass in an <code class="literal">Icon</code> that will be used to draw the border. This could be an image (<code class="literal">ImageIcon</code>) or any other implementation of the <code class="literal">Icon</code> interface.</p></dd><dt><span class="term"><code class="literal">TitledBorder</code></span></dt><dd><p><a id="I_indexterm17_id796072" class="indexterm"/>A regular border with a title. <code class="literal">TitledBorder</code> doesn’t actually draw a border; it just draws a title in conjunction with another border object. You can specify the locations of the title, its justification, and its font. This border type is particularly useful for grouping different sets of controls in a complicated interface.</p></dd><dt><span class="term"><code class="literal">CompoundBorder</code></span></dt><dd><p><a id="I_indexterm17_id796098" class="indexterm"/>A border that contains two other borders. This is especially handy if you want to enclose a component in an <code class="literal">EmptyBorder</code> and then put something decorative around it, such as an <code class="literal">EtchedBorder</code> or a <code class="literal">MatteBorder</code>.</p></dd></dl></div><p>The following example shows off some different border types. It’s only a sampler, though; many more border types are available. Furthermore, the example only encloses labels with borders. You can put a border around any component in Swing. The example is shown in <a class="xref" href="ch17s05.html#learnjava3-CHP-17-FIG-6" title="Figure 17-6. A bevy of borders">Figure 17-6</a>.</p><div class="figure"><a id="learnjava3-CHP-17-FIG-6"/><div class="figure-contents"><div class="mediaobject"><a id="I_17_tt1021"/><img src="httpatomoreillycomsourceoreillyimages1707658.png.jpg" alt="A bevy of borders"/></div></div><p class="title">Figure 17-6. A bevy of borders</p></div><p>Here is the source code:<a id="I_indexterm17_id796155" class="indexterm"/><a id="I_indexterm17_id796162" class="indexterm"/></p><a id="I_17_tt1022"/><pre class="programlisting"> <code class="c1">//file: Borders.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.border.*</code><code class="o">;</code> <code class="kd">public</code> <code class="kd">class</code> <code class="nc">Borders</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="c1">// create a JFrame to hold everything</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">"Borders"</code><code class="o">);</code> <code class="c1">// Create labels with borders.</code> <code class="kt">int</code> <code class="n">center</code> <code class="o">=</code> <code class="n">SwingConstants</code><code class="o">.</code><code class="na">CENTER</code><code class="o">;</code> <code class="n">JLabel</code> <code class="n">labelOne</code> <code class="o">=</code> <code class="k">new</code> <code class="n">JLabel</code><code class="o">(</code><code class="s">"raised BevelBorder"</code><code class="o">,</code> <code class="n">center</code><code class="o">);</code> <code class="n">labelOne</code><code class="o">.</code><code class="na">setBorder</code><code class="o">(</code> <code class="n">BorderFactory</code><code class="o">.</code><code class="na">createBevelBorder</code><code class="o">(</code><code class="n">BevelBorder</code><code class="o">.</code><code class="na">RAISED</code><code class="o">));</code> <code class="n">JLabel</code> <code class="n">labelTwo</code> <code class="o">=</code> <code class="k">new</code> <code class="n">JLabel</code><code class="o">(</code><code class="s">"EtchedBorder"</code><code class="o">,</code> <code class="n">center</code><code class="o">);</code> <code class="n">labelTwo</code><code class="o">.</code><code class="na">setBorder</code><code class="o">(</code><code class="n">BorderFactory</code><code class="o">.</code><code class="na">createEtchedBorder</code><code class="o">());</code> <code class="n">JLabel</code> <code class="n">labelThree</code> <code class="o">=</code> <code class="k">new</code> <code class="n">JLabel</code><code class="o">(</code><code class="s">"MatteBorder"</code><code class="o">,</code> <code class="n">center</code><code class="o">);</code> <code class="n">labelThree</code><code class="o">.</code><code class="na">setBorder</code><code class="o">(</code> <code class="n">BorderFactory</code><code class="o">.</code><code class="na">createMatteBorder</code><code class="o">(</code><code class="mi">10</code><code class="o">,</code> <code class="mi">10</code><code class="o">,</code> <code class="mi">10</code><code class="o">,</code> <code class="mi">10</code><code class="o">,</code> <code class="n">Color</code><code class="o">.</code><code class="na">pink</code><code class="o">));</code> <code class="n">JLabel</code> <code class="n">labelFour</code> <code class="o">=</code> <code class="k">new</code> <code class="n">JLabel</code><code class="o">(</code><code class="s">"TitledBorder"</code><code class="o">,</code> <code class="n">center</code><code class="o">);</code> <code class="n">Border</code> <code class="n">etch</code> <code class="o">=</code> <code class="n">BorderFactory</code><code class="o">.</code><code class="na">createEtchedBorder</code><code class="o">();</code> <code class="n">labelFour</code><code class="o">.</code><code class="na">setBorder</code><code class="o">(</code> <code class="n">BorderFactory</code><code class="o">.</code><code class="na">createTitledBorder</code><code class="o">(</code><code class="n">etch</code><code class="o">,</code> <code class="s">"Title"</code><code class="o">));</code> <code class="n">JLabel</code> <code class="n">labelFive</code> <code class="o">=</code> <code class="k">new</code> <code class="n">JLabel</code><code class="o">(</code><code class="s">"TitledBorder"</code><code class="o">,</code> <code class="n">center</code><code class="o">);</code> <code class="n">Border</code> <code class="n">low</code> <code class="o">=</code> <code class="n">BorderFactory</code><code class="o">.</code><code class="na">createLoweredBevelBorder</code><code class="o">();</code> <code class="n">labelFive</code><code class="o">.</code><code class="na">setBorder</code><code class="o">(</code> <code class="n">BorderFactory</code><code class="o">.</code><code class="na">createTitledBorder</code><code class="o">(</code><code class="n">low</code><code class="o">,</code> <code class="s">"Title"</code><code class="o">,</code> <code class="n">TitledBorder</code><code class="o">.</code><code class="na">RIGHT</code><code class="o">,</code> <code class="n">TitledBorder</code><code class="o">.</code><code class="na">BOTTOM</code><code class="o">));</code> <code class="n">JLabel</code> <code class="n">labelSix</code> <code class="o">=</code> <code class="k">new</code> <code class="n">JLabel</code><code class="o">(</code><code class="s">"CompoundBorder"</code><code class="o">,</code> <code class="n">center</code><code class="o">);</code> <code class="n">Border</code> <code class="n">one</code> <code class="o">=</code> <code class="n">BorderFactory</code><code class="o">.</code><code class="na">createEtchedBorder</code><code class="o">();</code> <code class="n">Border</code> <code class="n">two</code> <code class="o">=</code> <code class="n">BorderFactory</code><code class="o">.</code><code class="na">createMatteBorder</code><code class="o">(</code><code class="mi">4</code><code class="o">,</code> <code class="mi">4</code><code class="o">,</code> <code class="mi">4</code><code class="o">,</code> <code class="mi">4</code><code class="o">,</code> <code class="n">Color</code><code class="o">.</code><code class="na">blue</code><code class="o">);</code> <code class="n">labelSix</code><code class="o">.</code><code class="na">setBorder</code><code class="o">(</code><code class="n">BorderFactory</code><code class="o">.</code><code class="na">createCompoundBorder</code><code class="o">(</code><code class="n">one</code><code class="o">,</code> <code class="n">two</code><code class="o">));</code> <code class="c1">// add components to the content pane</code> <code class="n">Container</code> <code class="n">c</code> <code class="o">=</code> <code class="n">f</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">c</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">2</code><code class="o">));</code> <code class="n">c</code><code class="o">.</code><code class="na">add</code><code class="o">(</code><code class="n">labelOne</code><code class="o">);</code> <code class="n">c</code><code class="o">.</code><code class="na">add</code><code class="o">(</code><code class="n">labelTwo</code><code class="o">);</code> <code class="n">c</code><code class="o">.</code><code class="na">add</code><code class="o">(</code><code class="n">labelThree</code><code class="o">);</code> <code class="n">c</code><code class="o">.</code><code class="na">add</code><code class="o">(</code><code class="n">labelFour</code><code class="o">);</code> <code class="n">c</code><code class="o">.</code><code class="na">add</code><code class="o">(</code><code class="n">labelFive</code><code class="o">);</code> <code class="n">c</code><code class="o">.</code><code class="na">add</code><code class="o">(</code><code class="n">labelSix</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">pack</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></div></body></html>