import java.util.Stack;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
/**************************************************************
* En applikation som visar en enkel användning av en stack.
* Stackens lagrade värden visas i en JComboBox.
*
* @author Peter Mozelius
* @version 1.5
* Rapportera hittade fel till:
*mozelius@dsv.su.se
***************************************************************/
public class Lektion5 extends JFrame implements ActionListener {
private Container container;
private JPanel northPanel, southPanel;
private CenterPanel centerPanel;
private JLabel inLabel, outLabel;
private JTextField inField, outField;
private JButton pushButton, popButton;
private Stack stack; //Stacken är nu typbestämd
/**
* Konstruktor som initierar Grafik och stacken
*/
public Lektion5() {
super("En liten Stack");
makeGUI();
stack = new Stack();
}//konstruktor
/**
* metod som placerar ut grafik och kopplar
* händelselyssningen till knapparna
*/
public void makeGUI() {
setSize(300,200);
container = getContentPane();
//gör iordning en panel för inmatning
northPanel = new JPanel();
inLabel = new JLabel(" Ett heltal att lägga på stacken: ");
inField = new JTextField("0");
pushButton = new JButton("PUSH");
pushButton.addActionListener(this);
northPanel.add(inLabel);
northPanel.add(inField);
northPanel.add(pushButton);
container.add(northPanel, BorderLayout.NORTH);
//lägg in en centerpanel
centerPanel = new CenterPanel();
container.add(centerPanel, BorderLayout.CENTER);
//gör iordning en panel för utmatning
southPanel = new JPanel();
outLabel = new JLabel("Det värde du har plockat ut är:");
outField = new JTextField(" - ");
popButton = new JButton("POP");
popButton.addActionListener(this);
southPanel.add(outLabel);
southPanel.add(outField);
southPanel.add(popButton);
container.add(southPanel, BorderLayout.SOUTH);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}//makeGUI
/**
* beroende på vilken knapp det tryckts på så utförs
* någon av stackoperationerna push eller pop
*/
public void actionPerformed(ActionEvent e) {
if(e.getSource() == pushButton) {
char c = inField.getText().charAt(0);
if(Character.isDigit(c)){
Character ch = c; //implicit omvandling från primitiv till referensvariabel
stack.push(ch); //lägg på stacken
centerPanel.boxPush(ch); //lägg in i mittpanelns JComboBox
}
}
else if(e.getSource() == popButton) {
if(! stack.empty()) {
outField.setText(""+ stack.pop());// plocka ut från stacken
centerPanel.boxPop(); // ta bort ur mittpanelns JComboBox
}
else
outField.setText("-");
}
}//actionperformed
public static void main(String[] args) {
new Lektion5();
}
}//Lektion5
/**********************************************************
* En subklassning av JPanel som hjälper Lektion43 att även
* visa stackens innehåll grafiskt. Klassen visar också en
* enkel användning av javax.swing.JComboBox
*
* @author Peter Mozelius
* @version 1.01
* Rapportera hittade fel till:
*mozelius@dsv.su.se
**********************************************************/
class CenterPanel extends JPanel {
private JComboBox stackBox;
/**
* Konstruktor som skapar en JComboBox
*/
public CenterPanel() {
setSize(300, 100);
String[] info = {"De heltal som finns på stacken är"};
stackBox = new JComboBox(info);
add(stackBox);
}//konstruktor
/**
* lägg in ett tecken
*/
public void boxPush(Character ch) {
stackBox.addItem(ch);
}
/**
* plocka bort det senast inlagda tecknet
*/
public void boxPop() {
int i = stackBox.getItemCount();
if(i > 1)
stackBox.removeItemAt(i - 1);
}
}//CenterPanel