I have next assignment: Implement Java Swing Application which allows to add new rectangle (described by X, Y coordinates and a and b side) to stack. Application should allow also to delete rectangle from stack using LIFO model. All rectangles should be presented in JList. Like this:
I implemented on this way:
public class Stack extends JFrame {
private JPanel contentPane;
private Deque<String> stack = new ArrayDeque<String>();
private DefaultListModel<String> dlm = new DefaultListModel<String>();
JList lstRectangle = new JList();
lstRectangle.setModel(dlm);
scrollPane.setViewportView(lstRectangle);
JButton btnAdd = new JButton("Add rectangle");
btnAdd.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
DlgRectangle dlgRectangle = new DlgRectangle();
dlgRectangle.setVisible(true);
if(dlgRectangle.isOk) {
dlm.add(0, "Upper left point: (" + dlgRectangle.txtX.getText() + "," + dlgRectangle.txtY.getText() + ") " + "width: " + dlgRectangle.txtWidth.getText() + " " + "height: " + dlgRectangle.txtHeight.getText());
String rectangle = new String();
rectangle = "Upper left point: (" + dlgRectangle.txtX.getText() + "," + dlgRectangle.txtY.getText() + ") " + "width: " + dlgRectangle.txtWidth.getText() + " " + "height: " + dlgRectangle.txtHeight.getText();
stack.addFirst(rectangle);
System.out.println(stack);
}
}
});
JButton btnDelete = new JButton("Delete rectangle");
btnDelete.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if(dlm != null && !dlm.isEmpty()) {
dlm.remove(0);
stack.pop();
System.out.println(stack);
} else {
System.out.println("Stack is empty");
}
}
});
At first I would like to ask is this good practice and good approach of solving this task. It's working, but I think it could be done better then seppeated pushing objects to stack and DefaultListModel. Some how to do it at same time and showing stack objects directly in DLM.
Next and main question (for similar task) is how to sort stack according to the area of the rectangle?
I tried to improve code above, but I just calculated area and than I stucked...
int sideA = Integer.parseInt(dlgRectangle.txtWidth.getText());
int sideB = Integer.parseInt(dlgRectangle.txtHeight.getText());
int surfaceArea = sideA*sideB;
System.out.println(surfaceArea);
dlm.add(0, "Upper left point: (" + dlgRectangle.txtX.getText() + "," + dlgRectangle.txtY.getText() + ") " + "width: " + dlgRectangle.txtWidth.getText() + " " + "height: " + dlgRectangle.txtHeight.getText() + " " + "Surface area: " + String.valueOf(surfaceArea));
String rectangle = new String();
rectangle = "Upper left point: (" + dlgRectangle.txtX.getText() + "," + dlgRectangle.txtY.getText() + ") " + "width: " + dlgRectangle.txtWidth.getText() + " " + "height: " + dlgRectangle.txtHeight.getText()+ " " + "Surface area: " + String.valueOf(surfaceArea);
stack.addFirst(rectangle);
stack.toArray();
System.out.println(stack);