PopupMenü

ebruss17

Bekanntes Mitglied
Hallo Leute,

ich habe ein kleines Problem und zwar habe ich im Server ein Menü erstellt. Ich möchte jedoch diese Funktionen aus den Menüs auch als Kontextmenü(PopupMenü) erstellen. Jedoch funktioniert es bei mir leider nicht! Hier mein Code:

Java:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.awt.*;
import java.awt.event.*;


/**
 * @author zengin
 * Mithilfe der Klasse Server findet die Kommunikation zwischen dem Client
 * und dem Server über den Socket 45678 statt. Diese Klasse wurde so implementiert,
 * sodass sich mehrere Clients beim Server anmelden können. Der Server ist also
 * multi-user-fähig. Der Server protokolliert seine Aktivitäten mit Datum - und
 * Zeitausgabe in eine Logfile mit dem Datei-Namen "logfile.csv".
 */
public class Server extends Frame implements ActionListener, MouseListener {

    /**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	File serverdatei = new File("logfile.csv");
    private static ArrayList<String> eintragsliste = new ArrayList<String>();
   MenuBar menuBar;
   Menu menu;
   Menu menu1;
   MenuItem menuItem;
   PopupMenu popup;
   Label label;
   
  public Server()
  {
	  super("Server-GUI");
	  this.setSize(200,130);
	  this.setLocation(100,250);
	  this.setBackground(Color.lightGray);
	
	  menuBar = new MenuBar();
	  this.setMenuBar(menuBar);
	  menu = new Menu("Datei");
	  menuBar.add(menu);
	  menuItem = new MenuItem("Oeffnen", new MenuShortcut(KeyEvent.VK_O));
	  menuItem.addActionListener(this);
	  menu.add(menuItem);
	  menuItem = new MenuItem("Speichern", new MenuShortcut(KeyEvent.VK_S));
	  menuItem.addActionListener(this);
	  menu.add(menuItem);
	  menu.addSeparator();
	  menuItem = new MenuItem("Beenden");
	  menuItem.addActionListener(this);
	  menu.add(menuItem);
	  menu = new Menu("Info");
	  menuBar.add(menu);
	  menuItem = new MenuItem("Info", new MenuShortcut(KeyEvent.VK_I));
	  menuItem.addActionListener(this);
	  menu.add(menuItem);
	  
	  popup = new PopupMenu();
	  this.add(popup);
	  MenuItem mItem = new MenuItem("Info");
	  mItem.addActionListener(this);
	  popup.add(mItem);
	  popup.addSeparator();
	  mItem = new MenuItem("Datei öffnen");
	  mItem.addActionListener(this);
	  popup.add(mItem);
	  mItem = new MenuItem("Datei Speichern");
	  mItem.addActionListener(this);
	  popup.add(mItem);
	  
	  
	  label = new Label();
	  label.setSize(320,30);
	  label.setLocation(25, 250);
	  add(label);
	  
	  
	  this.setVisible(true);
	  this.addWindowListener(new WindowAdapter()
	  {
		  public void windowClosing(WindowEvent we)
		  {
			  System.exit(0);
		  }
	  });
	  this.enableEvents(AWTEvent.MOUSE_EVENT_MASK);
	 }
  
  public void processMouseEvent(MouseEvent me)
	{
		if(me.isPopupTrigger())
			popup.show(me.getComponent(), me.getX(), me.getY());
	}
  

  public void actionPerformed(ActionEvent ae)
  {
	  Object o = ae.getSource();
	  if(((MenuItem)o).getLabel().equals("Oeffnen"))
	  {
		  FileDialog fileDialog = new FileDialog(this, "Datei Oeffnen", FileDialog.LOAD);
		  fileDialog.setVisible(true);
		  label.setText("Datei " + fileDialog.getDirectory() + fileDialog.getFile() + " ausgewählt");
	  }
	  if(((MenuItem)o).getLabel().equals("Speichern"))
	  {
		  FileDialog fileDialog = new FileDialog(this, "Datei speichern unter", FileDialog.SAVE);
		  fileDialog.setVisible(true);
		  label.setText("Speichern unter " + fileDialog.getDirectory() + fileDialog.getFile());
	  }
	  if(((MenuItem)o).getLabel().equals("Datei Oeffnen"))
	  {
		  FileDialog fileDialog = new FileDialog(this, "Datei Oeffnen", FileDialog.LOAD);
		  fileDialog.setVisible(true);
		  label.setText("Datei " + fileDialog.getDirectory() + fileDialog.getFile() + " ausgewählt");
	  }
	  if(((MenuItem)o).getLabel().equals("Datei Speichern"))
	  {
		  FileDialog fileDialog = new FileDialog(this, "Datei speichern unter", FileDialog.SAVE);
		  fileDialog.setVisible(true);
		  label.setText("Speichern unter " + fileDialog.getDirectory() + fileDialog.getFile());
	  }
	  if(((MenuItem)o).getLabel().equals("Beenden"))
	  {
		  MeinDialog meinDialog = new MeinDialog(this, "Ende-Dialog", "Wollen Sie die Anwendung wirklich beenden?");
		  if(meinDialog.getAntwort())
			  System.exit(0);
	  }
	  if(((MenuItem)o).getLabel().equals("Info"))
	  {
		  @SuppressWarnings("unused")
		MeinDialog meinDialog = new MeinDialog(this, "Info", "Dieses Programm enthält ein Menü");
	  }
  }
  
  public void mouseEntered(MouseEvent arg0)
  {
	  
  }
  
  @Override
	public void mouseClicked(MouseEvent me) {
		// TODO Auto-generated method stub
	}

	@Override
	public void mouseExited(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mousePressed(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseReleased(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}
  
  
    /**
     * Mithilfe der main-Methode findet die Kommunikation des Servers 
     * mit dem Client über Sockets statt. Die run-Methode
     * der Klasse Thread wird ebenfalls implementiert und überschrieben. 
     * Innerhalb der run-Methode werden Zeit- und Datumsformate definiert. 
     * Die Optionen, die der Client auswählt, werden dem Server als Anfrage geschickt
     * und werden auf der Konsole des Servers mit Zeit- und Datumsausgabe ausgegeben.
     * Mithilfe der Variable "schreibenUeberSocket" vom Typ BufferedWriter-Objekt
     * schreibt der Server dem Client über den Socket, ob die Auswahl des Clients
     * in Ordnung ist. Der Aufruf der Methode start() in Zeile 136 der Klasse Thread 
     * bewirkt, dass sich mehrere Clients mit dem Server verbinden können.
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws Exception
    {
    	@SuppressWarnings("unused")
		Server server = new Server();
       
		
        ServerSocket myServerSocket = new ServerSocket(45678);
        
        while(true)
        {
            final Socket myClientSocket = myServerSocket.accept();
            (new Thread(new Runnable()
            {
                public void run()
                {
                	try
                	{
                    BufferedReader lesenUeberSocket=new BufferedReader(new InputStreamReader(myClientSocket.getInputStream()));
                    BufferedWriter schreibenUeberSocket=new BufferedWriter(new OutputStreamWriter(myClientSocket.getOutputStream()));
                    
                    Label aktuelleZeit = new Label(aktuelleUhrzeit(new SimpleDateFormat("dd.MM.yyyy - HH:mm:ss")));
                    
                    
                    String anmeldung= aktuelleZeit + ";" + "Angemeldet an lokaler Adresse" + ";" 
                    				+ myClientSocket.getLocalAddress() + "\n";
                    eintragsliste.add(anmeldung);
                    writeLog(eintragsliste);
                    
                    System.out.println(
                    		"*************************" + "\n" + "> " + aktuelleZeit
                    		+ "\t" + "\t" +
                    		"--> Local Address angemeldet: "
                            + myClientSocket.getLocalAddress());
                    
                    String eingabeVonClientLesen;
                    
                    try
                    {
                        while((eingabeVonClientLesen = lesenUeberSocket.readLine()) != null)
                        {
                            int a=Integer.parseInt(eingabeVonClientLesen);
                            
                            if((a < 6) && (a > 0))
                            {
                                Label aktuelleZeit1 = new Label(aktuelleUhrzeit(new SimpleDateFormat("dd.MM.yyyy - HH:mm:ss ")));
                                choice(a, aktuelleZeit1);
                                writeLog(eintragsliste);
                                
                                System.out.println(
                                		"*************************" + "\n" + "> " + aktuelleZeit1
                                        + "\t" + "\t" + "Der Client hat den Menuepunkt \'"
                                        + a + "\' ausgewaehlt");
                                
                                schreibenUeberSocket.write("Ihre Auswahl ist in Ordnung :-)");
                                schreibenUeberSocket.newLine();
                                schreibenUeberSocket.flush();
                            }
                            else
                            {
                                choice(a, aktuelleZeit);
                                writeLog(eintragsliste);
                                
                                System.out.println(
                                		"*************************" + "\n" + "> " + aktuelleZeit
                                        + "\t" + "\t" + "Ungueltige Eingabe!");
                                
                                schreibenUeberSocket.write("Ihre Auswahl ist leider nicht in Ordnung :-(");
                                schreibenUeberSocket.newLine();
                                schreibenUeberSocket.flush();
                            }
                        }
                    }
                    catch(Exception e)
                    {
                    	System.out.println(
                    			"*************************" + "\n" + e.getMessage());
                    }
                    System.out.println(
                    		"*************************" + "\n" + "> " + aktuelleZeit
                    		+ "\t" + "\t" +
                    		"<-- Local Address abgemeldet: "
                            + myClientSocket.getLocalAddress());

                    String abmeldung = aktuelleZeit + ";"
                            + "Abgemeldet von der lokalen Adresse" + ";"
                            + myClientSocket.getLocalAddress() + "\n";
                    
                    eintragsliste.add(abmeldung);
                    writeLog(eintragsliste);
                   myClientSocket.close();
                } catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}finally
                {
                	
                }
            }})).start();
        }
    }
    
    
    /**
     * Diese Methode definiert die Zeit- und Datumsformate, die auf 
     * der Konsole des Servers und in der Logfile dementsprechend 
     * formatiert ausgegeben werden.
     */
    private static String aktuelleUhrzeit(SimpleDateFormat sdf)
    {
    	sdf = new SimpleDateFormat("dd.MM.yyyy - HH:mm:ss");
    	Date aktuelleZeit = new Date();
    	return sdf.format(aktuelleZeit);
    }
    
    
    /**
     * Mithilfe dieser Methode werden die einzelnen Einträge der Logfile formatiert.
     * Die einzelnen Case-Fälle, die der Client auswählt,
     * werden dann mit der entsprechend aktuellen Uhrzeit und dem aktuellen Datum
     * in die Datei "logfile.csv" hinzugefügt.
     * @param a
     * @param zeit
     */
    public static void choice(int a, Label zeit) {
        StringBuilder gebeString = new StringBuilder();
        gebeString.append(zeit);
        gebeString.append(";");

        switch (a) {
            case 1:
            	gebeString.append("Der Client hat den Menuepunkt ");
                gebeString.append(a + " ausgewaehlt");
                gebeString.append(";");
                gebeString.append("neue Person aufnehmen");
                gebeString.append(";");
                break;
            case 2:
            	gebeString.append("Der Client hat den Menuepunkt ");
                gebeString.append(a + " ausgewaehlt");
                gebeString.append(";");
                gebeString.append("Records auflisten");
                gebeString.append(";");
                break;
            case 3:
            	gebeString.append("Der Client hat den Menuepunkt ");
                gebeString.append(a + " ausgewaehlt");
                gebeString.append(";");
                gebeString.append("Records in eine Datei sichern");
                gebeString.append(";");
                break;
            case 4:
            	gebeString.append("Der Client hat den Menuepunkt ");
                gebeString.append(a + " ausgewaehlt");
                gebeString.append(";");
                gebeString.append("Datei löschen");
                gebeString.append(";");
                break;
            default:
                break;
        }

        gebeString.append("\n");

        eintragsliste.add(gebeString.toString());
    }

   
    /**
     * Mithilfe dieser Methode werden die Einträge 
     * in die serverdatei "logfile.csv" geschrieben.
     * Innerhalb dieser Methode werden die Zeichen-Stream-Klassen
     * BufferedWriter und FileWriter angewendet. Die
     * Zeichen-Stream-Klasse BufferedWriter schickt seine Daten
     * an FileWriter und dieser schreibt dann die Daten in die 
     * Datei "logfile.csv".
     */
    public static void writeLog(ArrayList<String> eintragsliste) {
        try {
       
            BufferedWriter bw = new BufferedWriter(new FileWriter("logfile.csv"));

            for (int i = 0; i < eintragsliste.size(); i++) {
                bw.write(eintragsliste.get(i));
            }

            bw.close();
           
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
    
}
 

Marco13

Top Contributor
@bERt0r: Das gepostete war AWT, aber ....
@ebruss17: Sicher, dass du AWT verwenden willst? Ansonsten würde bERt0r's Link vielleicht schon helfen ;) Andernfalls müßten wir dir helfen uns zu helfen dir zu helfen uns zu helfen dir zu helfen eine genauere Beschreibung zu posten als "Funzt net" + 1000 Zeilen Code...
 

ebruss17

Bekanntes Mitglied
wir dürfen Swing nicht benutzen sondern AWT. ich klicke die rechte Maustaste, damit er mir das Popupmenü anzeigen soll aber da kommt nichts es kommt auch beim Ausführen keine Fehlermeldung....
 

Marco13

Top Contributor
Erstmal muss irgendwo im Konstruktor sowas stehen wie
Java:
dieComponentZuDerDasMenuGehört.addMouseListener(this);
und dann z.B.
Java:
public void mouseClicked(MouseEvent me) 
{
    processMouseEvent(me);
}
(oder die processMouseEvent rauswerfen, und ihren Inhalt direkt in mouseClicked schreiben)
 

bERt0r

Top Contributor
Gibts in der hinsicht wirklich so viele Unterschiede zwischen Awt und Swing? Ich meine ausser das J bei den paar Klassen.
 

Marco13

Top Contributor
Zum Beispiel im Konstruktor, nachdem du das 'label' erstellt hast:

label.addMouseListener(this);

Danach sollte bei einem Rechtsklick auf das Label das Menu erscheinen.
 

ebruss17

Bekanntes Mitglied
vielen Dank für deine Hilfe ich habe es heute Morgen zum Glück noch hinbekommen ;)

mein Problem ist jetzt, ich habe einen Button - Serverstopp erstellt wenn ich draufklicke geht aber leider nicht ....
 

Marco13

Top Contributor
"Mein Auto funktioniert nicht"
"Was heißt das?"
"Also, ich trete auf's Gaspedal, aber es fährt nicht"
Vielleicht hat jemand anderes mehr Geduld.
 

Ähnliche Java Themen

Neue Themen


Oben