📄 booksdemo.java
字号:
import java.awt.*;import java.awt.event.*;import java.awt.image.*;import javax.swing.*;import javax.media.j3d.*;import javax.vecmath.*;import java.util.*;import com.sun.j3d.utils.geometry.*;import com.sun.j3d.utils.image.*;import com.sun.j3d.utils.universe.*; public class BooksDemo extends JFrame{ private static final int CANVAS3D_WIDTH = 400; private static final int CANVAS3D_HEIGHT = 400; private boolean front = true; private JPanel centerPanel = new JPanel(); private Canvas3D c3d; private RotationInterpolator rotator1; private Alpha rotor1Alpha; private com.sun.j3d.utils.geometry.Box book; private HashMap textures = new HashMap(6); public BooksDemo() { super("AmazonPick"); JButton cover1 = UIHelper.createButton("", "cover1_small_button", true); cover1.addActionListener(new CoverSwitcher("cover1")); JButton cover2 = UIHelper.createButton("", "cover2_small_button", true); cover2.addActionListener(new CoverSwitcher("cover2")); JButton cover3 = UIHelper.createButton("", "cover3_small_button", true); cover3.addActionListener(new CoverSwitcher("cover3")); JPanel buttons = new JPanel(); buttons.add(cover1); buttons.add(cover2); buttons.add(cover3); buttons.setOpaque(false); c3d = new Canvas3D(SimpleUniverse.getPreferredConfiguration()); c3d.setSize(CANVAS3D_WIDTH, CANVAS3D_HEIGHT); centerPanel.add(c3d); centerPanel.setOpaque(false); this.setContentPane(new GradientPanel()); this.getContentPane().setLayout(new BorderLayout()); this.getContentPane().add(centerPanel, BorderLayout.CENTER); this.getContentPane().add(buttons, BorderLayout.SOUTH); JPopupMenu.setDefaultLightWeightPopupEnabled(false); JMenuBar menuBar = new JMenuBar(); JMenu fileMenu = new JMenu("File"); fileMenu.add(new JMenuItem("New Search...")); fileMenu.add(new JMenuItem("Save Search...")); fileMenu.addSeparator(); fileMenu.add(new JMenuItem("Quit")); menuBar.add(fileMenu); this.setJMenuBar(menuBar); this.pack(); this.setResizable(false); this.setDefaultCloseOperation(EXIT_ON_CLOSE); UIHelper.centerOnScreen(this); } private boolean isBookShowingFront() { return front; } private void rotateBook() { if (!isBookShowingFront()) { rotator1.setMinimumAngle((float) Math.PI * 1.0f); rotator1.setMaximumAngle(0.0f); } else { rotator1.setMinimumAngle(0.0f); rotator1.setMaximumAngle((float) Math.PI * 1.0f); } front = !front; rotor1Alpha.setStartTime(System.currentTimeMillis()); } private class CoverSwitcher implements ActionListener { private String coverName; CoverSwitcher(String coverName) { this.coverName = coverName; } public void actionPerformed(ActionEvent evt) { book.getShape(isBookShowingFront() ? book.BACK : book.FRONT).setAppearance((Appearance) textures.get(coverName)); rotateBook(); } } protected Background createBackground() { BufferedImage image = new BufferedImage(getContentPane().getWidth(), getContentPane().getHeight(), BufferedImage.TYPE_INT_RGB); getContentPane().paint(image.getGraphics()); BufferedImage subImage = new BufferedImage(CANVAS3D_WIDTH, CANVAS3D_HEIGHT, BufferedImage.TYPE_INT_RGB); Graphics2D subGraphics = (Graphics2D) subImage.getGraphics(); subGraphics.drawImage(image, null, -c3d.getX(), -c3d.getY()); Background bg = new Background(new ImageComponent2D(ImageComponent2D.FORMAT_RGB, subImage)); BoundingSphere bounds = new BoundingSphere(); bounds.setRadius(100.0); bg.setApplicationBounds(bounds); return bg; } public void createScene() { BranchGroup objRoot = new BranchGroup(); objRoot.addChild(createBackground()); TransformGroup objTg = new TransformGroup(); objTg.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); BoundingSphere bounds = new BoundingSphere(); bounds.setRadius(100.0); Transform3D yAxis = new Transform3D(); rotor1Alpha = new Alpha(1, 400); rotator1 = new RotationInterpolator(rotor1Alpha, objTg, yAxis, (float) Math.PI * 1.0f, (float) Math.PI * 2.0f); rotator1.setSchedulingBounds(bounds); textures.put("pages_top", createTexture("pages_top.jpg")); textures.put("pages", createTexture("amazon.jpg")); textures.put("amazon", createTexture("amazon.jpg")); textures.put("cover1", createTexture("cover1.jpg")); textures.put("cover2", createTexture("cover2.jpg")); textures.put("cover3", createTexture("cover3.jpg")); book = new com.sun.j3d.utils.geometry.Box(0.5f, 0.7f, 0.15f, com.sun.j3d.utils.geometry.Box.GENERATE_TEXTURE_COORDS, new Appearance()); book.getShape(book.TOP).setAppearance((Appearance) textures.get("pages_top")); book.getShape(book.RIGHT).setAppearance((Appearance) textures.get("pages")); book.getShape(book.LEFT).setAppearance((Appearance) textures.get("amazon")); book.getShape(book.FRONT).setAppearance((Appearance) textures.get("cover1")); book.getShape(book.BACK).setCapability(Shape3D.ALLOW_APPEARANCE_WRITE); book.getShape(book.FRONT).setCapability(Shape3D.ALLOW_APPEARANCE_WRITE); objTg.addChild(book); objTg.addChild(rotator1); Transform3D spin = new Transform3D(); Transform3D tempspin = new Transform3D(); spin.rotX(Math.PI / 8.0d); tempspin.rotY(Math.PI / 7.0d); spin.mul(tempspin); TransformGroup objTrans = new TransformGroup(spin); objTrans.addChild(objTg); objRoot.addChild(objTrans); SimpleUniverse u = new SimpleUniverse(c3d); u.getViewingPlatform().setNominalViewingTransform(); u.addBranchGraph(objRoot); View view = u.getViewer().getView(); view.setSceneAntialiasingEnable(true); } private Appearance createTexture(String fileName) { Image sourceImage = UIHelper.readImage(fileName); if (sourceImage == null) System.out.println("Image could not be loaded from " + fileName); TextureLoader loader = new TextureLoader(sourceImage, this); ImageComponent2D image = loader.getImage(); if (image == null) System.out.println("Texture could not be loaded from " + fileName); Texture2D texture = new Texture2D(Texture.BASE_LEVEL, Texture.RGBA, image.getWidth(), image.getHeight()); texture.setImage(0, image); texture.setEnable(true); texture.setMagFilter(Texture.BASE_LEVEL_LINEAR); texture.setMinFilter(Texture.BASE_LEVEL_LINEAR); Appearance appearance = new Appearance(); PolygonAttributes polyAttributes = new PolygonAttributes(PolygonAttributes.POLYGON_FILL, PolygonAttributes.CULL_NONE, 0f); appearance.setPolygonAttributes(polyAttributes); appearance.setTexture(texture); TextureAttributes textureAttributes = new TextureAttributes(); appearance.setTextureAttributes(textureAttributes); return appearance; } private static class GradientPanel extends JPanel { public void paintComponent(Graphics g) { super.paintComponent(g); if (!isOpaque()) { return; } int width = getWidth(); int height = getHeight(); Graphics2D g2 = (Graphics2D) g; Paint storedPaint = g2.getPaint(); g2.setPaint(new GradientPaint(0, 0, Color.WHITE, width, height, new Color(200, 200, 200))); g2.fillRect(0, 0, width, height); g2.setPaint(storedPaint); } } public static void main(String argv[]) { final BooksDemo xframe = new BooksDemo(); xframe.setVisible(true); SwingUtilities.invokeLater(new Runnable() { public void run() { xframe.createScene(); } }); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -