📄 simulationgui.java
字号:
import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import java.lang.InterruptedException;
import java.awt.geom.Line2D.Float;
/**
* Write a description of class SimGUI here.
*
* @author (your name)
* @version (a version number or a date)
*/
public class SimulationGUI implements ActionListener, Runnable, ListSelectionListener
{
private JFrame frame1;
private JPanel mainPanel, bottom;
private Simulation r;
private SimulationDisplay display;
private Color backgroundColour;
private JList dataList;
private JList runwayList;
private JButton omgButton;
private JButton leftButton;
private JButton rightButton;
private JButton landButton;
private JButton queueButton;
private JButton takeOffButton;
private JButton menuButton;
private DefaultListModel dataModel;
private DefaultListModel runwayModel;
private Level myLevel;
/**
* Constructor for objects of class Display
*/
public SimulationGUI(Level l)
{
myLevel = l;
frame1 = new JFrame();
frame1.setSize(600,600);
SpringLayout layout = new SpringLayout();
Container content = frame1.getContentPane();
content.setLayout(layout);
r = new Simulation(l);
display = new SimulationDisplay(r);
omgButton = new JButton("Add plane");
leftButton = new JButton("Turn left");
rightButton = new JButton("Turn right");
landButton = new JButton("Land");
queueButton = new JButton("Queue");
takeOffButton = new JButton("Leave");
menuButton = new JButton("Menu");
dataModel = new DefaultListModel();
dataList = new JList(dataModel);
dataList.setFixedCellWidth(200);
runwayModel = new DefaultListModel();
runwayList = new JList(runwayModel);
runwayList.setFixedCellWidth(200);
JScrollPane scrollPane = new JScrollPane(dataList);
JScrollPane scrollPane2 = new JScrollPane(runwayList);
(dataList.getSelectionModel()).setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
(runwayList.getSelectionModel()).setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
for(Runway aRunway : (r.getRunways()))
{
runwayModel.addElement(aRunway);
}
content.add(scrollPane);
content.add(scrollPane2);
content.add(omgButton);
content.add(leftButton);
content.add(rightButton);
content.add(landButton);
content.add(queueButton);
content.add(takeOffButton);
content.add(menuButton);
content.add(display);
omgButton.addActionListener(this);
leftButton.addActionListener(this);
rightButton.addActionListener(this);
landButton.addActionListener(this);
queueButton.addActionListener(this);
takeOffButton.addActionListener(this);
menuButton.addActionListener(this);
dataList.addListSelectionListener(this);
layout.putConstraint(SpringLayout.NORTH, display, 20, SpringLayout.NORTH, content);
layout.putConstraint(SpringLayout.WEST, display, 20, SpringLayout.NORTH, content);
layout.putConstraint(SpringLayout.NORTH, scrollPane, 20, SpringLayout.NORTH, display);
layout.putConstraint(SpringLayout.WEST, scrollPane, 10, SpringLayout.EAST, display);
layout.putConstraint(SpringLayout.NORTH, scrollPane2, 10, SpringLayout.SOUTH, scrollPane);
layout.putConstraint(SpringLayout.WEST, scrollPane2, 0, SpringLayout.WEST, scrollPane);
layout.putConstraint(SpringLayout.NORTH, omgButton, 10, SpringLayout.SOUTH, scrollPane2);
layout.putConstraint(SpringLayout.WEST, omgButton, 10, SpringLayout.WEST, scrollPane2);
layout.putConstraint(SpringLayout.NORTH, leftButton, 10, SpringLayout.SOUTH, omgButton);
layout.putConstraint(SpringLayout.WEST, leftButton, 0, SpringLayout.WEST, omgButton);
layout.putConstraint(SpringLayout.NORTH, landButton, 10, SpringLayout.SOUTH, leftButton);
layout.putConstraint(SpringLayout.WEST, landButton, 0, SpringLayout.WEST, leftButton);
layout.putConstraint(SpringLayout.NORTH, queueButton, 10, SpringLayout.SOUTH, scrollPane2);
layout.putConstraint(SpringLayout.WEST, queueButton, 20, SpringLayout.EAST, omgButton);
layout.putConstraint(SpringLayout.NORTH, rightButton, 10, SpringLayout.SOUTH, queueButton);
layout.putConstraint(SpringLayout.WEST, rightButton, 20, SpringLayout.EAST, omgButton);
layout.putConstraint(SpringLayout.NORTH, takeOffButton, 10, SpringLayout.SOUTH, rightButton);
layout.putConstraint(SpringLayout.WEST, takeOffButton, 20, SpringLayout.EAST, omgButton);
layout.putConstraint(SpringLayout.NORTH, menuButton, 50, SpringLayout.SOUTH, takeOffButton);
layout.putConstraint(SpringLayout.EAST, menuButton, 0, SpringLayout.EAST, takeOffButton);
layout.putConstraint(SpringLayout.SOUTH, content, 50, SpringLayout.SOUTH, menuButton);
layout.putConstraint(SpringLayout.EAST, content, 50, SpringLayout.EAST, menuButton);
frame1.setTitle("ATCSImulation - " + l.getName());
frame1.pack();
display.init();
frame1.setLocationRelativeTo(null);
frame1.setResizable(false);
frame1.setVisible(true);
// Now start the simulation
// Make a new Runnable object
// Make a new Thread for that Runnable
Thread t = new Thread(r);
// Start the thread
t.start();
Thread s = new Thread(this);
s.start();
}
// The main loop
public void refresh()
{
// redraw the screen
frame1.repaint();
//update the list of planes
//look at our Simulation's queue of planes to add, if it contains anything, remove it from the queue and add it to our JList
SwingUtilities.invokeLater(new Runnable() {
public void run() {
while (!r.getToAdd().isEmpty())
{
Aircraft a = (Aircraft) r.getToAdd().poll();
((DefaultListModel) dataList.getModel()).addElement(a);
}
}
});
//look at our Simulation's queue of planes to remove, if it contains anything, remove it from the queue and remove it from our JList
SwingUtilities.invokeLater(new Runnable() {
public void run() {
while (!r.getToRemove().isEmpty())
{
Aircraft a = (Aircraft) r.getToRemove().poll();
((DefaultListModel) dataList.getModel()).removeElement(a);
}
}
}) ;
updateButtons();
}
public void valueChanged(ListSelectionEvent e)
{
updateButtons();
}
public void updateButtons()
{
if (!(dataList.getSelectedIndex() == -1))
{
Aircraft current = (Aircraft) dataList.getSelectedValue();
switch (current.getState())
{
case 0: leftButton.setEnabled(true);
rightButton.setEnabled(true);
landButton.setEnabled(false);
queueButton.setEnabled(true);
break;
case 1: leftButton.setEnabled(false);
rightButton.setEnabled(true);
landButton.setEnabled(true);
queueButton.setEnabled(true);
break;
case 2: leftButton.setEnabled(true);
rightButton.setEnabled(false);
landButton.setEnabled(true);
queueButton.setEnabled(true);
break;
case 3: leftButton.setEnabled(true);
rightButton.setEnabled(true);
landButton.setEnabled(true);
queueButton.setEnabled(false);
break;
case 4: leftButton.setEnabled(true);
rightButton.setEnabled(true);
landButton.setEnabled(true);
queueButton.setEnabled(false);
break;
case 5: leftButton.setEnabled(false);
rightButton.setEnabled(false);
landButton.setEnabled(false);
queueButton.setEnabled(false);
break;
case 6: leftButton.setEnabled(true);
rightButton.setEnabled(true);
landButton.setEnabled(true);
queueButton.setEnabled(false);
break;
case 7: leftButton.setEnabled(false);
rightButton.setEnabled(false);
landButton.setEnabled(false);
queueButton.setEnabled(false);
break;
default: break;
}
if (current.hasLanded()) {takeOffButton.setEnabled(true); } else {takeOffButton.setEnabled(false);}
}
}
public void run()
{
//Every 10 millisec, refresh the GUI
while(!r.isFinished())
{
// Redraw the display
refresh();
try
{
Thread.sleep(10);
}
//If anything goes wrong, we are fucked
catch (InterruptedException e)
{
}
}
String res = new String("Finished level with " + r.getCollisions() + " collisions in " + (r.getTimeTaken()/100) + " seconds");
Results u = new Results(res, myLevel); frame1.setVisible(false);
}
// main() for this, so we can run it outside BlueJ
// If the button is pressed, have a look at what was pressed, and add an AircraftEvent to the simulation's queue
public void actionPerformed(ActionEvent event) {
if (event.getSource().equals(menuButton)) { UserOptions.show(); frame1.setVisible(false); }
// (null, 999) means add a plane
if (event.getSource().equals(omgButton)) { r.getAircraftEvents().add( new AircraftEvent(null, AircraftEvent.ADD, null) ); }
if (!dataList.getSelectionModel().isSelectionEmpty()) {
if (event.getSource().equals(landButton)) {r.getAircraftEvents().add( new AircraftEvent(((Aircraft) dataList.getSelectedValue()), AircraftEvent.LAND, ((Runway) runwayList.getSelectedValue())) ); }
if (event.getSource().equals(leftButton)) {r.getAircraftEvents().add( new AircraftEvent(((Aircraft) dataList.getSelectedValue()), AircraftEvent.TURNLEFT, ((Runway) runwayList.getSelectedValue())) ); }
if (event.getSource().equals(rightButton)) {r.getAircraftEvents().add( new AircraftEvent(((Aircraft) dataList.getSelectedValue()), AircraftEvent.TURNRIGHT, ((Runway) runwayList.getSelectedValue())) ); }
if (event.getSource().equals(queueButton)) {r.getAircraftEvents().add( new AircraftEvent(((Aircraft) dataList.getSelectedValue()), AircraftEvent.GOTOQUEUE, ((Runway) runwayList.getSelectedValue())) ); }
if (event.getSource().equals(takeOffButton)) {r.getAircraftEvents().add( new AircraftEvent(((Aircraft) dataList.getSelectedValue()), AircraftEvent.LEAVE, ((Runway) runwayList.getSelectedValue())) ); }
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -