Skip to content

Commit 845bebb

Browse files
committed
In progress
1 parent 075f216 commit 845bebb

5 files changed

Lines changed: 126 additions & 49 deletions

File tree

.classpath

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,7 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<classpath>
33
<classpathentry kind="src" path="src"/>
4-
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11">
5-
<attributes>
6-
<attribute name="module" value="true"/>
7-
</attributes>
8-
</classpathentry>
4+
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
95
<classpathentry kind="lib" path="lib/commons-cli-1.4.jar"/>
106
<classpathentry kind="lib" path="lib/json.jar"/>
117
<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/5"/>

src/simulator/view/ControlPanel.java

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import javax.swing.JSpinner;
1717
import javax.swing.JTextField;
1818
import javax.swing.JToolBar;
19+
import javax.swing.SpinnerNumberModel;
1920
import javax.swing.SwingUtilities;
2021

2122
import simulator.control.Controller;
@@ -36,9 +37,8 @@ class ControlPanel extends JPanel implements SimulatorObserver {
3637
private JButton _stopButton;
3738
private JSpinner _stepsEnter;
3839
private JTextField _deltaTimeEnter;
39-
private int _steps = 0;
40-
private double _deltaTime = 0.0;
41-
40+
private ForceLawsDialog _forceLawsDialog;
41+
4242
// TODO añade más atributos aquí …
4343
ControlPanel(Controller ctrl) {
4444
_ctrl = ctrl;
@@ -74,15 +74,20 @@ private void initGUI() {
7474
_forceLawsButton = new JButton();
7575
_forceLawsButton.setToolTipText("Select force laws for groups");
7676
_forceLawsButton.setIcon(new ImageIcon("resources/icons/physics.png"));
77-
_forceLawsButton.addActionListener((e) -> Utils.quit(this));
77+
_forceLawsButton.addActionListener((e) -> {
78+
if (_forceLawsDialog == null)
79+
_forceLawsDialog = new ForceLawsDialog((JFrame) Utils.getWindow(ControlPanel.this), _ctrl);
80+
81+
_forceLawsDialog.open();
82+
});
7883
_toolaBar.add(_forceLawsButton);
7984

8085
// Viewer Button
8186
_viewerButton = new JButton();
8287
_viewerButton.setToolTipText("Open viewer window");
8388
_viewerButton.setIcon(new ImageIcon("resources/icons/viewer.png"));
8489
_viewerButton.addActionListener((e) -> {
85-
new ViewerWindow((JFrame) Utils.getWindow(this), _ctrl);
90+
new ViewerWindow((JFrame) Utils.getWindow(ControlPanel.this), _ctrl);
8691
});
8792
_toolaBar.add(_viewerButton);
8893
_toolaBar.addSeparator();
@@ -100,10 +105,8 @@ private void initGUI() {
100105
_viewerButton.setEnabled(false);
101106
_runButton.setEnabled(false);
102107

103-
_deltaTime = Double.parseDouble(_deltaTimeEnter.getText());
104-
_steps = (int)_stepsEnter.getValue();
105-
106-
SwingUtilities.invokeLater(() -> run_sim(_steps));
108+
_ctrl.setDeltaTime(Double.parseDouble(_deltaTimeEnter.getText()));
109+
SwingUtilities.invokeLater(() -> run_sim((int) _stepsEnter.getValue()));
107110
});
108111
_toolaBar.add(_runButton);
109112

@@ -123,17 +126,18 @@ private void initGUI() {
123126
_toolaBar.add(_stopButton);
124127

125128
_toolaBar.add(new JLabel("Steps: "));
126-
_stepsEnter = new JSpinner();
127-
_stepsEnter.setPreferredSize(new Dimension(60, 40));
128-
_stepsEnter.setMaximumSize(new Dimension(60, 40));
129-
_stepsEnter.setToolTipText("Simulation steps to run: 1-10000");
129+
_stepsEnter = new JSpinner(new SpinnerNumberModel(10, 1, 10000, 1));
130+
_stepsEnter.setToolTipText("Simulation tick to run: 1-10000");
131+
_stepsEnter.setMaximumSize(new Dimension(80, 40));
132+
_stepsEnter.setMinimumSize(new Dimension(80, 40));
133+
_stepsEnter.setPreferredSize(new Dimension(80, 40));
130134
_toolaBar.add(_stepsEnter);
131135

132136
_toolaBar.add(new JLabel("Delta-Time: "));
133137
_deltaTimeEnter = new JTextField();
134-
_deltaTimeEnter.setPreferredSize(new Dimension(60, 40));
135-
_deltaTimeEnter.setMaximumSize(new Dimension(60, 40));
136-
_deltaTimeEnter.setText("0.0");
138+
_deltaTimeEnter.setPreferredSize(new Dimension(80, 40));
139+
_deltaTimeEnter.setMaximumSize(new Dimension(80, 40));
140+
_deltaTimeEnter.setText("10.0");
137141
_deltaTimeEnter.setToolTipText("Real time (seconds) corresponding to a step");
138142
_toolaBar.add(_deltaTimeEnter);
139143

@@ -185,8 +189,6 @@ private void run_sim(int n) {
185189

186190
@Override
187191
public void onAdvance(Map<String, BodiesGroup> groups, double time) {
188-
// TODO Auto-generated method stub
189-
190192
}
191193

192194
@Override
@@ -211,12 +213,9 @@ public void onBodyAdded(Map<String, BodiesGroup> groups, Body b) {
211213

212214
@Override
213215
public void onDeltaTimeChanged(double dt) {
214-
// TODO Auto-generated method stub
215-
216216
}
217217

218218
@Override
219219
public void onForceLawsChanged(BodiesGroup g) {
220220
}
221221
}
222-
Lines changed: 97 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,29 @@
11
package simulator.view;
22

3+
import java.awt.Component;
34
import java.awt.Dimension;
45
import java.awt.Frame;
6+
import java.awt.event.ActionEvent;
7+
import java.awt.event.ActionListener;
58
import java.util.List;
69
import java.util.Map;
710

11+
import javax.swing.Box;
812
import javax.swing.BoxLayout;
913
import javax.swing.DefaultComboBoxModel;
14+
import javax.swing.JButton;
15+
import javax.swing.JComboBox;
1016
import javax.swing.JDialog;
17+
import javax.swing.JFrame;
18+
import javax.swing.JLabel;
1119
import javax.swing.JPanel;
20+
import javax.swing.JScrollPane;
1221
import javax.swing.JTable;
1322
import javax.swing.table.DefaultTableModel;
23+
import javax.swing.table.TableCellRenderer;
24+
import javax.swing.table.TableColumn;
1425

1526
import org.json.JSONObject;
16-
1727
import simulator.control.Controller;
1828
import simulator.model.BodiesGroup;
1929
import simulator.model.Body;
@@ -28,10 +38,14 @@ class ForceLawsDialog extends JDialog implements SimulatorObserver {
2838
private String[] _headers = { "Key", "Value", "Description" };
2939

3040
// TODO en caso de ser necesario, añadir los atributos aquí…
31-
int _status;
41+
int _status = 0;
42+
private JFrame _parent;
43+
private JComboBox<String> _lawscomb;
44+
private JComboBox<String> _groupscomb;
3245

3346
ForceLawsDialog(Frame parent, Controller ctrl) {
3447
super(parent, true);
48+
_parent = (JFrame) parent;
3549
_ctrl = ctrl;
3650
initGUI();
3751
ctrl.addObserver(this);
@@ -42,24 +56,94 @@ private void initGUI() {
4256
JPanel mainPanel = new JPanel();
4357
mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));
4458
setContentPane(mainPanel);
59+
4560
// _forceLawsInfo se usará para establecer la información en la tabla
4661
_forceLawsInfo = _ctrl.getForceLawsInfo();
4762

63+
// help
64+
JLabel help = new JLabel(
65+
"<html><p>Select a force law and provide values for the parametes in the Value column (default values are used for parametes with no value).</p></html>");
66+
67+
help.setAlignmentX(CENTER_ALIGNMENT);
68+
mainPanel.add(help);
69+
70+
mainPanel.add(Box.createRigidArea(new Dimension(0, 20)));
71+
4872
_dataTableModel = new DefaultTableModel() {
4973
@Override
5074
public boolean isCellEditable(int row, int column) {
5175
return column == 1;
5276
}
5377
};
54-
mainPanel.add(new JTable(_dataTableModel));
78+
JTable dataTable = new JTable(_dataTableModel) {
79+
private static final long serialVersionUID = 1L;
80+
81+
// we override prepareRenderer to resize columns to fit to content
82+
@Override
83+
public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
84+
Component component = super.prepareRenderer(renderer, row, column);
85+
int rendererWidth = component.getPreferredSize().width;
86+
TableColumn tableColumn = getColumnModel().getColumn(column);
87+
tableColumn.setPreferredWidth(
88+
Math.max(rendererWidth + getIntercellSpacing().width, tableColumn.getPreferredWidth()));
89+
return component;
90+
}
91+
};
92+
JScrollPane tabelScroll = new JScrollPane(dataTable, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
93+
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
94+
mainPanel.add(tabelScroll);
95+
96+
mainPanel.add(Box.createRigidArea(new Dimension(0, 20)));
97+
98+
// combBox panel
99+
JPanel comboBoxPanel = new JPanel();
100+
comboBoxPanel.setAlignmentX(CENTER_ALIGNMENT);
101+
mainPanel.add(comboBoxPanel);
55102

56103
_dataTableModel.setColumnIdentifiers(_headers);
57104
_lawsModel = new DefaultComboBoxModel<>();
58-
// TODO añadir la descripción de todas las leyes de fuerza a _lawsModel
59-
// TODO crear un combobox que use _lawsModel y añadirlo al panel
105+
_forceLawsInfo.forEach(fl -> {
106+
if (!fl.has("desc"))
107+
throw new IllegalArgumentException();
108+
109+
_lawsModel.addElement(fl.getString("desc"));
110+
});
111+
_lawscomb = new JComboBox<>(_lawsModel);
112+
comboBoxPanel.add(_lawscomb);
113+
60114
_groupsModel = new DefaultComboBoxModel<>();
61-
// TODO crear un combobox que use _groupsModel y añadirlo al panel
62-
// TODO crear los botones OK y Cancel y añadirlos al panel
115+
_groupscomb = new JComboBox<>(_groupsModel);
116+
comboBoxPanel.add(_groupscomb);
117+
118+
// button panel
119+
JPanel buttonPanel = new JPanel();
120+
buttonPanel.setAlignmentX(CENTER_ALIGNMENT);
121+
mainPanel.add(buttonPanel);
122+
123+
// cancel
124+
JButton cancelButton = new JButton("Cancel");
125+
cancelButton.addActionListener(new ActionListener() {
126+
127+
@Override
128+
public void actionPerformed(ActionEvent e) {
129+
_status = 0;
130+
ForceLawsDialog.this.setVisible(false);
131+
}
132+
});
133+
buttonPanel.add(cancelButton);
134+
135+
// OK
136+
JButton okButton = new JButton("OK");
137+
okButton.addActionListener(new ActionListener() {
138+
139+
@Override
140+
public void actionPerformed(ActionEvent e) {
141+
_status = 1;
142+
ForceLawsDialog.this.setVisible(false);
143+
}
144+
});
145+
buttonPanel.add(okButton);
146+
63147
setPreferredSize(new Dimension(700, 400));
64148
pack();
65149
setResizable(false);
@@ -69,8 +153,9 @@ public boolean isCellEditable(int row, int column) {
69153
public int open() {
70154
if (_groupsModel.getSize() == 0)
71155
return _status;
72-
// TODO Establecer la posición de la ventana de diálogo de tal manera que se
73-
// abra en el centro de la ventana principal
156+
157+
setLocationRelativeTo(_parent);
158+
74159
pack();
75160
setVisible(true);
76161
return _status;
@@ -79,24 +164,21 @@ public int open() {
79164
// TODO el resto de métodos van aquí…
80165
@Override
81166
public void onAdvance(Map<String, BodiesGroup> groups, double time) {
82-
// TODO Auto-generated method stub
83-
84167
}
85168

86169
@Override
87170
public void onReset(Map<String, BodiesGroup> groups, double time, double dt) {
88-
// TODO Auto-generated method stub
89-
171+
_groupsModel.removeAllElements();
90172
}
91173

92174
@Override
93175
public void onRegister(Map<String, BodiesGroup> groups, double time, double dt) {
94-
// TODO Auto-generated method stub
95-
176+
groups.values().forEach(bg -> _groupsModel.addElement(bg.getId()));
96177
}
97178

98179
@Override
99180
public void onGroupAdded(Map<String, BodiesGroup> groups, BodiesGroup g) {
181+
_groupsModel.addElement(g.getId());
100182
}
101183

102184
@Override
@@ -105,13 +187,9 @@ public void onBodyAdded(Map<String, BodiesGroup> groups, Body b) {
105187

106188
@Override
107189
public void onDeltaTimeChanged(double dt) {
108-
// TODO Auto-generated method stub
109-
110190
}
111191

112192
@Override
113193
public void onForceLawsChanged(BodiesGroup g) {
114-
// TODO Auto-generated method stub
115-
116194
}
117195
}

src/simulator/view/StatusBar.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ class StatusBar extends JPanel implements SimulatorObserver {
1818
// TODO Añadir los atributos necesarios, si hace falta …
1919
double _time = 0;
2020
int _groups = 0;
21+
JLabel _timeLabel;
22+
JLabel _groupsLabel;
2123

2224
StatusBar(Controller ctrl) {
2325
initGUI();
@@ -28,12 +30,14 @@ private void initGUI() {
2830
this.setLayout(new FlowLayout(FlowLayout.LEFT));
2931
this.setBorder(BorderFactory.createBevelBorder(1));
3032

31-
this.add(new JLabel("Time: " + _time));
33+
_timeLabel = new JLabel("Time: " + _time);
34+
this.add(_timeLabel);
3235
JSeparator s = new JSeparator(JSeparator.VERTICAL);
3336
s.setPreferredSize(new Dimension(10, 20));
3437
this.add(s);
3538

36-
this.add(new JLabel("Groups: " + _groups));
39+
_groupsLabel=new JLabel("Groups: " + _groups);
40+
this.add(_groupsLabel);
3741
JSeparator s2 = new JSeparator(JSeparator.VERTICAL);
3842
s2.setPreferredSize(new Dimension(10, 20));
3943
this.add(s2);
@@ -43,6 +47,7 @@ private void initGUI() {
4347
@Override
4448
public void onAdvance(Map<String, BodiesGroup> groups, double time) {
4549
_time = time;
50+
_timeLabel.setText("Time: " + _time);
4651
}
4752

4853
@Override
@@ -60,6 +65,7 @@ public void onRegister(Map<String, BodiesGroup> groups, double time, double dt)
6065
@Override
6166
public void onGroupAdded(Map<String, BodiesGroup> groups, BodiesGroup g) {
6267
_groups = groups.size();
68+
_groupsLabel.setText("Groups: " + _groups);
6369
}
6470

6571
@Override

src/simulator/view/ViewerWindow.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ public void windowOpened(WindowEvent e) {
4343
@Override
4444
public void windowClosing(WindowEvent e) {
4545
_ctrl.removeObserver(ViewerWindow.this);
46-
Utils.quit(ViewerWindow.this);
4746
}
4847

4948
@Override
@@ -91,7 +90,6 @@ public void onRegister(Map<String, BodiesGroup> groups, double time, double dt)
9190
_viewer.addGroup(bg);
9291
bg.forEach(body -> _viewer.addBody(body));
9392
});
94-
9593
}
9694

9795
@Override

0 commit comments

Comments
 (0)