# Message Encoder Decoder



## b1zarRe (30. Apr 2011)

Hi!

Ich spiele seit vorgestern das erste mal mit Swing und GUIs herum und dachte mir, ich lerne es
am besten, wenn ich direkt ein Programm damit schreibe.

Soweit bin ich im Moment: http://www7.pic-upload.de/30.04.11/1nta64cnd2fp.png
(Wenn man auf "File" geht, gibt es da noch die Möglichkeiten Exit sowie Save(Eingabe und Ausgabetext
wird nach D:\Textdatei.txt gespeichert) und wenn man auf Help geht gibt es einmal ein Popupmenü
mit versionsname und Ersteller etc. sowie ein Button "Go To Website" der zu meiner Webseite
verlinkt.)

Alles soweit schön und gut... Im moment habe ich aber dennoch 2 Fragen:
Momentan speichert er alles wie gesagt nach D:\Textdatei.txt ab. Leider wird sicherlich nicht jeder
Benutzer eine D:\ Partition haben... Wie ist der allgemeine Pfad zu Eigene Dateien, die wohl jeder hat?
Oder noch besser: Wie speicher ich die Textdatei direkt an dem Platz ab, wo die Jar Datei gestartet wurde?

Eine Frage reicht ersteinmal, danke!


----------



## Marco13 (30. Apr 2011)

Um im "Hauptpfad" zu speichern (Projektwurzel oder JAR-Pfad) einfach nichts vorne dran schreiben
File f = new File("test.txt");

Ansonsten kriegt man weitere interessante Pfade über System (Java 2 Platform SE v1.4.2)


----------



## b1zarRe (30. Apr 2011)

```
/** Speichert Informationen in einer Textdatei auf der Festplatte ab. */
    public void saveInformations(String text) throws Exception {
        File file = new File("MessageDecoderEncoder.txt");
//        File file = new File("D:\\MessageDecoderEncoder.txt");
        FileWriter filewriter = new FileWriter(file);

        filewriter.write(text);
        filewriter.flush();
    }
```

Hab es so probiert, aber leider funktioniert es nicht... Speichert dann nrigendswo ab... die Zeile dadrunter ("File file(...)("D:\\"))
funktioniert aber... mhhh. Leider finde ich auch nicht die im Link von dir geposten Methoden zur weiteren Pfaden..!? Danke dir


----------



## b1zarRe (1. Mai 2011)

Eine andere Frage wäre, wie sicher der sun.misc.BASE64Decoder bzw Encoder denn ist? Das Programm mache ich egtl. nur aus "Spass", aber würde gerne diesen Decoder bzw. Encoder abändern, damit das nicht zu sehr "standard" ist... Wie kann ich zb einem String sagen, dass er jeden Buchstaben zb. um rechts verschieben soll.. oÄ?


----------



## Gast2 (1. Mai 2011)

Base64 encodieren hat nichts mit Sicherheit zu tun. Was du suchst ist eine Verschlüsselung.


----------



## b1zarRe (1. Mai 2011)

Wofür ist dann Base64 genau da???


----------



## maki (1. Mai 2011)

Base64 ? Wikipedia


----------



## b1zarRe (1. Mai 2011)

Ok, danke euch... dann guck ich mal nach was anderem wie dem rot13 oder so... rsa ist mir für mein miniprogramm doch bisl zu aufwändig ^^

Habt ihr vllt ideen zu meinem FileWriter Problem und dem Speicherort? (s.o.)


----------



## Marco13 (1. Mai 2011)

Kannst am ende der Methode nochmal sowas schreiben wie
filewriter.close();
System.out.println("Sollte jetzt in "+file+" liegen...");


----------



## b1zarRe (1. Mai 2011)

@marco13

Prima! So hat es geklappt!  Weitere Fragen folgen die Tage... ich danke euch schonmal


----------



## b1zarRe (2. Mai 2011)

So, ich frage dann mal weiter (denke ich werde immer basteln bis ich auf Fragen komme, welche ich selbst nich beantworten kann und stelle dann am Ende auch das Programm hier on, falls es wen dann interessiert! )

Ich würde gerne meiner GUI einen modernen Touch und Aussehen verpassen. Ich hatte mich heute morgen bisschen eingelesen über LOOK AND FEELS und auch schon danach gegoogelt und wie ich es umstelle hab ich denke ich auch schon verstanden. Leider finde ich nur keine guten kostenlosen also freien LaFs.. Hab mich schon bei jtattoo oder Konsorten umgeschaut aber würde gerne erfragen, ob ihr noch andere gute Links erspäht habt? Vielen dank


----------



## Marco13 (2. Mai 2011)

Für solche Sachen wäre dann vielleicht ein eigener Thread passender....


----------



## b1zarRe (2. Mai 2011)

Marco13 hat gesagt.:


> Für solche Sachen wäre dann vielleicht ein eigener Thread passender....


Genau das wollte ich egtl. nicht, da sonst nur Antworten kommen wie "Such doch selbst... Google... Guck hier im Forum"... Was ich alles schon gemacht habe und in dem Thread das alles auf ein Programm spezifiert ist.

Noch eine Andere Frage: Momentan habe ich ein FlowLayout benutzt und bin eigentlich zufrieden damit, ausser das die Buttons und TextFields halt alle so direkt untereinander sind... Ich würde lieber bestimmen wolllen, wieviel freie Platz dazwischen liegen soll... Wie geht das? Soll ich den SourceCode komplett posten?

Grüße und viele Dankeschöns


----------



## Marco13 (2. Mai 2011)

Im Konstruktor kann man schonmal "hgap" und "vgap" angeben. Darüberhinaus kann man noch Unsichtbare Components einfügen, How to Use BoxLayout (The Java™ Tutorials > Creating a GUI With JFC/Swing > Laying Out Components Within a Container) aber bin nicht 100% sicher ob und wie gut das mit FlowLayout funktioniert


----------



## b1zarRe (2. Mai 2011)

@MArco (danke schonmal für deine Hilfe!) 

Nur leider helfen mir die Tutorials nicht viel weiter, da die ganzen Button Beispiele ebenso direkt untereinander liegen und ich möchte ja bisschen ABstand lassen (Siehe Link)


----------



## Marco13 (2. Mai 2011)

Ich weiß nicht genau, was du meinst, bzw. was an den Hinweisen nicht passt...


----------



## b1zarRe (3. Mai 2011)

Ich poste einfach mal den Anfang des Codes... (Ist mein erstes Mal mit Swing.. also nicht zu sehr runterbuttern bitte )

Eine andere Frage wäre, wie ich html in mein JavaProgramm einbinde? Also sprich in Strings....
Das hat irgendwie nicht funktioniert: String s = "Das ist ein Beispielstring mit <b>fetter</b> Schrift";
Oder muss ich dort vorher noch eine Art HTML Klasse hinzufügen??


```
public class MessageEncoderDecoder extends JFrame {

    /** Instanzvariablen. */
    private JMenu file;
    private JMenu help;
    private JMenu settings;
    private JMenuBar menubar;
    private JMenuItem exit;
    private JMenuItem about;
    private JMenuItem goToWebsite;
    private JMenuItem save;
    private JMenuItem mailto;
    private JMenuItem login;
    private JMenuItem setPassword;
    private JLabel untertext;
    private JLabel einzugebeneNachricht;
    private JLabel verschluesselteNachricht;
    private JTextField eingabeText;
    private JTextField ausgabeText;
    private JButton verschluesselButton;

    private Verschluesselung verschluesselung;


//    private JTextArea textbox;
    private JSeparator trennlinie;
    private JComboBox combobox;
    private JPanel jpanel;

    /** Konstruktor. */
    public MessageEncoderDecoder() {

        // Layout
//        setLayout(new BorderLayout());
        setLayout(new FlowLayout());
//        setLayout(null);
//        setLayout(new GridLayout(6,1));

        // Menuebar
        menubar = new JMenuBar();
        add(menubar);

        file = new JMenu("File");
        file.setMnemonic('F');
        menubar.add(file);
        
        settings = new JMenu("Settings");
        file.setMnemonic('S');
        menubar.add(settings);
        
        help = new JMenu("Help");
        file.setMnemonic('H');
        menubar.add(help);
        
        goToWebsite = new JMenuItem("Go To Website", 'W');
        help.add(goToWebsite);

        about = new JMenuItem("About", 'A');
        help.add(about);

        save = new JMenuItem("Save", 'S');
        file.add(save);

        mailto = new JMenuItem("Mail To...", 'T');
        file.add(mailto);

        exit = new JMenuItem("Exit", 'E');
        file.add(exit);
        
        login = new JMenuItem("Login", 'L');
        settings.add(login);
        
        setPassword = new JMenuItem("Set Password");
        setPassword.setMnemonic('S');
        settings.add(setPassword);

        setJMenuBar(menubar);
        

        // Eingabetext
        einzugebeneNachricht = new JLabel("Bitte hier den Eingabetext eingeben: ");
        add(einzugebeneNachricht);

        eingabeText = new JTextField("Eingabetext", 25);
        add(eingabeText);
//        textbox = new JTextArea(10,10);
//        add(textbox);

        // Combobox
        String encode = "Encode";
        String decode = "Decode";
        combobox = new JComboBox();
        combobox.addItem(encode);
        combobox.addItem(decode);
        add(combobox);

        // Buttons
        verschluesselButton = new JButton("OK");
        verschluesselButton.setEnabled(false);
        add(verschluesselButton);

        // Ausgabetext
        verschluesselteNachricht = new JLabel("Der verschlüsselte Eingabetext ist: ");
        add(verschluesselteNachricht);

        ausgabeText = new JTextField("Ausgabetext", 25);
        ausgabeText.setEditable(false);
        add(ausgabeText);

[B](...)[/B]

        MessageEncoderDecoder main = new MessageEncoderDecoder();
        main.setTitle("Message-Encoder-Decoder 0.1a");
        main.setSize(325,300);
        main.setLocation(750, 400);
        main.setResizable(false);
        main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        main.setVisible(true);
```


----------



## b1zarRe (4. Mai 2011)

Also ich habe nun herausgefunden, wie ich Buttons etc. verschieben kann nämliche halt mit
der setBounds(x,y,x,y); Methode... Das funktioniert soweit auch gut, wenn ich vorher ein Frame gemacht habe und das Layout auf null gesetzt habe.

Jedoch habe ich bei diesem "Projekt" alles auf FlowLayout gestellt und am Anfang damit gut gefahren... jedoch funktioniert da die SetBounds(). Methode anscheinend nicht.... Wieß jemand was anderers? Oder muss ich das ganze Programme nun umstrukturieren?


----------



## Marco13 (4. Mai 2011)

Hab das gepostete jetzt nicht nachvollzogen. HTML in Strings geht in TextComponents z.B. mit
JLabel label = new JLabel("<html>Text <b>fett</b></html>");

Zu LayoutManagern solltest du ggf. mal Using Layout Managers (The Java™ Tutorials > Creating a GUI With JFC/Swing > Laying Out Components Within a Container)  lesen - es gibt hier aber auch FAQ-Beiträge z.B. zu http://www.java-forum.org/java-faq-beitraege/109662-borderlayout.html


----------



## b1zarRe (4. Mai 2011)

Danke Dir! Klappt wunderbar mit den Strings und HTML Tags!

Ich versuch es nochmal: Wenn ich nur ein JFrame erzeuge und das Layout auf null setze, dann kann ich prima buttons etc. erzeugen und skalieren udn verschieben wie ich will. Nur habe ich bei meinem Programm das Layout am Anfang auf FlowLayout gesetzt und kann die einzelnen Komponenten zwar verkleinern vergrößern aber weiß nicht, wie ich sie verschieben kann...?

Andere Frage: http://www.abload.de/img/updater-so-soll47dz.png Wie Kriege ich so ne Umrandung hin?

Danke @Marco & andere


----------



## Marco13 (4. Mai 2011)

Viel davon steht in den Links. Wenn man "null"-Layout angibt kann man Größe und Position frei wählen. Das solle man aber nicht, weil spätestens wenn man die Fenstergröße ändert (oder auch unter anderen Bedinungen, andere LookAndFeels usw.) kommt alles durcheinander. 
Wenn man einen LayoutManager setzt, werden die Positionen der Components vom LayoutManager bestimmt. Die Größe der Components kann man in gewissen Grenzen festlegen (setPreferredSize/setMinimumSize/setMaximumSize), aber bei einigen Layouts können diese Wünsche nicht erfüllt werden - hängt vom LayoutManager ab.

Insgesamt sollte man sein GUI sinnvoll strukturieren, d.h. man überlegt sich was zusammengehört und was wo angeordnet sein soll, dann kommt man normalerweise mit einigen wenigen verschachtelten (einfachen) LayoutManagern hin. Mal' vielleicht mal ein Bild, wie das GUI aussehen soll.

So einen Rahmen kreigt man mit sowas wie
component.setBorder(BorderFactory.createTitledBorder("Titel", ...));
(genaue Parameter siehe BorderFactory-API-Doku)


----------



## b1zarRe (4. Mai 2011)

Marco13 hat gesagt.:


> So einen Rahmen kreigt man mit sowas wie
> component.setBorder(BorderFactory.createTitledBorder("Titel", ...));
> (genaue Parameter siehe BorderFactory-API-Doku)



Super klappt! Finde deine Quellcodes immer perfekt... Immer direkt so funktioniert  Kannse mir vllt noch einen Posten, der ein Standard LookAndFeel von momentan Metal (glaub ich) in ein anderes existierendes wechselt? Also ich weiß das man da ein try und catch Blcok machen soll und im Try halt UIManager.(...)
nur ich weiß leider nicht genau wo der genaue PFad von den bestehenden Look And FEels ist?

Und zu oben: So sollte es ca. aussehen...:
http://www7.pic-upload.de/04.05.11/rai4dwkjgng.jpg

Also kann man SetLayout(null) für die Tonne kloppen?


----------



## Marco13 (4. Mai 2011)

Das mit dem UIManager... weiß man nicht auswendig, das schreibt man höchstens (wenn überhaupt) einmal, und dann nie wieder (soll heißen: Websuche nach "java set look and feel" oder so...)

Das mit dem Layout... es gibt GANZ wenige Fälle, wo ein null-Layout Sinn macht, aber sicher nicht für ein normales, "Formularartiges" Fenster oder einen Dialog. 

Zum konkreten Layout ... ja, das Fenster ist einfach zu groß... was soll er da sinnlos-willkürlich Zwischenräume einfügen? Ich würde es so lassen, ggf. vielleicht ein GridLayout(3,1) für die drei Teile. Wenn die Ein- und Ausgabedinger TextAreas wären, würde er sie wohl automatisch größer ziehen (die "können ja nicht groß genug sein". Ggf. muss ich nochmal mit dem letzten Quellcode vergleichen, ob man das einfach ändern könnte. Und vielleicht schleicht auch ein GridBagLayout-Masochist hier im Thread vorbei, der eine Lösung postet (ist aber eher unwahrscheinlich, schließlich scheint es hier um "Message Encoder Decoder" zu gehen  )


----------



## Fu3L (4. Mai 2011)

Ich kann nur das EasyGridLayout empfehlen, das hier im Codeschnipselbereich gepostet wurde. Es ist super intuitiv. Man kann die Komponenten leicht platzieren, mit wählbarem Abstand.
Mit dem ExtendedFlowLayout zusammen (ebenfalls hier aus dem Forum), brauche ich keine anderen LayoutManager mehr^^ (Gut, ich programmiere auch (noch) nicht beruflich oder übermäßig viel^^)


----------



## b1zarRe (13. Mai 2011)

Ich habs jetzt geschafft das Programm zum verschlüsseln zu bringn (mithilfe von ROT13.. aber denke werde ich in Zukunft noch was anderes machen, damit auch Ziffern und Sonderzeichen verschluesselt werden), jedoch habe ich das Problem, dass es auf (bisher) einer Testperson nicht als JAR datei, sondern als zip Datei angezeigt wurde.

Kann man dies irgendwie kontrollieren, dass man sagt, es MUSS in einer JAR Datei angezeigt werden oder ist das Systemabhängig bzw. Benutzerkontrolliert?


----------



## Marco13 (13. Mai 2011)

Falls ich das richtig verstanden habe: Das hängt vom Enbenutzer (bzw. seinem System) ab. Bei WinXP:  Rechtsklick auf die Datei -> Eigenschaften -> "Öffnen mit" - dort kann man das Programm auswählen. 
Sollte aber bei einer JRE-Installation vermutlich automatisch so belegt werden, dass es passt ???:L Web- oder Forensuche nach "jar datei doppelklick" lieert viele Infos dazu.


----------



## b1zarRe (13. Mai 2011)

Kannst Du mir genaures zur der JRE Installation sagen oO

Ansonsten: Ist es "legal" wenn ich das Programm online stelle? Oder gibt es auf die ROT13 Verschlüsselung beispielsweise irgendwelche Lizenzen oÄ?


----------



## Marco13 (13. Mai 2011)

Nichts konkreteres als eine Websuche. Vielleicht doch mal einen neuen Thread aufmachen...


----------

