kevinpirola
02-08-2012, 12:57
Ciao a tutti, sto creando un'applicazione per la mia parrocchia ma mi trovo con alcuni dubbi. Perciò li scrivo qui che tante volte mi è stato d'aiuto!
Come deve essere il programma alla fine:
Un frame principale in cui si aprono dei "sottoprogrammi"
I sottoprogrammi sono:
- registratore di cassa (legge i cibi dal database, li posiziona in pulsanti che permettono di ricevere delle "comande" da inviare in cucina, fa il totale e interagisce con il database aggiornando i prodotti usciti e i vari ingredienti disponibili). Questo programmino invia a due stampanti e ad un monitor (aggiuntivo, che estende il desktop) le comande.
- controllo tavoli (drag and drop e possibilità di posizionare i vari tavoli per vedere graficamente la posizione, ai quali vengono assegnate i vari ordini ricevuti dal primo programma)
- server - via tcp/ip comunicazione con app android che permette di avere il "registratore di cassa" su telefono e usarlo a terminale remoto
- gestione del database (minimal)
Le domande sono queste:
Appurato che ogni programma ha la sua classe con i suoi metodi e che lavorare con thread e classi varie non ho problemi, come sarebbe corretto strutturare il tutto tenendo conto della parte grafica? Al momento ho creato una cosa così:
programma principale
console (classe statica con metodi tipo "Console.print" che scrivono dentro una finestra del programma)
e separati:
GUI (statica)
Menu (che crea il menu della gui)
però mi sembra troppo astruso andare e tornare dalle varie classi e ho seri dubbi con la parte grafica.
Secondo problema:
Il database, sono completamente a digiuno, esiste qualcosa su file oppure devo installare un qualche database sul mac?
questi sono i file che ho scritto fino ad adesso:
Pagoda.java
package core;
import gui.GUI;
public class Pagoda {
/**
* The name of this program.
*/
private static final String TITLE = "Cassa Pagoda - vers. 3.0.0";
/**
* The GUI
*/
private static GUI g;
/**
* The main method
* @param arg standard.
*/
public static void main(String [] arg){
//USE MAC MENUBAR
System.setProperty("apple.laf.useScreenMenuBar", "true");
new Console(null);
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
Pagoda.g = new GUI(TITLE);
Console.setGUI(g);
}
});
}
}
Console.java
package core;
import gui.GUI;
public class Console {
/**
* Progressive number of version
*/
protected static final String CONSOLE_VERSION = "0.0.1";
private static final String NEW_LINE_FEED = "\n";
private static GUI gui;
Console (GUI g){
gui = g;
}
public static void print(String msg){
if(gui!=null){
gui.writeInConsole(msg);
}else{
System.out.print(msg);
}
}
public static void println(String msg){
print(msg + NEW_LINE_FEED);
}
public static void setGUI(GUI g) {
gui = g;
}
}
GUI.java
package gui;
import java.awt.Container;
import java.awt.Font;
import java.util.Hashtable;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import core.Console;
public class GUI {
/**
* Main Frame
*/
private static JFrame mainFrame;
/**
* Frames' container
*/
private JDesktopPane desktop;
/**
* A reference to each frame in the GUI
*/
private static Hashtable<String, JInternalFrame> intFrames = new Hashtable<String, JInternalFrame>();
JTextArea output;
JScrollPane scrollPane;
private static int minX = 300;
private static int minY = 150;
public GUI(String title) {
// ########DEBUG
Console.println("[GUI] Creating a new Frame");
// #############
mainFrame = new JFrame(title);
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// mainFrame.setIconImage();
mainFrame.setSize(minX, minY);
// mainFrame.setLocationRelativeTo(null); //USED TO CENTER
mainFrame.setExtendedState(JFrame.MAXIMIZED_BOTH);
//########DEBUG
Console.println("[GUI] Creating the desktop content pane");
//#############
desktop = new JDesktopPane();
mainFrame.setContentPane(desktop);
createConsolePane();
desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);
// ########DEBUG
Console.println("[GUI] Creating and setting the menu");
// #############
Menu menu = new Menu();
mainFrame.setJMenuBar(menu.createMenuBar());
mainFrame.setVisible(true);
}
private Container createConsolePane() {
JInternalFrame intFrame = new JInternalFrame("Console", true, true, true, true);
intFrame.putClientProperty("JInternalFrame.frameType", "normal"); //remove shadows
intFrame.setSize(100, 50); //min size
intFrame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
desktop.add(intFrame);
// Create a scrolled text area.
output = new JTextArea(8, 70);
output.setFont(new Font("monospaced",Font.PLAIN,10));
output.setEditable(false);
output.setLineWrap(true);
output.setWrapStyleWord(false);
scrollPane = new JScrollPane(output);
// Add the text area to the content pane.
intFrame.add(scrollPane);
intFrame.pack();
intFrame.setVisible(true);
intFrames.put("Console",intFrame);
return desktop;
}
public static Hashtable<String, JInternalFrame> getIntFrameList(){
return intFrames;
}
public void writeInConsole(String msg) {
output.append(msg);
output.setCaretPosition(output.getDocument().getLength());
}
}
Menu.java
package gui;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyEvent;
import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.KeyStroke;
import core.Console;
public class Menu implements ActionListener, ItemListener {
JTextArea output;
JScrollPane scrollPane;
/**
* The main menu bar
*/
private JMenuBar menuBar;
/**
* Each menu
*/
private JMenu menu;
/**
* Each submenu;
*/
private JMenu submenu;
/**
* Each element of the menu
*/
private JMenuItem menuItem;
/**
* Each check-box in the menu
*/
private JCheckBoxMenuItem cbMenuItem;
private static final String NEW_LINE = "\n";
public JMenuBar createMenuBar() {
JRadioButtonMenuItem rbMenuItem;
// Create the menu bar.
menuBar = new JMenuBar();
// Build the first menu.
menu = new JMenu("File");
menu.setMnemonic(KeyEvent.VK_F);
menuBar.add(menu);
// a group of JMenuItems
menuItem = new JMenuItem("Start new day", KeyEvent.VK_S);
// menuItem.setMnemonic(KeyEvent.VK_T); //used constructor instead
menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, ActionEvent.CTRL_MASK));
menuItem.addActionListener(this);
menu.add(menuItem);
// ImageIcon icon = createImageIcon("images/middle.gif");
menuItem = new JMenuItem("Both text and icon");// , icon);
menuItem.setMnemonic(KeyEvent.VK_B);
menuItem.addActionListener(this);
menu.add(menuItem);
menuItem = new JMenuItem("icon");
menuItem.setMnemonic(KeyEvent.VK_D);
menuItem.addActionListener(this);
menu.add(menuItem);
// a group of radio button menu items
menu.addSeparator();
ButtonGroup group = new ButtonGroup();
rbMenuItem = new JRadioButtonMenuItem("A radio button menu item");
rbMenuItem.setSelected(true);
rbMenuItem.setMnemonic(KeyEvent.VK_R);
group.add(rbMenuItem);
rbMenuItem.addActionListener(this);
menu.add(rbMenuItem);
rbMenuItem = new JRadioButtonMenuItem("Another one");
rbMenuItem.setMnemonic(KeyEvent.VK_O);
group.add(rbMenuItem);
rbMenuItem.addActionListener(this);
menu.add(rbMenuItem);
// a submenu
menu.addSeparator();
submenu = new JMenu("A submenu");
submenu.setMnemonic(KeyEvent.VK_S);
menuItem = new JMenuItem("An item in the submenu");
menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_2, ActionEvent.ALT_MASK));
menuItem.addActionListener(this);
submenu.add(menuItem);
menuItem = new JMenuItem("Another item");
menuItem.addActionListener(this);
submenu.add(menuItem);
menu.add(submenu);
menu.addSeparator();
menuItem = new JMenuItem("Exit", KeyEvent.VK_X);
menuItem.addActionListener(this);
menu.add(menuItem);
// Build second menu in the menu bar.
menu = new JMenu("Window");
menu.setMnemonic(KeyEvent.VK_W);
menuBar.add(menu);
// a group of JMenuItems
menuItem = new JMenuItem("Set defaults windows", KeyEvent.VK_D);
menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_D, ActionEvent.CTRL_MASK));
menuItem.addActionListener(this);
menu.add(menuItem);
menu.addSeparator();
cbMenuItem = new JCheckBoxMenuItem("Console");
if(GUI.getIntFrameList().get("Console").isVisible()){
cbMenuItem.setSelected(true);
}else{
cbMenuItem.setSelected(false);
}
cbMenuItem.setMnemonic(KeyEvent.VK_C);
cbMenuItem.addItemListener(this);
menu.add(cbMenuItem);
cbMenuItem = new JCheckBoxMenuItem("Tables' Map");
// if(GUI.getIntFrameList().get("Tables").isVisible()){
// cbMenuItem.setSelected(true);
// }else{
// cbMenuItem.setSelected(false);
// }
cbMenuItem.setMnemonic(KeyEvent.VK_M);
cbMenuItem.addItemListener(this);
menu.add(cbMenuItem);
cbMenuItem = new JCheckBoxMenuItem("Cash Desk");
cbMenuItem.setMnemonic(KeyEvent.VK_K);
cbMenuItem.addItemListener(this);
menu.add(cbMenuItem);
return menuBar;
}
public Container createContentPane() {
// Create the content-pane-to-be.
JPanel contentPane = new JPanel(new BorderLayout());
contentPane.setOpaque(true);
// Create a scrolled text area.
output = new JTextArea(5, 30);
output.setEditable(false);
scrollPane = new JScrollPane(output);
// Add the text area to the content pane.
contentPane.add(scrollPane, BorderLayout.CENTER);
return contentPane;
}
public void actionPerformed(ActionEvent e) {
JMenuItem source = (JMenuItem) (e.getSource());
String action = source.getText();
if (action.equalsIgnoreCase("exit")) {
System.exit(0);
}
String s = "Action event detected." + NEW_LINE + " Event source: " + source.getText() + " (an instance of " + getClassName(source) + ")";
Console.println(s);
}
public void itemStateChanged(ItemEvent e) {
JMenuItem source = (JMenuItem) (e.getSource());
if (source.getText().equalsIgnoreCase("console")) {
if (e.getStateChange() == ItemEvent.SELECTED) {
GUI.getIntFrameList().get("Console").setVisible(true);
} else {
GUI.getIntFrameList().get("Console").setVisible(false);
}
}
String s = "Item event detected." + NEW_LINE + " Event source: " + source.getText() + " (an instance of " + getClassName(source) + ")" + NEW_LINE
+ " New state: " + ((e.getStateChange() == ItemEvent.SELECTED) ? "selected" : "unselected");
Console.println(s);
}
// Returns just the class name -- no package info.
protected String getClassName(Object o) {
String classString = o.getClass().getName();
int dotIndex = classString.lastIndexOf(".");
return classString.substring(dotIndex + 1);
}
/** Returns an ImageIcon, or null if the path was invalid. */
protected static ImageIcon createImageIcon(String path) {
java.net.URL imgURL = Menu.class.getResource(path);
if (imgURL != null) {
return new ImageIcon(imgURL);
} else {
System.err.println("Couldn't find file: " + path);
return null;
}
}
}
Spero di non essere stato poco chiaro o troppo veloce..
Come deve essere il programma alla fine:
Un frame principale in cui si aprono dei "sottoprogrammi"
I sottoprogrammi sono:
- registratore di cassa (legge i cibi dal database, li posiziona in pulsanti che permettono di ricevere delle "comande" da inviare in cucina, fa il totale e interagisce con il database aggiornando i prodotti usciti e i vari ingredienti disponibili). Questo programmino invia a due stampanti e ad un monitor (aggiuntivo, che estende il desktop) le comande.
- controllo tavoli (drag and drop e possibilità di posizionare i vari tavoli per vedere graficamente la posizione, ai quali vengono assegnate i vari ordini ricevuti dal primo programma)
- server - via tcp/ip comunicazione con app android che permette di avere il "registratore di cassa" su telefono e usarlo a terminale remoto
- gestione del database (minimal)
Le domande sono queste:
Appurato che ogni programma ha la sua classe con i suoi metodi e che lavorare con thread e classi varie non ho problemi, come sarebbe corretto strutturare il tutto tenendo conto della parte grafica? Al momento ho creato una cosa così:
programma principale
console (classe statica con metodi tipo "Console.print" che scrivono dentro una finestra del programma)
e separati:
GUI (statica)
Menu (che crea il menu della gui)
però mi sembra troppo astruso andare e tornare dalle varie classi e ho seri dubbi con la parte grafica.
Secondo problema:
Il database, sono completamente a digiuno, esiste qualcosa su file oppure devo installare un qualche database sul mac?
questi sono i file che ho scritto fino ad adesso:
Pagoda.java
package core;
import gui.GUI;
public class Pagoda {
/**
* The name of this program.
*/
private static final String TITLE = "Cassa Pagoda - vers. 3.0.0";
/**
* The GUI
*/
private static GUI g;
/**
* The main method
* @param arg standard.
*/
public static void main(String [] arg){
//USE MAC MENUBAR
System.setProperty("apple.laf.useScreenMenuBar", "true");
new Console(null);
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
Pagoda.g = new GUI(TITLE);
Console.setGUI(g);
}
});
}
}
Console.java
package core;
import gui.GUI;
public class Console {
/**
* Progressive number of version
*/
protected static final String CONSOLE_VERSION = "0.0.1";
private static final String NEW_LINE_FEED = "\n";
private static GUI gui;
Console (GUI g){
gui = g;
}
public static void print(String msg){
if(gui!=null){
gui.writeInConsole(msg);
}else{
System.out.print(msg);
}
}
public static void println(String msg){
print(msg + NEW_LINE_FEED);
}
public static void setGUI(GUI g) {
gui = g;
}
}
GUI.java
package gui;
import java.awt.Container;
import java.awt.Font;
import java.util.Hashtable;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import core.Console;
public class GUI {
/**
* Main Frame
*/
private static JFrame mainFrame;
/**
* Frames' container
*/
private JDesktopPane desktop;
/**
* A reference to each frame in the GUI
*/
private static Hashtable<String, JInternalFrame> intFrames = new Hashtable<String, JInternalFrame>();
JTextArea output;
JScrollPane scrollPane;
private static int minX = 300;
private static int minY = 150;
public GUI(String title) {
// ########DEBUG
Console.println("[GUI] Creating a new Frame");
// #############
mainFrame = new JFrame(title);
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// mainFrame.setIconImage();
mainFrame.setSize(minX, minY);
// mainFrame.setLocationRelativeTo(null); //USED TO CENTER
mainFrame.setExtendedState(JFrame.MAXIMIZED_BOTH);
//########DEBUG
Console.println("[GUI] Creating the desktop content pane");
//#############
desktop = new JDesktopPane();
mainFrame.setContentPane(desktop);
createConsolePane();
desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);
// ########DEBUG
Console.println("[GUI] Creating and setting the menu");
// #############
Menu menu = new Menu();
mainFrame.setJMenuBar(menu.createMenuBar());
mainFrame.setVisible(true);
}
private Container createConsolePane() {
JInternalFrame intFrame = new JInternalFrame("Console", true, true, true, true);
intFrame.putClientProperty("JInternalFrame.frameType", "normal"); //remove shadows
intFrame.setSize(100, 50); //min size
intFrame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
desktop.add(intFrame);
// Create a scrolled text area.
output = new JTextArea(8, 70);
output.setFont(new Font("monospaced",Font.PLAIN,10));
output.setEditable(false);
output.setLineWrap(true);
output.setWrapStyleWord(false);
scrollPane = new JScrollPane(output);
// Add the text area to the content pane.
intFrame.add(scrollPane);
intFrame.pack();
intFrame.setVisible(true);
intFrames.put("Console",intFrame);
return desktop;
}
public static Hashtable<String, JInternalFrame> getIntFrameList(){
return intFrames;
}
public void writeInConsole(String msg) {
output.append(msg);
output.setCaretPosition(output.getDocument().getLength());
}
}
Menu.java
package gui;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyEvent;
import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.KeyStroke;
import core.Console;
public class Menu implements ActionListener, ItemListener {
JTextArea output;
JScrollPane scrollPane;
/**
* The main menu bar
*/
private JMenuBar menuBar;
/**
* Each menu
*/
private JMenu menu;
/**
* Each submenu;
*/
private JMenu submenu;
/**
* Each element of the menu
*/
private JMenuItem menuItem;
/**
* Each check-box in the menu
*/
private JCheckBoxMenuItem cbMenuItem;
private static final String NEW_LINE = "\n";
public JMenuBar createMenuBar() {
JRadioButtonMenuItem rbMenuItem;
// Create the menu bar.
menuBar = new JMenuBar();
// Build the first menu.
menu = new JMenu("File");
menu.setMnemonic(KeyEvent.VK_F);
menuBar.add(menu);
// a group of JMenuItems
menuItem = new JMenuItem("Start new day", KeyEvent.VK_S);
// menuItem.setMnemonic(KeyEvent.VK_T); //used constructor instead
menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, ActionEvent.CTRL_MASK));
menuItem.addActionListener(this);
menu.add(menuItem);
// ImageIcon icon = createImageIcon("images/middle.gif");
menuItem = new JMenuItem("Both text and icon");// , icon);
menuItem.setMnemonic(KeyEvent.VK_B);
menuItem.addActionListener(this);
menu.add(menuItem);
menuItem = new JMenuItem("icon");
menuItem.setMnemonic(KeyEvent.VK_D);
menuItem.addActionListener(this);
menu.add(menuItem);
// a group of radio button menu items
menu.addSeparator();
ButtonGroup group = new ButtonGroup();
rbMenuItem = new JRadioButtonMenuItem("A radio button menu item");
rbMenuItem.setSelected(true);
rbMenuItem.setMnemonic(KeyEvent.VK_R);
group.add(rbMenuItem);
rbMenuItem.addActionListener(this);
menu.add(rbMenuItem);
rbMenuItem = new JRadioButtonMenuItem("Another one");
rbMenuItem.setMnemonic(KeyEvent.VK_O);
group.add(rbMenuItem);
rbMenuItem.addActionListener(this);
menu.add(rbMenuItem);
// a submenu
menu.addSeparator();
submenu = new JMenu("A submenu");
submenu.setMnemonic(KeyEvent.VK_S);
menuItem = new JMenuItem("An item in the submenu");
menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_2, ActionEvent.ALT_MASK));
menuItem.addActionListener(this);
submenu.add(menuItem);
menuItem = new JMenuItem("Another item");
menuItem.addActionListener(this);
submenu.add(menuItem);
menu.add(submenu);
menu.addSeparator();
menuItem = new JMenuItem("Exit", KeyEvent.VK_X);
menuItem.addActionListener(this);
menu.add(menuItem);
// Build second menu in the menu bar.
menu = new JMenu("Window");
menu.setMnemonic(KeyEvent.VK_W);
menuBar.add(menu);
// a group of JMenuItems
menuItem = new JMenuItem("Set defaults windows", KeyEvent.VK_D);
menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_D, ActionEvent.CTRL_MASK));
menuItem.addActionListener(this);
menu.add(menuItem);
menu.addSeparator();
cbMenuItem = new JCheckBoxMenuItem("Console");
if(GUI.getIntFrameList().get("Console").isVisible()){
cbMenuItem.setSelected(true);
}else{
cbMenuItem.setSelected(false);
}
cbMenuItem.setMnemonic(KeyEvent.VK_C);
cbMenuItem.addItemListener(this);
menu.add(cbMenuItem);
cbMenuItem = new JCheckBoxMenuItem("Tables' Map");
// if(GUI.getIntFrameList().get("Tables").isVisible()){
// cbMenuItem.setSelected(true);
// }else{
// cbMenuItem.setSelected(false);
// }
cbMenuItem.setMnemonic(KeyEvent.VK_M);
cbMenuItem.addItemListener(this);
menu.add(cbMenuItem);
cbMenuItem = new JCheckBoxMenuItem("Cash Desk");
cbMenuItem.setMnemonic(KeyEvent.VK_K);
cbMenuItem.addItemListener(this);
menu.add(cbMenuItem);
return menuBar;
}
public Container createContentPane() {
// Create the content-pane-to-be.
JPanel contentPane = new JPanel(new BorderLayout());
contentPane.setOpaque(true);
// Create a scrolled text area.
output = new JTextArea(5, 30);
output.setEditable(false);
scrollPane = new JScrollPane(output);
// Add the text area to the content pane.
contentPane.add(scrollPane, BorderLayout.CENTER);
return contentPane;
}
public void actionPerformed(ActionEvent e) {
JMenuItem source = (JMenuItem) (e.getSource());
String action = source.getText();
if (action.equalsIgnoreCase("exit")) {
System.exit(0);
}
String s = "Action event detected." + NEW_LINE + " Event source: " + source.getText() + " (an instance of " + getClassName(source) + ")";
Console.println(s);
}
public void itemStateChanged(ItemEvent e) {
JMenuItem source = (JMenuItem) (e.getSource());
if (source.getText().equalsIgnoreCase("console")) {
if (e.getStateChange() == ItemEvent.SELECTED) {
GUI.getIntFrameList().get("Console").setVisible(true);
} else {
GUI.getIntFrameList().get("Console").setVisible(false);
}
}
String s = "Item event detected." + NEW_LINE + " Event source: " + source.getText() + " (an instance of " + getClassName(source) + ")" + NEW_LINE
+ " New state: " + ((e.getStateChange() == ItemEvent.SELECTED) ? "selected" : "unselected");
Console.println(s);
}
// Returns just the class name -- no package info.
protected String getClassName(Object o) {
String classString = o.getClass().getName();
int dotIndex = classString.lastIndexOf(".");
return classString.substring(dotIndex + 1);
}
/** Returns an ImageIcon, or null if the path was invalid. */
protected static ImageIcon createImageIcon(String path) {
java.net.URL imgURL = Menu.class.getResource(path);
if (imgURL != null) {
return new ImageIcon(imgURL);
} else {
System.err.println("Couldn't find file: " + path);
return null;
}
}
}
Spero di non essere stato poco chiaro o troppo veloce..