菜鸟求助,关于用JButton控制Java3D的问题
刚学Java一个多月,很多东西都不懂。现在被老师赶着写个程序,要实现4*4*4的小立方体依次出现的效果,还要用JSlider和JButton去控制它。我现在把JSlider那块写完了,可以做到拖动滑块Canvas上出现相应的立方体数。但是Button那里搞不定,我想要的是一按Start动画从头开始,按Stop就停止。请大家帮我看一下,下面是代码,被我写得有点乱。另外,我是新手,分数少得可怜,不好意思。
// TestBoundingBox.java
import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.GraphicsConfiguration;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.media.j3d.Alpha;
import javax.media.j3d.BoundingBox;
import javax.media.j3d.BoundingSphere;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.Canvas3D;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.event.*;
import javax.vecmath.Point3d;
import com.sun.j3d.utils.behaviors.vp.OrbitBehavior;
import com.sun.j3d.utils.universe.SimpleUniverse;
import com.sun.j3d.utils.universe.ViewingPlatform;
public class TestBoundingBox {
/**
* set coordinates for every surface of the bounding box
*
* @param points
* @param vs
* @param position
*/
private Frame frame;
private JPanel panel;
private JSlider slider;
private JButton startButton;
private JButton stopButton;
private int numberOfPortion;
private int numberOfPortionSum;
private SingleBox[] singleBoxes;
private Canvas3D canvas3D;
private BoundingBox bbox;
private BranchGroup bg;
private SimpleUniverse simpleU;
private int PreDatum;
static final int MIN = 0;
static final int INIT = 0;
public void discreteCube(BoundingBox bbox, Double factor,
Point3d translation, BranchGroup objRoot, String color,
Integer viewType, int numberOfPortion) {
Point3d lower = new Point3d();
bbox.getLower(lower);
Point3d upper = new Point3d();
bbox.getUpper(upper);
double interval = Math.abs(upper.x - lower.x) / numberOfPortion;
BoundingBox[][][] bb = new BoundingBox[numberOfPortion][numberOfPortion][numberOfPortion];
int counter = 0;
for (int i = 0; i < numberOfPortion; i++) {
for (int j = 0; j < numberOfPortion; j++) {
for (int k = 0; k < numberOfPortion; k++) {
bb[i][j][k] = new BoundingBox(new Point3d(lower.x + i
* interval, lower.y + j * interval, lower.z + k
* interval), new Point3d(lower.x + (i + 1)
* interval, lower.y + (j + 1) * interval, lower.z
+ (k + 1) * interval));
singleBoxes[counter].drawBox(bb[i][j][k], factor, translation, objRoot,
color, viewType);
counter++;
}
}
}
System.out.println("The volume of unit cube is: " + interval * interval
* interval);
System.out.println("The volume of whole cube is: " + interval
* numberOfPortion * interval * numberOfPortion * interval
* numberOfPortion);
}
private void setupView(SimpleUniverse universe, Canvas3D canvas,
BoundingSphere bounds) {
// add mouse interaction to the ViewingPlatform
OrbitBehavior orbit = new OrbitBehavior(canvas,
OrbitBehavior.REVERSE_ALL);
orbit.setSchedulingBounds(bounds);
ViewingPlatform viewingPlatform = universe.getViewingPlatform();
// This will move the ViewPlatform back a bit so the
// objects in the scene can be viewed.
viewingPlatform.setNominalViewingTransform();
viewingPlatform.setViewPlatformBehavior(orbit);
}
public TestBoundingBox() {
PreDatum = -1;
numberOfPortion = 4;
numberOfPortionSum = numberOfPortion * numberOfPortion
* numberOfPortion;
singleBoxes = new SingleBox[numberOfPortionSum];
for (int i = 0; i < numberOfPortionSum; i++) {
singleBoxes[i] = new SingleBox();
}
Point3d min = new Point3d(-1, -1, -1);
Point3d max = new Point3d(1, 1, 1);
bbox = new BoundingBox();
bbox.setLower(min);
bbox.setUpper(max);
frame = new Frame("3D Modell");
GraphicsConfiguration config = SimpleUniverse
.getPreferredConfiguration();
canvas3D = new Canvas3D(config);
canvas3D.setSize(500, 500);
canvas3D.setDoubleBufferEnable(true);
frame.add(canvas3D);
panel = new JPanel();
slider = new JSlider(JSlider.HORIZONTAL, MIN, numberOfPortion
* numberOfPortion * numberOfPortion - 1, INIT);
slider.addChangeListener(new SliderListener());
slider.setMajorTickSpacing(1);
// slider.setMinorTickSpacing(2);
slider.setPaintTicks(true);
slider.setPaintLabels(true);
startButton = new JButton("start");
startButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
System.out.println("start Animation");
redo(slider.getValue());
// if (PreDatum > -1)
// {
// if(PreDatum > slider.getValue()){
//
// }
// }
//
// for (int i = 0; i < numberOfPortionSum; i++)
// {
// singleBoxes[i].startDraw(0);
// }
//
// for (int i = 0; i < numberOfPortionSum; i++)
// {
// singleBoxes[i].setTransparent(1);
// }
// for (int i = 0; i < numberOfPortionSum; i++) {
// singleBoxes[i].setTransparent(1);
// }
// for (int i = 0; i < slider.getValue(); i++)
// {
// singleBoxes[i].startDraw(i);
// }
//
// for (int i = 0; i < numberOfPortionSum; i++) {
// //singleBoxes[i].setTransparent(0);
// singleBoxes[i].startDraw(i);
// }
}
});
stopButton = new JButton("stop");
stopButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
simpleU.cleanup();
simpleU.getCanvas();
canvas3D.repaint();
// discreteCube(bbox, null, null, bg, "red", null,
// numberOfPortion);
}
});
frame.add(panel, BorderLayout.SOUTH);
panel.add(slider, BorderLayout.WEST);
panel.add(startButton);
panel.add(stopButton);
simpleU = new SimpleUniverse(canvas3D);
bg = new BranchGroup();
discreteCube(bbox, null, null, bg, "red", null, numberOfPortion);
simpleU.addBranchGraph(bg);
BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0),
1000.0);
this.setupView(simpleU, canvas3D, bounds);
simpleU.getViewingPlatform().setNominalViewingTransform();
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent winEvent) {
System.exit(0);
}
});
frame.pack();
frame.setVisible(true);
}
public class SliderListener implements ChangeListener
{
public void stateChanged(ChangeEvent e)
{
System.out.println(slider.getValue());
if (PreDatum > -1)
{
if(PreDatum > slider.getValue()){
}
}
for (int i = 0; i < numberOfPortionSum; i++)
{
singleBoxes[i].startDraw(0);
}
for (int i = 0; i < slider.getValue(); i++)
{
singleBoxes[i].setTransparent(0);
}
for (int i = numberOfPortionSum-1; i > slider.getValue(); i--)
{
singleBoxes[i].setTransparent(1);
}
// for (int i = 0; i < slider.getValue(); i++) {
// singleBoxes[i].startDraw(0);
// }
}
}
public void redo(int datum)
{
// bg = new BranchGroup();
// discreteCube(bbox, null, null, bg, "red", null, numberOfPortion);
// simpleU.addBranchGraph(bg);
//
if (PreDatum > -1)
{
if(PreDatum > datum){
}
}
for (int i = 0; i < datum; i++)
{
singleBoxes[i].setTransparent(0);
singleBoxes[i].startDraw(i);
}
for (int i = numberOfPortionSum-1; i > datum; i--)
{
singleBoxes[i].setTransparent(1);
// singleBoxes[i].startDraw(0);
}
}
public static void main(String[] args) {
new TestBoundingBox();
}
}