001 package swingui; 002 003 import java.awt.BorderLayout; 004 import java.awt.GridLayout; 005 import java.awt.event.ActionEvent; 006 import java.awt.event.ActionListener; 007 008 import javax.swing.JButton; 009 import javax.swing.JLabel; 010 import javax.swing.JPanel; 011 import javax.swing.JTextField; 012 013 import physics3d.Vect3; 014 015 import components.GameObject; 016 017 /** A VelocityPanel allows the user to modify the velocity of a gameobject by directly 018 * modifying textfields. If the input is not a valid number, it is ignored. 019 * 020 * Strange, strange things may happen if the user sets the velocity too high or too low. 021 */ 022 public class VelocityPanel extends JPanel implements ActionListener { 023 //fields 024 /** the object whose velocity we are editing **/ 025 private GameObject obj; 026 027 //components 028 private JTextField velx; 029 private JTextField vely; 030 private JTextField velz; 031 private JButton setVelButton; 032 033 public VelocityPanel() { 034 ///////////////// 035 //ball velocity// 036 ///////////////// 037 038 //the velocity fields 039 int columns = 3; 040 velx = new JTextField(); 041 velx.setColumns(columns); 042 vely = new JTextField(); 043 vely.setColumns(columns); 044 velz = new JTextField(); 045 velz.setColumns(columns); 046 setVelButton = new JButton("Set Ball Velocity"); 047 setVelButton.addActionListener(this); 048 049 //layout 050 JPanel bvPanel = new JPanel(new GridLayout(3, 2)); 051 bvPanel.add(new JLabel("x: ")); 052 bvPanel.add(velx); 053 bvPanel.add(new JLabel("y: ")); 054 bvPanel.add(vely); 055 bvPanel.add(new JLabel("z: ")); 056 bvPanel.add(velz); 057 058 this.setLayout(new BorderLayout()); 059 add(bvPanel, BorderLayout.CENTER); 060 add(setVelButton, BorderLayout.SOUTH); 061 } 062 063 /** set the object of interest **/ 064 public void setObject(GameObject obj) { 065 this.obj = obj; 066 if (obj != null) { 067 configureVelocity(); 068 } 069 } 070 071 /** 072 * @requires selected instanceof Ball 073 */ 074 private void configureVelocity() { 075 if (obj == null) 076 throw new RuntimeException("cannot configure null obj velocity"); 077 Vect3 v = obj.getVelocity(); 078 velx.setText(String.valueOf(v.x())); 079 vely.setText(String.valueOf(v.y())); 080 velz.setText(String.valueOf(v.z())); 081 } 082 /** when clicked, set the velocity of the current object **/ 083 public void actionPerformed(ActionEvent e) { 084 String xs = velx.getText().trim(); 085 String ys = vely.getText().trim(); 086 String zs = velz.getText().trim(); 087 088 try { 089 double x = Double.valueOf(xs).doubleValue(); 090 double y = Double.valueOf(ys).doubleValue(); 091 double z = Double.valueOf(zs).doubleValue(); 092 obj.setVelocity(new Vect3(x, y, z)); 093 } catch (Exception ex) { return; } 094 } 095 096 public String getName() { return "Velocity"; } 097 }