TabbedPaneDemo.java revision 13978:1993af50385d
1/* 2 * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23package com.sun.swingset3.demos.tabbedpane; 24 25import java.awt.*; 26import java.awt.event.ActionEvent; 27import java.awt.event.ActionListener; 28import java.util.Random; 29import javax.swing.*; 30import javax.swing.event.ChangeEvent; 31 32import com.sun.swingset3.DemoProperties; 33import com.sun.swingset3.demos.ResourceManager; 34 35/** 36 * JTabbedPane Demo 37 * 38 * @version 1.11 11/17/05 39 * @author Jeff Dinkins 40 */ 41@DemoProperties( 42 value = "JTabbedPane Demo", 43 category = "Containers", 44 description = "Demonstrates JTabbedPane, a container which allows tabbed navigation of components", 45 sourceFiles = { 46 "com/sun/swingset3/demos/tabbedpane/TabbedPaneDemo.java", 47 "com/sun/swingset3/demos/ResourceManager.java", 48 "com/sun/swingset3/demos/tabbedpane/resources/TabbedPaneDemo.properties", 49 "com/sun/swingset3/demos/tabbedpane/resources/images/blake.gif", 50 "com/sun/swingset3/demos/tabbedpane/resources/images/brooke.gif", 51 "com/sun/swingset3/demos/tabbedpane/resources/images/camille.jpg", 52 "com/sun/swingset3/demos/tabbedpane/resources/images/david.gif", 53 "com/sun/swingset3/demos/tabbedpane/resources/images/ewan.gif", 54 "com/sun/swingset3/demos/tabbedpane/resources/images/ewan.jpg", 55 "com/sun/swingset3/demos/tabbedpane/resources/images/miranda.jpg", 56 "com/sun/swingset3/demos/tabbedpane/resources/images/matthew.gif", 57 "com/sun/swingset3/demos/tabbedpane/resources/images/stephen.gif", 58 "com/sun/swingset3/demos/tabbedpane/resources/images/TabbedPaneDemo.gif" 59 } 60) 61public class TabbedPaneDemo extends JPanel implements ActionListener { 62 63 private static final ResourceManager resourceManager = new ResourceManager(TabbedPaneDemo.class); 64 public static final String BOUNCE = resourceManager.getString("TabbedPaneDemo.bounce"); 65 public static final String EWAN = resourceManager.getString("TabbedPaneDemo.ewan"); 66 public static final String MIRANDA = resourceManager.getString("TabbedPaneDemo.miranda"); 67 public static final String CAMILLE = resourceManager.getString("TabbedPaneDemo.camille"); 68 public static final String TAB_PLACEMENT = resourceManager.getString("TabbedPaneDemo.label"); 69 public static final String RIGHT = resourceManager.getString("TabbedPaneDemo.right"); 70 public static final String BOTTOM = resourceManager.getString("TabbedPaneDemo.bottom"); 71 public static final String LEFT = resourceManager.getString("TabbedPaneDemo.left"); 72 public static final String TOP = resourceManager.getString("TabbedPaneDemo.top"); 73 public static final String DEMO_TITLE = TabbedPaneDemo.class.getAnnotation(DemoProperties.class).value(); 74 75 private final HeadSpin spin; 76 77 private final JTabbedPane tabbedpane; 78 79 private final ButtonGroup group; 80 81 private final JRadioButton top; 82 private final JRadioButton bottom; 83 private final JRadioButton left; 84 private final JRadioButton right; 85 86 /** 87 * main method allows us to run as a standalone demo. 88 * 89 * @param args 90 */ 91 public static void main(String[] args) { 92 JFrame frame = new JFrame(DEMO_TITLE); 93 94 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 95 frame.getContentPane().add(new TabbedPaneDemo()); 96 frame.setPreferredSize(new Dimension(800, 600)); 97 frame.pack(); 98 frame.setLocationRelativeTo(null); 99 frame.setVisible(true); 100 } 101 102 /** 103 * TabbedPaneDemo Constructor 104 */ 105 public TabbedPaneDemo() { 106 setLayout(new BorderLayout()); 107 108 // create tab position controls 109 JPanel tabControls = new JPanel(); 110 tabControls.add(new JLabel(TAB_PLACEMENT)); 111 top = (JRadioButton) tabControls.add(new JRadioButton(TOP)); 112 left = (JRadioButton) tabControls.add(new JRadioButton(LEFT)); 113 bottom = (JRadioButton) tabControls.add(new JRadioButton(BOTTOM)); 114 right = (JRadioButton) tabControls.add(new JRadioButton(RIGHT)); 115 add(tabControls, BorderLayout.NORTH); 116 117 group = new ButtonGroup(); 118 group.add(top); 119 group.add(bottom); 120 group.add(left); 121 group.add(right); 122 123 top.setSelected(true); 124 125 top.addActionListener(this); 126 bottom.addActionListener(this); 127 left.addActionListener(this); 128 right.addActionListener(this); 129 130 // create tab 131 tabbedpane = new JTabbedPane(); 132 add(tabbedpane, BorderLayout.CENTER); 133 134 String name = CAMILLE; 135 JLabel pix = new JLabel(resourceManager.createImageIcon("camille.jpg", name)); 136 tabbedpane.add(name, pix); 137 138 name = MIRANDA; 139 pix = new JLabel(resourceManager.createImageIcon("miranda.jpg", name)); 140 pix.setToolTipText(resourceManager.getString("TabbedPaneDemo.miranda.tooltip")); 141 tabbedpane.add(name, pix); 142 143 name = EWAN; 144 pix = new JLabel(resourceManager.createImageIcon("ewan.jpg", name)); 145 tabbedpane.add(name, pix); 146 147 name = BOUNCE; 148 spin = new HeadSpin(); 149 tabbedpane.add(name, spin); 150 151 tabbedpane.getModel().addChangeListener((ChangeEvent e) -> { 152 SingleSelectionModel model = (SingleSelectionModel) e.getSource(); 153 if (model.getSelectedIndex() == tabbedpane.getTabCount() - 1) { 154 spin.go(); 155 } 156 }); 157 } 158 159 @Override 160 public void actionPerformed(ActionEvent e) { 161 if (e.getSource() == top) { 162 tabbedpane.setTabPlacement(JTabbedPane.TOP); 163 } else if (e.getSource() == left) { 164 tabbedpane.setTabPlacement(JTabbedPane.LEFT); 165 } else if (e.getSource() == bottom) { 166 tabbedpane.setTabPlacement(JTabbedPane.BOTTOM); 167 } else if (e.getSource() == right) { 168 tabbedpane.setTabPlacement(JTabbedPane.RIGHT); 169 } 170 } 171 172 private class HeadSpin extends JComponent implements ActionListener { 173 174 private javax.swing.Timer animator; 175 176 private final ImageIcon[] icon = new ImageIcon[6]; 177 178 private final static int numImages = 6; 179 180 private final double[] x = new double[numImages]; 181 private final double[] y = new double[numImages]; 182 183 private final int[] xh = new int[numImages]; 184 private final int[] yh = new int[numImages]; 185 186 private final double[] scale = new double[numImages]; 187 188 private final Random rand = new Random(); 189 190 public HeadSpin() { 191 setBackground(Color.black); 192 icon[0] = resourceManager.createImageIcon("ewan.gif", resourceManager.getString("TabbedPaneDemo.ewan")); 193 icon[1] = resourceManager.createImageIcon("stephen.gif", resourceManager.getString("TabbedPaneDemo.stephen")); 194 icon[2] = resourceManager.createImageIcon("david.gif", resourceManager.getString("TabbedPaneDemo.david")); 195 icon[3] = resourceManager.createImageIcon("matthew.gif", resourceManager.getString("TabbedPaneDemo.matthew")); 196 icon[4] = resourceManager.createImageIcon("blake.gif", resourceManager.getString("TabbedPaneDemo.blake")); 197 icon[5] = resourceManager.createImageIcon("brooke.gif", resourceManager.getString("TabbedPaneDemo.brooke")); 198 199 /* 200 for(int i = 0; i < 6; i++) { 201 x[i] = (double) rand.nextInt(500); 202 y[i] = (double) rand.nextInt(500); 203 } 204 */ 205 } 206 207 public void go() { 208 animator = new javax.swing.Timer(22 + 22 + 22, this); 209 animator.start(); 210 } 211 212 @Override 213 public void paint(Graphics g) { 214 g.setColor(getBackground()); 215 g.fillRect(0, 0, getWidth(), getHeight()); 216 217 for (int i = 0; i < numImages; i++) { 218 if (x[i] > 3 * i) { 219 nudge(i); 220 squish(g, icon[i], xh[i], yh[i], scale[i]); 221 } else { 222 x[i] += .05; 223 y[i] += .05; 224 } 225 } 226 } 227 228 public void nudge(int i) { 229 x[i] += (double) rand.nextInt(1000) / 8756; 230 y[i] += (double) rand.nextInt(1000) / 5432; 231 int tmpScale = (int) (Math.abs(Math.sin(x[i])) * 10); 232 scale[i] = (double) tmpScale / 10; 233 int nudgeX = (int) (((double) getWidth() / 2) * .8); 234 int nudgeY = (int) (((double) getHeight() / 2) * .60); 235 xh[i] = (int) (Math.sin(x[i]) * nudgeX) + nudgeX; 236 yh[i] = (int) (Math.sin(y[i]) * nudgeY) + nudgeY; 237 } 238 239 public void squish(Graphics g, ImageIcon icon, int x, int y, double scale) { 240 if (isVisible()) { 241 g.drawImage(icon.getImage(), x, y, 242 (int) (icon.getIconWidth() * scale), 243 (int) (icon.getIconHeight() * scale), 244 this); 245 } 246 } 247 248 @Override 249 public void actionPerformed(ActionEvent e) { 250 if (isVisible()) { 251 repaint(); 252 } else { 253 animator.stop(); 254 } 255 } 256 } 257} 258