TabbedPaneDemo.java revision 14305:566a5f5a9a5a
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.getContentPane().add(new TabbedPaneDemo());
95        frame.setPreferredSize(new Dimension(800, 600));
96        frame.pack();
97        frame.setLocationRelativeTo(null);
98        frame.setVisible(true);
99    }
100
101    /**
102     * TabbedPaneDemo Constructor
103     */
104    public TabbedPaneDemo() {
105        setLayout(new BorderLayout());
106
107        // create tab position controls
108        JPanel tabControls = new JPanel();
109        tabControls.add(new JLabel(TAB_PLACEMENT));
110        top = (JRadioButton) tabControls.add(new JRadioButton(TOP));
111        left = (JRadioButton) tabControls.add(new JRadioButton(LEFT));
112        bottom = (JRadioButton) tabControls.add(new JRadioButton(BOTTOM));
113        right = (JRadioButton) tabControls.add(new JRadioButton(RIGHT));
114        add(tabControls, BorderLayout.NORTH);
115
116        group = new ButtonGroup();
117        group.add(top);
118        group.add(bottom);
119        group.add(left);
120        group.add(right);
121
122        top.setSelected(true);
123
124        top.addActionListener(this);
125        bottom.addActionListener(this);
126        left.addActionListener(this);
127        right.addActionListener(this);
128
129        // create tab
130        tabbedpane = new JTabbedPane();
131        add(tabbedpane, BorderLayout.CENTER);
132
133        String name = CAMILLE;
134        JLabel pix = new JLabel(resourceManager.createImageIcon("camille.jpg", name));
135        tabbedpane.add(name, pix);
136
137        name = MIRANDA;
138        pix = new JLabel(resourceManager.createImageIcon("miranda.jpg", name));
139        pix.setToolTipText(resourceManager.getString("TabbedPaneDemo.miranda.tooltip"));
140        tabbedpane.add(name, pix);
141
142        name = EWAN;
143        pix = new JLabel(resourceManager.createImageIcon("ewan.jpg", name));
144        tabbedpane.add(name, pix);
145
146        name = BOUNCE;
147        spin = new HeadSpin();
148        tabbedpane.add(name, spin);
149
150        tabbedpane.getModel().addChangeListener((ChangeEvent e) -> {
151            SingleSelectionModel model = (SingleSelectionModel) e.getSource();
152            if (model.getSelectedIndex() == tabbedpane.getTabCount() - 1) {
153                spin.go();
154            }
155        });
156    }
157
158    @Override
159    public void actionPerformed(ActionEvent e) {
160        if (e.getSource() == top) {
161            tabbedpane.setTabPlacement(JTabbedPane.TOP);
162        } else if (e.getSource() == left) {
163            tabbedpane.setTabPlacement(JTabbedPane.LEFT);
164        } else if (e.getSource() == bottom) {
165            tabbedpane.setTabPlacement(JTabbedPane.BOTTOM);
166        } else if (e.getSource() == right) {
167            tabbedpane.setTabPlacement(JTabbedPane.RIGHT);
168        }
169    }
170
171    private class HeadSpin extends JComponent implements ActionListener {
172
173        private javax.swing.Timer animator;
174
175        private final ImageIcon[] icon = new ImageIcon[6];
176
177        private final static int numImages = 6;
178
179        private final double[] x = new double[numImages];
180        private final double[] y = new double[numImages];
181
182        private final int[] xh = new int[numImages];
183        private final int[] yh = new int[numImages];
184
185        private final double[] scale = new double[numImages];
186
187        private final Random rand = new Random();
188
189        public HeadSpin() {
190            setBackground(Color.black);
191            icon[0] = resourceManager.createImageIcon("ewan.gif", resourceManager.getString("TabbedPaneDemo.ewan"));
192            icon[1] = resourceManager.createImageIcon("stephen.gif", resourceManager.getString("TabbedPaneDemo.stephen"));
193            icon[2] = resourceManager.createImageIcon("david.gif", resourceManager.getString("TabbedPaneDemo.david"));
194            icon[3] = resourceManager.createImageIcon("matthew.gif", resourceManager.getString("TabbedPaneDemo.matthew"));
195            icon[4] = resourceManager.createImageIcon("blake.gif", resourceManager.getString("TabbedPaneDemo.blake"));
196            icon[5] = resourceManager.createImageIcon("brooke.gif", resourceManager.getString("TabbedPaneDemo.brooke"));
197
198            /*
199             for(int i = 0; i < 6; i++) {
200                 x[i] = (double) rand.nextInt(500);
201                 y[i] = (double) rand.nextInt(500);
202             }
203             */
204        }
205
206        public void go() {
207            if (animator == null) {
208                animator = new javax.swing.Timer(22 + 22 + 22, this);
209            }
210            animator.start();
211        }
212
213        @Override
214        public void paint(Graphics g) {
215            g.setColor(getBackground());
216            g.fillRect(0, 0, getWidth(), getHeight());
217
218            for (int i = 0; i < numImages; i++) {
219                if (x[i] > 3 * i) {
220                    nudge(i);
221                    squish(g, icon[i], xh[i], yh[i], scale[i]);
222                } else {
223                    x[i] += .05;
224                    y[i] += .05;
225                }
226            }
227        }
228
229        public void nudge(int i) {
230            x[i] += (double) rand.nextInt(1000) / 8756;
231            y[i] += (double) rand.nextInt(1000) / 5432;
232            int tmpScale = (int) (Math.abs(Math.sin(x[i])) * 10);
233            scale[i] = (double) tmpScale / 10;
234            int nudgeX = (int) (((double) getWidth() / 2) * .8);
235            int nudgeY = (int) (((double) getHeight() / 2) * .60);
236            xh[i] = (int) (Math.sin(x[i]) * nudgeX) + nudgeX;
237            yh[i] = (int) (Math.sin(y[i]) * nudgeY) + nudgeY;
238        }
239
240        public void squish(Graphics g, ImageIcon icon, int x, int y, double scale) {
241            if (isVisible()) {
242                g.drawImage(icon.getImage(), x, y,
243                        (int) (icon.getIconWidth() * scale),
244                        (int) (icon.getIconHeight() * scale),
245                        this);
246            }
247        }
248
249        @Override
250        public void actionPerformed(ActionEvent e) {
251            if (isShowing()) {
252                repaint();
253            } else {
254                animator.stop();
255            }
256        }
257    }
258}
259