| 1 | /* |
| 2 | * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. |
| 3 | * |
| 4 | * Redistribution and use in source and binary forms, with or without |
| 5 | * modification, are permitted provided that the following conditions |
| 6 | * are met: |
| 7 | * |
| 8 | * -Redistributions of source code must retain the above copyright |
| 9 | * notice, this list of conditions and the following disclaimer. |
| 10 | * |
| 11 | * -Redistribution in binary form must reproduct the above copyright |
| 12 | * notice, this list of conditions and the following disclaimer in |
| 13 | * the documentation and/or other materials provided with the distribution. |
| 14 | * |
| 15 | * Neither the name of Sun Microsystems, Inc. or the names of contributors |
| 16 | * may be used to endorse or promote products derived from this software |
| 17 | * without specific prior written permission. |
| 18 | * |
| 19 | * This software is provided "AS IS," without a warranty of any kind. ALL |
| 20 | * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING |
| 21 | * ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE |
| 22 | * OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT |
| 23 | * BE LIABLE FOR ANY DAMAGES OR LIABILITIES SUFFERED BY LICENSEE AS A RESULT |
| 24 | * OF OR RELATING TO USE, MODIFICATION OR DISTRIBUTION OF THE SOFTWARE OR ITS |
| 25 | * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST |
| 26 | * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, |
| 27 | * INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY |
| 28 | * OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE SOFTWARE, EVEN |
| 29 | * IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. |
| 30 | * |
| 31 | * You acknowledge that Software is not designed, licensed or intended for |
| 32 | * use in the design, construction, operation or maintenance of any nuclear |
| 33 | * facility. |
| 34 | */ |
| 35 | |
| 36 | /* |
| 37 | * @(#)TabbedPaneDemo.java 1.8 03/01/23 |
| 38 | */ |
| 39 | |
| 40 | |
| 41 | import javax.swing.*; |
| 42 | import javax.swing.event.*; |
| 43 | import javax.swing.text.*; |
| 44 | import javax.swing.border.*; |
| 45 | import javax.swing.colorchooser.*; |
| 46 | import javax.swing.filechooser.*; |
| 47 | import javax.accessibility.*; |
| 48 | |
| 49 | import java.awt.*; |
| 50 | import java.awt.event.*; |
| 51 | import java.beans.*; |
| 52 | import java.util.*; |
| 53 | import java.io.*; |
| 54 | import java.applet.*; |
| 55 | import java.net.*; |
| 56 | |
| 57 | /** |
| 58 | * JTabbedPane Demo |
| 59 | * |
| 60 | * @version 1.8 01/23/03 |
| 61 | * @author Jeff Dinkins |
| 62 | */ |
| 63 | public class TabbedPaneDemo extends DemoModule implements ActionListener { |
| 64 | HeadSpin spin; |
| 65 | |
| 66 | JTabbedPane tabbedpane; |
| 67 | |
| 68 | ButtonGroup group; |
| 69 | |
| 70 | JRadioButton top; |
| 71 | JRadioButton bottom; |
| 72 | JRadioButton left; |
| 73 | JRadioButton right; |
| 74 | |
| 75 | /** |
| 76 | * main method allows us to run as a standalone demo. |
| 77 | */ |
| 78 | public static void main(String[] args) { |
| 79 | TabbedPaneDemo demo = new TabbedPaneDemo(null); |
| 80 | demo.mainImpl(); |
| 81 | } |
| 82 | |
| 83 | /** |
| 84 | * TabbedPaneDemo Constructor |
| 85 | */ |
| 86 | public TabbedPaneDemo(SwingSet2 swingset) { |
| 87 | // Set the title for this demo, and an icon used to represent this |
| 88 | // demo inside the SwingSet2 app. |
| 89 | super(swingset, "TabbedPaneDemo", "toolbar/JTabbedPane.gif"); |
| 90 | |
| 91 | // create tab position controls |
| 92 | JPanel tabControls = new JPanel(); |
| 93 | tabControls.add(new JLabel(getString("TabbedPaneDemo.label"))); |
| 94 | top = (JRadioButton) tabControls.add(new JRadioButton(getString("TabbedPaneDemo.top"))); |
| 95 | left = (JRadioButton) tabControls.add(new JRadioButton(getString("TabbedPaneDemo.left"))); |
| 96 | bottom = (JRadioButton) tabControls.add(new JRadioButton(getString("TabbedPaneDemo.bottom"))); |
| 97 | right = (JRadioButton) tabControls.add(new JRadioButton(getString("TabbedPaneDemo.right"))); |
| 98 | getDemoPanel().add(tabControls, BorderLayout.NORTH); |
| 99 | |
| 100 | group = new ButtonGroup(); |
| 101 | group.add(top); |
| 102 | group.add(bottom); |
| 103 | group.add(left); |
| 104 | group.add(right); |
| 105 | |
| 106 | top.setSelected(true); |
| 107 | |
| 108 | top.addActionListener(this); |
| 109 | bottom.addActionListener(this); |
| 110 | left.addActionListener(this); |
| 111 | right.addActionListener(this); |
| 112 | |
| 113 | // create tab |
| 114 | tabbedpane = new JTabbedPane(); |
| 115 | getDemoPanel().add(tabbedpane, BorderLayout.CENTER); |
| 116 | |
| 117 | String name = getString("TabbedPaneDemo.laine"); |
| 118 | JLabel pix = new JLabel(createImageIcon("tabbedpane/laine.jpg", name)); |
| 119 | tabbedpane.add(name, pix); |
| 120 | |
| 121 | name = getString("TabbedPaneDemo.ewan"); |
| 122 | pix = new JLabel(createImageIcon("tabbedpane/ewan.jpg", name)); |
| 123 | tabbedpane.add(name, pix); |
| 124 | |
| 125 | name = getString("TabbedPaneDemo.hania"); |
| 126 | pix = new JLabel(createImageIcon("tabbedpane/hania.jpg", name)); |
| 127 | tabbedpane.add(name, pix); |
| 128 | |
| 129 | name = getString("TabbedPaneDemo.bounce"); |
| 130 | spin = new HeadSpin(); |
| 131 | tabbedpane.add(name, spin); |
| 132 | |
| 133 | tabbedpane.getModel().addChangeListener( |
| 134 | new ChangeListener() { |
| 135 | public void stateChanged(ChangeEvent e) { |
| 136 | SingleSelectionModel model = (SingleSelectionModel) e.getSource(); |
| 137 | if(model.getSelectedIndex() == tabbedpane.getTabCount()-1) { |
| 138 | spin.go(); |
| 139 | } |
| 140 | } |
| 141 | } |
| 142 | ); |
| 143 | } |
| 144 | |
| 145 | public void actionPerformed(ActionEvent e) { |
| 146 | if(e.getSource() == top) { |
| 147 | tabbedpane.setTabPlacement(JTabbedPane.TOP); |
| 148 | } else if(e.getSource() == left) { |
| 149 | tabbedpane.setTabPlacement(JTabbedPane.LEFT); |
| 150 | } else if(e.getSource() == bottom) { |
| 151 | tabbedpane.setTabPlacement(JTabbedPane.BOTTOM); |
| 152 | } else if(e.getSource() == right) { |
| 153 | tabbedpane.setTabPlacement(JTabbedPane.RIGHT); |
| 154 | } |
| 155 | } |
| 156 | |
| 157 | class HeadSpin extends JComponent implements ActionListener { |
| 158 | javax.swing.Timer animator; |
| 159 | |
| 160 | ImageIcon icon[] = new ImageIcon[6]; |
| 161 | |
| 162 | int tmpScale; |
| 163 | |
| 164 | final static int numImages = 6; |
| 165 | |
| 166 | double x[] = new double[numImages]; |
| 167 | double y[] = new double[numImages]; |
| 168 | |
| 169 | int xh[] = new int[numImages]; |
| 170 | int yh[] = new int[numImages]; |
| 171 | |
| 172 | double scale[] = new double[numImages]; |
| 173 | |
| 174 | public HeadSpin() { |
| 175 | setBackground(Color.black); |
| 176 | icon[0] = createImageIcon("tabbedpane/ewan.gif", getString("TabbedPaneDemo.ewan")); |
| 177 | icon[1] = createImageIcon("tabbedpane/stephen.gif", getString("TabbedPaneDemo.stephen")); |
| 178 | icon[2] = createImageIcon("tabbedpane/david.gif", getString("TabbedPaneDemo.david")); |
| 179 | icon[3] = createImageIcon("tabbedpane/matthew.gif", getString("TabbedPaneDemo.matthew")); |
| 180 | icon[4] = createImageIcon("tabbedpane/blake.gif", getString("TabbedPaneDemo.blake")); |
| 181 | icon[5] = createImageIcon("tabbedpane/brooke.gif", getString("TabbedPaneDemo.brooke")); |
| 182 | |
| 183 | /* |
| 184 | for(int i = 0; i < 6; i++) { |
| 185 | x[i] = (double) rand.nextInt(500); |
| 186 | y[i] = (double) rand.nextInt(500); |
| 187 | } |
| 188 | */ |
| 189 | } |
| 190 | |
| 191 | public void go() { |
| 192 | animator = new javax.swing.Timer(22 + 22 + 22, this); |
| 193 | animator.start(); |
| 194 | } |
| 195 | |
| 196 | public void paint(Graphics g) { |
| 197 | g.setColor(getBackground()); |
| 198 | g.fillRect(0, 0, getWidth(), getHeight()); |
| 199 | |
| 200 | for(int i = 0; i < numImages; i++) { |
| 201 | if(x[i] > 3*i) { |
| 202 | nudge(i); |
| 203 | squish(g, icon[i], xh[i], yh[i], scale[i]); |
| 204 | } else { |
| 205 | x[i] += .05; |
| 206 | y[i] += .05; |
| 207 | } |
| 208 | } |
| 209 | } |
| 210 | |
| 211 | Random rand = new Random(); |
| 212 | |
| 213 | public void nudge(int i) { |
| 214 | x[i] += (double) rand.nextInt(1000) / 8756; |
| 215 | y[i] += (double) rand.nextInt(1000) / 5432; |
| 216 | int tmpScale = (int) (Math.abs(Math.sin(x[i])) * 10); |
| 217 | scale[i] = (double) tmpScale / 10; |
| 218 | int nudgeX = (int) (((double) getWidth()/2) * .8); |
| 219 | int nudgeY = (int) (((double) getHeight()/2) * .60); |
| 220 | xh[i] = (int) (Math.sin(x[i]) * nudgeX) + nudgeX; |
| 221 | yh[i] = (int) (Math.sin(y[i]) * nudgeY) + nudgeY; |
| 222 | } |
| 223 | |
| 224 | public void squish(Graphics g, ImageIcon icon, int x, int y, double scale) { |
| 225 | if(isVisible()) { |
| 226 | g.drawImage(icon.getImage(), x, y, |
| 227 | (int) (icon.getIconWidth()*scale), |
| 228 | (int) (icon.getIconHeight()*scale), |
| 229 | this); |
| 230 | } |
| 231 | } |
| 232 | |
| 233 | public void actionPerformed(ActionEvent e) { |
| 234 | if(isVisible()) { |
| 235 | repaint(); |
| 236 | } else { |
| 237 | animator.stop(); |
| 238 | } |
| 239 | } |
| 240 | } |
| 241 | } |
| 242 | |