Kann mir jemand sagen wo der Fehler liegt hier ua. beim Chatlog (Java ChatClient), wie speichert man andere Datentypen statt Strings im Filewriter ?

UML - (Computer, PC, Mathematik) ChatTest - (Computer, PC, Mathematik)

2 Antworten

Bitte setze jeglichen Quellcode in Code-Tags und notiere ihn untereinander, nicht alles in eine Zeile. Ansonsten wird sich keiner die Mühe machen, ihn zu lesen.

8

Du bist wahrscheinlich am Handy auf Pc/Laptop ist alles gut lesbar wie in Eclipse 

0
35

Ja, bin ich :) . Leider habe ich die nächsten Tage keinen PC zur Hand.

0
8
@tavkomann

Schade :/ oder einfach Desktopversion anfordern 

0
35

Also so, wie ich das jetzt verstanden habe, möchtest du die das Objekt nachricht in die Datei schreiben. Dies kannst du z. B. tun, indem du dieses in einen JSON-String umwandelst. Dazu musst du zunächst die jar-Datei von hier einbindhttp://search.maven.org/#artifactdetails%7Ccom.fasterxml.jackson.core%7Cjackson-core%7C2.3.1%7Cbundlendle Anschließend bindest du in der Klasse LogWriter folgende Dinge ein: import com.fasterxml.jackson.core.JsonProcessingException; Import com.fasterxml.jackson.databind.ObjectMapper; Dann kannst du das Objekt letztendlich umwandeln: Object Mapper mapper = new ObjectMapper(); try { String json = mapper.writeValueAsString(nachricht); // hier schreibst du dann den String json ganz normal in die Datei } catch (JsonProcessingException e) { e.printStackTrace(); } So kannst du in jede Zeile ein neue Nachricht als json-String schreiben. Umgekehrt geht es folgendermaßen: mapper.readValue(json, Nachricht.class); Diea wandelt den ausgelesenen String wieder in das gewünschte Objekt um. Es tut mir leid, dass ich jetzt in der App keine Code-Tags verwenden konnte.

1
8
@tavkomann

habs jetzt so hinbekommen jetzt wird auch Datum und empfänger gespeicher,gestern hat er mir noch einen Error angezeigt

 

writer.write(nachricht.getUhrzeit()+nachricht.getEmpfaenger()+nachricht.getText());

 

public class ChatTest {

public static void main(String[] args) {

ChatClient cc = new ChatClient();

IChatBeobachter a = new Anzeige();

IChatBeobachter b = new LogWriter();

cc.registriereBeobachter(a);

cc.registriereBeobachter(b);

cc.schreibeNachricht("Testmsg1", " Alex: ");

cc.schreibeNachricht(" Response1", " Tom:");

cc.schreibeNachricht(" Testmsg2 ", " Alex:");

 

 

0
8
@RealAutism

aber wie bekomme ich eine Chatlog-Datei  für JEDEN Benutzer hin ich hab jetzt nur einen allgemeinen Chatlog?

0
35

So wie du es jetzt gemacht hast, musst du aber immer gleich diese Trennzeichen (der Doppelpunkt) direkt in den Namen schreiben. Das würde ich noch ändern. Um für jeden Benutzer eine Datei zu erstellen, setzt du einfach den Dateinamen auf den Benutzernamen (in dem Moment, in dem du den Writer initialisierst.

1
8
@tavkomann

jo habs jetzt so gemacht man muss den Empfänger halt immer genau gleich eingeben ein Leerzeichen anders und es wird eine andere .txt Datei erstellt. Aber jetzt habe ich eine Datei für jede EMPFANGENE Nachricht des Benutzers, oder sollte man die GESENDETEN Nachrichten abspeichern? weil man hat ja immer nur den Empfänger gegeben nicht den Sender/Benutzer. Ansonsten hätte ich die Klasse Nachricht noch um das Attribut Sender erweitert aber darf man ja nicht wenn man so ein UML Diagramm gegeben hat

file = new File(nachricht.getEmpfaenger()+".txt");

0

gf mag iwie keine spitzen klammern... es ist natürlich so in der Klasse ChatClient

private ArrayList<IChatBeobachter> beobachter = new ArrayList<IChatBeobachter>();


Java Adressbuch programmieren

Ich bin Programmieranfänger und habe mir vorgenommen aus Spaß ein (Konsolen-)Adressbuch zu programmieren, aber es funktioniert nicht...

Man soll mit Befehlen verschiedene Funktionen aufrufen können (z.B. mit NEWCONTACT einen neuen Kontakt mit Name anlegen und am Ende der Sitzung mit SAVE alle eingegebenen Daten in eine .txt speichern und in einer neuen Sitzung mit SHOW die txt anzeigen lassen.

Code: package Adresses;

import java.io.*;
import java.util.*;

public class Entries 
{
    public static ArrayList<String> newContact()
    {
        ArrayList<String> contactList = new ArrayList<String>();
        System.out.println("Name: ");
        String add = new Scanner (System.in).nextLine(); 
        contactList.add(add);
        
        return contactList;
    }
    public static void save(ArrayList<String> saveList)
    {
        try (PrintWriter writer = new PrintWriter("addresses.txt"))
        {
            for(String address : saveList)
            {
                writer.write(address);
                writer.append(System.getProperty("line.seperator"));
            }
        }
        catch (IOException e) 
        { 
            e.printStackTrace(); 
        } 
   }

}


package Adresses;

import java.io.*;

public class Read 
{
    public static void read()
    {
        Reader reader = null;
        try
        {
            reader = new FileReader( "addresses.txt" );

                for ( int c; ( c = reader.read() ) != -1; )
                System.out.print( (char) c );
        }
        catch ( IOException e ) 
        {
          System.err.println( "Fehler beim Lesen der Datei!" );
        }
        finally 
        {
            try { reader.close(); } catch ( Exception e ) { e.printStackTrace(); }
        }
    }
}


package Adresses;

import java.util.*;

public class Main
{
    static ArrayList<String> al = new ArrayList<String>();
    static String helpShow = "SHOW Zeigt Kontakte in einer Liste an";
    static String helpSave = "SAVE Speichert alle eingegebenen Daten";
    static String helpNewContact = "NEWCONTACT Erstellt einen neuen Kontakt im Adressbuch";
    
    public static void main(String[] args) 
    {
        while (true)
        {
        boolean isQualifiedCommand = false;
        System.out.println( "Befehl eingeben: ");
        String s = new java.util.Scanner(System.in).nextLine();
        
            if(s.equalsIgnoreCase("newContact"))
            {
                al = Entries.newContact();
                isQualifiedCommand = true;
            }
            

Am Ende der Main Klasse stehen noch weitere if-Anweisungen.

Frage: Wie geht's richtig?

...zur Frage

Java Command "show" ist durchgestrichen(Bild)?

Ich glaube, dass durchgestrichene Commands erneuert werden oder so, stimmt das? Wenn das stimmt, was ist dann der neue Command? Oder warum funktioniert das sonst nicht? Für alle die es haben wollen den Code:

package cardlayout.tutorial;

import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Toolkit; import java.awt.event.ItemEvent; import java.awt.event.ItemListener;

import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JPanel;

public class CardLayout extends JFrame {

public static void main(String[] args) {
    new CardLayout();

}

private static final long serialVersionUID = 420622292333313289L;

private Toolkit t;
private int x, y, width = 800, height = 600;

//Komponenten
private JPanel mainContainer;
private JComboBox comboBox;

public CardLayout(){
    t = Toolkit.getDefaultToolkit();
    Dimension d = t.getScreenSize();
    x = (int) ((d.getWidth() - width) / 2);
    y = (int) ((d.getHeight() - height) / 2);

    setTitle("Gui Tutorial");
    setBounds(x, y, 800, 600);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    this.initialisierung();
    this.initListener();


    setVisible(true);
}


private void initialisierung(){
    this.getContentPane().setLayout(new BorderLayout());

    this.mainContainer = new JPanel(new java.awt.CardLayout());
    this.comboBox = new JComboBox(new String[]{"Card1", "Card2", "Card3", "Card4"});

    this.comboBox.setEditable(false);

    this.getContentPane().add(comboBox, BorderLayout.PAGE_START);
    this.getContentPane().add(mainContainer, BorderLayout.CENTER);

}


private void initListener(){
    this.comboBox.addItemListener(new ItemListener() {
        @Override
        public void itemStateChanged(ItemEvent e) {
            CardLayout cl = (CardLayout) mainContainer.getLayout();
            cl.show(mainContainer, e.getItem().toString());
        }
    });

}

}

...zur Frage

Java Chat-Programm: Namen und Nachricht tabellarisch ausgeben

Hallo,

ich schreibe zur Zeit einen einfachen Chat Client in Java. Die GUI besteht aus 3 Teilen: einer AWT TextArea, einem TextField und einem Button. In der TextArea werden (Absender-)Namen und Nachricht angezeigt. Sind die Namen aber untersciedlich lang, fängt alles an, unübersichtlich zu werden. Meine Frage: Ist es möglich, Namen und Nachrichten "tabellarisch" darzustellen, dh alle Nachrichten unabhängig der länge des Namens an der gleichen Stelle beginnen zu lassen?

Ich hatte schon mehrere Lösungsversuche, u.a. angleichen der Name -Strings mit Leerzeichen(erfolglos), JTable(zu kompliziert für mich, leider anfänger), zwei textAreas (funktioniert maximal solange wie nachricht und name beide einzeilig sind), ...

Hat jemand ne idee?

GUI Code:

package paket;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSeparator;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
import java.awt.TextArea;
import java.awt.Color;


public class GUI extends JFrame {

private static final long serialVersionUID = 1696775456153992537L;
private JPanel contentPane;
public JTextField textField;
public JButton btnSend = new JButton("Send");
private static TextArea textArea = new TextArea(null, 0, 0, TextArea.SCROLLBARS_VERTICAL_ONLY);

/**
 * Create the frame.
 */
public GUI() {
    setResizable(false);
    setTitle("Chat");

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 450, 300);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(null);
    
    textField = new JTextField();
    textField.setBounds(10, 226, 330, 40);
    contentPane.add(textField);
    textField.setColumns(10);
    
    textField.addKeyListener(new Drücker());
    textField.setEditable(false);
    
    btnSend.setBounds(345, 226, 89, 40);
    contentPane.add(btnSend);
    
    btnSend.addActionListener(new DerHandler());
    btnSend.setEnabled(false);
    
    JSeparator separator = new JSeparator();
    separator.setBounds(10, 220, 424, 2);
    contentPane.add(separator);
    
    textArea.setBackground(Color.WHITE);
    textArea.setEditable(false);
    textArea.setBounds(10, 10, 424, 204);
    
    contentPane.add(textArea);
    
    this.setVisible(true);
    
}
//------------------------------------------------------------------------------------------------------------------

public void appendMessage(String text){
    
    textArea.append("[Service] :  " + text + "\n");
    
}

public void appendMessage(String text, String name){
    
    textArea.append("[" + name + "] :  " + text + "\n");
    
}

public void clearText(){
    
    textArea.setText("");
    
}

//  --------------------------------------------------------------------------------------------

Hier kommt nur noch der ActionListener für den Button
...zur Frage

Was möchtest Du wissen?