From 4091ad3f6234cd58cc9c4a6962c908caee98f412 Mon Sep 17 00:00:00 2001 From: Mihai Sucan Date: Thu, 6 May 2010 22:55:40 +0300 Subject: [PATCH] =?utf8?q?Modific=C4=83ri=20pentru=20partea=20de=20chat.?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit - Adăugare panou pentru chat. - Imbunatatiri de GUI. --- ChatApp.java | 41 ---------- ChatApp/PaginaChat.java | 188 ++++++++++++++++++++++++++++++++++++++++++++++ ChatApp/PortVerifier.java | 70 ----------------- ChatApp/PrimaPagina.java | 143 +++++++++++++++++++++++++---------- ChatApp/appMain.java | 82 ++++++++++++++++++++ ChatAppEntry.java | 26 +++++++ 6 files changed, 398 insertions(+), 152 deletions(-) delete mode 100644 ChatApp.java create mode 100644 ChatApp/PaginaChat.java delete mode 100644 ChatApp/PortVerifier.java create mode 100644 ChatApp/appMain.java create mode 100644 ChatAppEntry.java diff --git a/ChatApp.java b/ChatApp.java deleted file mode 100644 index 5092aca..0000000 --- a/ChatApp.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * © 2010 ROBO Design - * http://www.robodesign.ro - * - * $Date: 2010-05-05 14:24:44 +0300 $ - */ - -import ChatApp.*; -import javax.swing.*; -import java.awt.BorderLayout; - -public class ChatApp { - public static void initializareGUI () { - JFrame frame = new JFrame("ChatApp"); - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - - PrimaPagina primapag = new PrimaPagina(frame.getRootPane()); - - frame.getContentPane().add((JPanel) primapag, BorderLayout.CENTER); - frame.getRootPane().setDefaultButton(primapag.myDefaultButton); - frame.pack(); - primapag.myDefaultComponent.requestFocusInWindow(); - frame.setVisible(true); - } - - public static void main (String[] args) { - try { - UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); - } catch (Exception e) { - } - - SwingUtilities.invokeLater(new Runnable() { - public void run() { - initializareGUI(); - } - }); - } -} - -// vim:set fo=wancroql tw=80 ts=2 sw=2 sts=2 sta et ai cin ff=unix: - diff --git a/ChatApp/PaginaChat.java b/ChatApp/PaginaChat.java new file mode 100644 index 0000000..9d6b321 --- /dev/null +++ b/ChatApp/PaginaChat.java @@ -0,0 +1,188 @@ +/* + * © 2010 ROBO Design + * http://www.robodesign.ro + * + * $Date: 2010-05-06 20:18:30 +0300 $ + */ + +package ChatApp; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.Dimension; +import java.awt.Container; +import javax.swing.JRootPane; +import javax.swing.JPanel; +import javax.swing.JLabel; +import javax.swing.JButton; +import javax.swing.JSplitPane; +import javax.swing.JTabbedPane; +import javax.swing.JTextField; +import javax.swing.JList; +import javax.swing.JEditorPane; +import javax.swing.JComponent; +import javax.swing.JFrame; + +public class PaginaChat extends JPanel implements ActionListener { + private appMain myApp; + private JLabel infoClienti; + private JLabel infoConexiune; + private JButton btnNick; + private JButton btnDeconectare; + private JButton btnTrimite; + private JList listaClienti; + private JEditorPane mesajeServer; + private JTextField serverMsgField; + private JButton btnTrimiteMesaj; + private JTabbedPane chatTabs; + + public PaginaChat (appMain rootApp) { + super(new GridBagLayout()); + + myApp = rootApp; + + btnNick = new JButton("nume:"); + btnNick.setDefaultCapable(false); + btnNick.setActionCommand("schimbareNume"); + btnNick.addActionListener(this); + + btnDeconectare = new JButton("Deconectare"); + btnDeconectare.setDefaultCapable(false); + btnDeconectare.setActionCommand("deconectareServer"); + btnDeconectare.addActionListener(this); + + btnTrimite = new JButton("Trimite"); + btnTrimite.setDefaultCapable(true); + btnTrimite.setActionCommand("trimiteMesajServer"); + btnTrimite.addActionListener(this); + + infoConexiune = new JLabel("Conectat la server:port."); + infoClienti = new JLabel("N clienti"); + + listaClienti = new JList(); + mesajeServer = new JEditorPane(); + mesajeServer.setMinimumSize(new Dimension(300, 100)); + + mesajeServer.setEditable(false); + serverMsgField = new JTextField(); + + JPanel panouClienti = new JPanel(new GridBagLayout()); + panouClienti.setMinimumSize(new Dimension(100, 100)); + + GridBagConstraints c = new GridBagConstraints(); + + c.insets = new Insets(5, 5, 5, 5); + c.fill = c.BOTH; + c.anchor = c.CENTER; + c.gridx = 0; + c.gridy = 0; + c.gridwidth = c.REMAINDER; + c.weightx = 1; + c.weighty = 0; + panouClienti.add(infoClienti, c); + + c.gridx = 0; + c.gridy = 1; + c.weighty = 1; + panouClienti.add(listaClienti, c); + + JSplitPane serverSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, mesajeServer, panouClienti); + serverSplitPane.setOneTouchExpandable(true); + serverSplitPane.setResizeWeight(0.85); + + JPanel tabServer = new JPanel(new GridBagLayout()); + + c.fill = c.BOTH; + c.anchor = c.CENTER; + c.gridx = 0; + c.gridy = 1; + c.gridwidth = c.REMAINDER; + c.gridheight = c.RELATIVE; + c.weightx = 0; + c.weighty = 1; + tabServer.add(serverSplitPane, c); + + c.fill = c.NONE; + c.anchor = c.WEST; + c.gridx = 0; + c.gridy = 2; + c.gridwidth = 1; + c.weighty = 0; + tabServer.add(btnNick, c); + + c.fill = c.HORIZONTAL; + c.gridx = 1; + c.gridwidth = c.RELATIVE; + c.weightx = 1; + tabServer.add(serverMsgField, c); + + c.fill = c.NONE; + c.gridx = 2; + c.weightx = 0; + tabServer.add(btnTrimite, c); + + chatTabs = new JTabbedPane(); + chatTabs.addTab("Server", tabServer); + + c.insets = new Insets(8, 8, 8, 8); + + c.fill = c.HORIZONTAL; + c.anchor = c.WEST; + c.gridx = 0; + c.gridy = 0; + c.gridwidth = c.RELATIVE; + c.gridheight = 1; + c.weightx = 1; + c.weighty = 0; + this.add(infoConexiune, c); + + c.fill = c.NONE; + c.anchor = c.EAST; + c.gridx = 1; + c.gridwidth = 1; + c.weightx = 0; + this.add(btnDeconectare, c); + + c.fill = c.BOTH; + c.gridx = 0; + c.gridy = 1; + c.gridwidth = c.REMAINDER; + c.gridheight = c.REMAINDER; + c.weightx = 1; + c.weighty = 1; + this.add(chatTabs, c); + + this.setMinimumSize(new Dimension(100, 100)); + } + + public void initializare () { + JFrame f = myApp.myFrame; + + infoConexiune.setText("Conectat la " + myApp.server + ":" + myApp.port); + btnNick.setText(myApp.userNick + ":"); + + f.setTitle("ChatApp - " + infoConexiune.getText() + ". " + infoClienti.getText() + "."); + f.setMinimumSize(new Dimension(300, 300)); + f.setPreferredSize(new Dimension(550, 450)); + + f.setContentPane((Container) this); + f.pack(); + f.setLocationRelativeTo(null); + + myApp.rootPane.setDefaultButton(btnTrimite); + serverMsgField.requestFocusInWindow(); + } + + // event handler pentru butoanele din panou: schimbare nume, deconectare si + // trimitere mesaj. + public void actionPerformed (ActionEvent ev) { + String cmd = ev.getActionCommand(); + + if (cmd.equals("deconectareServer")) { + myApp.deconectareServer(); + } + } +} diff --git a/ChatApp/PortVerifier.java b/ChatApp/PortVerifier.java deleted file mode 100644 index 9d6d919..0000000 --- a/ChatApp/PortVerifier.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * © 2010 ROBO Design - * http://www.robodesign.ro - * - * $Date: 2010-05-04 19:45:54 +0300 $ - */ - -package ChatApp; - -import java.text.NumberFormat; -import javax.swing.*; -import java.awt.Toolkit; - -// validare pentru campul Port. -public class PortVerifier extends InputVerifier { - public NumberFormat fmt; - public int minVal = 1024; - public int maxVal = 65535; - public int cols = 6; - - public PortVerifier () { - super(); - - fmt = NumberFormat.getInstance(); - fmt.setMaximumFractionDigits(0); - fmt.setMaximumIntegerDigits(5); - fmt.setParseIntegerOnly(true); - } - - public boolean shouldYieldFocus (JComponent input) { - if (this.verify(input)) { - return true; - } else { - Toolkit.getDefaultToolkit().beep(); - return false; - } - } - - public boolean verify (JComponent input) { - if (!(input instanceof JFormattedTextField)) { - return true; - } - - JFormattedTextField ftf = (JFormattedTextField) input; - - boolean validat = true; - - int p = minVal; - try { - p = fmt.parse(ftf.getText()).intValue(); - } catch (Exception e) { - System.out.println("Valoare invalida pentru port."); - validat = false; - } - - if (p < minVal || p > maxVal) { - p = p < minVal ? minVal : maxVal; - validat = false; - } - - if (!validat) { - ftf.setText(fmt.format(p)); - ftf.selectAll(); - } - - return validat; - } -} - -// vim:set fo=wancroql tw=80 ts=2 sw=2 sts=2 sta et ai cin ff=unix: diff --git a/ChatApp/PrimaPagina.java b/ChatApp/PrimaPagina.java index e0fc409..ac14e6e 100644 --- a/ChatApp/PrimaPagina.java +++ b/ChatApp/PrimaPagina.java @@ -2,50 +2,56 @@ * © 2010 ROBO Design * http://www.robodesign.ro * - * $Date: 2010-05-05 15:44:03 +0300 $ + * $Date: 2010-05-06 20:17:02 +0300 $ */ package ChatApp; -import javax.swing.*; -import java.beans.PropertyChangeListener; -import java.beans.PropertyChangeEvent; -import java.awt.Component; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.Container; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; -import java.awt.BorderLayout; +import javax.swing.JButton; +import javax.swing.JComponent; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JSpinner; +import javax.swing.JFrame; +import javax.swing.JTabbedPane; +import javax.swing.JTextField; +import javax.swing.SpinnerNumberModel; // Panoul principal, "prima pagina". Acesta permite utilizatorului: // - sa porneasca serverul pentru a gazdui un chat, // - sa se conecteze la un alt server, la un chat existent. public class PrimaPagina extends JPanel implements ActionListener, ChangeListener { - public JButton myDefaultButton; - public JComponent myDefaultComponent; - - private JRootPane myRootPane; + private appMain myApp; private JTabbedPane panouTaburi; - private JFormattedTextField portField; - private PortVerifier portVerifier; + private JSpinner serverPortField; + private JSpinner clientPortField; + private int portMin = 1024; + private int portMax = 65535; private JTextField serverNickField; private JTextField clientNickField; private JTextField serverAddressField; private JButton btnConectareServer; private JButton btnStartServer; - public PrimaPagina (JRootPane root) { + public PrimaPagina (appMain rootApp) { super(new GridBagLayout()); - GridBagConstraints c = new GridBagConstraints(); - c.insets = new Insets(6, 6, 6, 6); - myRootPane = root; + GridBagConstraints c = new GridBagConstraints(); + myApp = rootApp; panouTaburi = new JTabbedPane(); + panouTaburi.setName("taburiPrimaPagina"); panouTaburi.addTab("Conectare la server", this.panouConectareServer()); panouTaburi.addTab("Gazduire server", this.panouGazduireChat()); panouTaburi.addChangeListener(this); @@ -58,10 +64,13 @@ public class PrimaPagina extends JPanel implements ActionListener, ChangeListene c.gridheight = 1; c.weightx = 1; c.weighty = 1; + c.insets = new Insets(12, 12, 6, 12); this.add(panouTaburi, c); JButton btnIesire = new JButton("Iesire"); + btnIesire.setToolTipText("Iesire din aplicatie."); btnIesire.setActionCommand("iesireApp"); + btnIesire.setDefaultCapable(false); btnIesire.addActionListener(this); c.fill = c.NONE; @@ -72,39 +81,73 @@ public class PrimaPagina extends JPanel implements ActionListener, ChangeListene c.gridheight = c.RELATIVE; c.weightx = 0; c.weighty = 0; + c.insets = new Insets(6, 12, 12, 12); this.add(btnIesire, c); + } - myDefaultButton = btnConectareServer; - myDefaultComponent = clientNickField; + // initializarea interfetei + public void initializare () { + JFrame f = myApp.myFrame; + + f.setTitle("ChatApp"); + f.setMinimumSize(new Dimension(350, 300)); + f.setPreferredSize(null); + f.setContentPane((Container) this); + f.pack(); + f.setLocationRelativeTo(null); + + Component tab = panouTaburi.getSelectedComponent(); + + if (tab.getName().equals("conectareServer")) { + myApp.rootPane.setDefaultButton(btnConectareServer); + clientNickField.requestFocusInWindow(); + } else if (tab.getName().equals("gazduireChat")) { + myApp.rootPane.setDefaultButton(btnStartServer); + serverNickField.requestFocusInWindow(); + } else { + myApp.rootPane.setDefaultButton(null); + } } // event handler pentru butoanele din panou: gazduire server si conectare la // server. public void actionPerformed (ActionEvent ev) { String cmd = ev.getActionCommand(); - if (cmd.equals("startServer")) { - System.out.println("startServer"); - } else if (cmd.equals("conectareServer")) { - System.out.println("conectareServer"); + + if (cmd.equals("startServer") && + serverNickField.getText().length() > 0) { + + int port = ((SpinnerNumberModel) serverPortField.getModel()).getNumber().intValue(); + myApp.startServer(serverNickField.getText(), port); + + } else if (cmd.equals("conectareServer") && + clientNickField.getText().length() > 0 && + serverAddressField.getText().length() > 0) { + + int port = ((SpinnerNumberModel) clientPortField.getModel()).getNumber().intValue(); + myApp.conectareServer(clientNickField.getText(), serverAddressField.getText(), port); + } else if (cmd.equals("iesireApp")) { - System.exit(0); + myApp.iesireApp(); } } + // event handler pentru schimbarea tabului activ. public void stateChanged (ChangeEvent ev) { Object src = ev.getSource(); if (!(src instanceof JTabbedPane)) { return; } + JTabbedPane panou = (JTabbedPane) src; if (panou == panouTaburi) { int sel = panou.getSelectedIndex(); if (sel == 0) { - myRootPane.setDefaultButton(btnConectareServer); + myApp.rootPane.setDefaultButton(btnConectareServer); } else if (sel == 1) { - myRootPane.setDefaultButton(btnStartServer); + myApp.rootPane.setDefaultButton(btnStartServer); } else { - myRootPane.setDefaultButton(null); + myApp.rootPane.setDefaultButton(null); } } } @@ -114,27 +157,27 @@ public class PrimaPagina extends JPanel implements ActionListener, ChangeListene GridBagConstraints c = new GridBagConstraints(); c.fill = c.HORIZONTAL; c.anchor = c.WEST; - c.insets = new Insets(4, 4, 4, 4); + c.insets = new Insets(5, 5, 5, 5); JPanel panou = new JPanel(new GridBagLayout()); + panou.setName("gazduireChat"); - // portul de ascultare conexiuni la serverul local. - portVerifier = new PortVerifier(); + SpinnerNumberModel portModel = new SpinnerNumberModel(portMin, portMin, portMax, 1); + serverPortField = new JSpinner(portModel); + serverPortField.setToolTipText("Portul pe carte serverul asculta conexiuni de la clienti."); - portField = new JFormattedTextField(portVerifier.fmt); - portField.setColumns(portVerifier.cols); - portField.setText(portVerifier.fmt.format(portVerifier.minVal)); - portField.setInputVerifier(portVerifier); - - JLabel portLabel = new JLabel("Port:"); - portLabel.setLabelFor(portField); + JLabel portLabel = new JLabel("Port de ascultare:"); + portLabel.setLabelFor(serverPortField); serverNickField = new JTextField(); serverNickField.setColumns(10); + serverNickField.setToolTipText("Numele tau, in calitatea de client pe server, folosit in discutiile cu ceilalti clienti."); + JLabel serverNickLabel = new JLabel("Nume:"); serverNickLabel.setLabelFor(serverNickField); btnStartServer = new JButton("Porneste serverul!"); + btnStartServer.setDefaultCapable(true); btnStartServer.setActionCommand("startServer"); btnStartServer.addActionListener(this); @@ -154,7 +197,7 @@ public class PrimaPagina extends JPanel implements ActionListener, ChangeListene panou.add(serverNickField, c); c.gridy = 1; - panou.add(portField, c); + panou.add(serverPortField, c); c.gridx = 0; c.gridy = 2; @@ -173,21 +216,33 @@ public class PrimaPagina extends JPanel implements ActionListener, ChangeListene GridBagConstraints c = new GridBagConstraints(); c.fill = c.HORIZONTAL; c.anchor = c.WEST; - c.insets = new Insets(4, 4, 4, 4); + c.insets = new Insets(5, 5, 5, 5); JPanel panou = new JPanel(new GridBagLayout()); + panou.setName("conectareServer"); clientNickField = new JTextField(); clientNickField.setColumns(10); + clientNickField.setToolTipText("Numele tau in discutiile cu ceilalti clienti conectati la server."); + JLabel clientNickLabel = new JLabel("Nume:"); clientNickLabel.setLabelFor(clientNickField); serverAddressField = new JTextField(); serverAddressField.setColumns(10); + JLabel serverAddressLabel = new JLabel("Adresa serverului:"); serverAddressLabel.setLabelFor(serverAddressField); + SpinnerNumberModel portModel = new SpinnerNumberModel(portMin, portMin, portMax, 1); + clientPortField = new JSpinner(portModel); + clientPortField.setToolTipText("Portul pe carte serverul asculta conexiuni de la clienti."); + + JLabel portLabel = new JLabel("Portul serverului:"); + portLabel.setLabelFor(clientPortField); + btnConectareServer = new JButton("Conecteaza-te la server!"); + btnConectareServer.setDefaultCapable(true); btnConectareServer.setActionCommand("conectareServer"); btnConectareServer.addActionListener(this); @@ -200,6 +255,9 @@ public class PrimaPagina extends JPanel implements ActionListener, ChangeListene c.gridy = 1; panou.add(serverAddressLabel, c); + c.gridy = 2; + panou.add(portLabel, c); + c.gridx = 1; c.gridy = 0; c.weightx = 1; @@ -209,8 +267,11 @@ public class PrimaPagina extends JPanel implements ActionListener, ChangeListene c.gridy = 1; panou.add(serverAddressField, c); - c.gridx = 0; c.gridy = 2; + panou.add(clientPortField, c); + + c.gridx = 0; + c.gridy = 3; c.anchor = c.NORTHEAST; c.fill = c.NONE; c.gridwidth = c.REMAINDER; diff --git a/ChatApp/appMain.java b/ChatApp/appMain.java new file mode 100644 index 0000000..055a8ee --- /dev/null +++ b/ChatApp/appMain.java @@ -0,0 +1,82 @@ +/* + * © 2010 ROBO Design + * http://www.robodesign.ro + * + * $Date: 2010-05-06 20:13:17 +0300 $ + */ + +package ChatApp; + +import java.awt.BorderLayout; +import java.awt.Container; +import java.awt.Dimension; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.JRootPane; + +public class appMain implements Runnable { + private PrimaPagina primapag; + private PaginaChat chatpag; + protected JFrame myFrame; + protected JRootPane rootPane; + protected String server = ""; + protected int port = 0; + protected String userNick = ""; + private boolean gazduire = false; + private boolean server_conectat = false; + + public void run () { + myFrame = new JFrame("ChatApp"); + myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + rootPane = myFrame.getRootPane(); + + primapag = new PrimaPagina(this); + chatpag = new PaginaChat(this); + + this.afisarePrimaPagina(); + myFrame.setVisible(true); + } + + private void afisarePrimaPagina () { + primapag.initializare(); + } + + private void afisarePaginaChat () { + chatpag.initializare(); + } + + protected void startServer (String nick, int port) { + this.gazduire = true; + this.server_conectat = true; + this.userNick = nick; + this.server = "localhost"; + this.port = port; + + this.afisarePaginaChat(); + } + + protected void conectareServer (String nick, String server, int port) { + this.server_conectat = true; + this.userNick = nick; + this.server = server; + this.port = port; + + chatpag.initializare(); + } + + protected void deconectareServer () { + this.server_conectat = false; + this.userNick = ""; + this.server = ""; + this.port = 0; + this.gazduire = false; + + this.afisarePrimaPagina(); + } + + protected void iesireApp () { + System.exit(0); + } +} + +// vim:set fo=wancroql tw=80 ts=2 sw=2 sts=2 sta et ai cin ff=unix: diff --git a/ChatAppEntry.java b/ChatAppEntry.java new file mode 100644 index 0000000..83e9a90 --- /dev/null +++ b/ChatAppEntry.java @@ -0,0 +1,26 @@ +/* + * © 2010 ROBO Design + * http://www.robodesign.ro + * + * $Date: 2010-05-06 14:05:11 +0300 $ + */ + +import ChatApp.appMain; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; + +public class ChatAppEntry { + public static void main (String[] args) { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (Exception e) { + System.out.println("Nu am reusit sa schimb interfata."); + } + + appMain app = new appMain(); + SwingUtilities.invokeLater(app); + } +} + +// vim:set fo=wancroql tw=80 ts=2 sw=2 sts=2 sta et ai cin ff=unix: + -- 2.11.4.GIT