Compiler-Fehler GUI Anfänge

NeverGod

Mitglied
Hallo,
dies ist mein erster Post in diesem Forum. Ich habe nun schon Faq's gelesen und auch nach verwandten Themen gesucht. Auch jedesmal neue Ansatzpunkte gefunden die mich teilweise weitergebracht haben, jedoch bin ich immer wieder zu meinem "Ur-Problem" zurück, da keine Besserung zu sehen war. Ich bin im ersten Semester im Informatik Studium und wir haben gerade mit GUI angefangen. Vererbung, Polymorphie und so sind Worte, sagen mir jedoch noch nichts, da dies noch nicht Gegenstand der Vorlesung waren. Bislang sind wir bei Definition einer Klasse im objektorientierten Bereich (nach der imperativen Programmierung und Arrays und Verbunden).
Außerhalb der Übungen, die wir auf Übungszetteln finden können, wollte ich mir ein Programm basteln, dass einen Text chiffriert in Caesar Verschlüsselung. Soll später noch Vignere verschlüsselt werden, will jedoch erstmal nur Caesar. Meine Idee war es, es als GUI zu implementieren, mit der Absicht eines Feldes zur Eingabe des Klartextes und auf der anderen Seite die Ausgabe des Geheimtextes. Ich habe schon etwas implementiert, jedoch bekomme ich immer Fatal exception occurs, program will exit als fehlermeldung (Popup)

Habe die Funktion den Text zu chiffrieren noch nicht implementiert, da ich erstmal ein anderes Problem habe. Wir hatten in der Vorlesung, wie man eine GUI erstellt (nur mit java.awt.*) und keinerlei Funktion durch drücken von Button oder ähnlichem. Die andere importierte java.awt.event.* habe ich auch nur über dieses Forum erhalten.

Frage: Würde sich jemand erbarmen und mir sagen, was daran falsch ist? in etwas nicht-fachmännischer sprache, sodass ich es gut nachvollziehen kann? Ich bin gerne bereit dieses Swing zu lernen, falls jemand nen guten Libk hätte mit Beispielen, wie das geht, nur möcht ich auch irgendwie an die Lösung kommen. Wie gesgat, keine Übungsaufgabe, daher keine Eile :)

Java:
import java.awt.*;
import java.awt.event.*;

public class CaesarVerschluesselung implements ActionListener{
	private TextField text1, text2;

	public void main(String[] args) {
		Frame fenster = new Frame("CaesarVerschluesselung");
		fenster.setLocation(750, 250);
		fenster.setSize(750, 375);
		GridLayout fensterLayout = new GridLayout(2, 2);
		fenster.setLayout(fensterLayout);

		Panel p1 = new Panel();
		GridLayout pLayout = new GridLayout(1, 2);
		p1.setLayout(pLayout);
		Label l1 = new Label("Klartext:");
		p1.add(l1);
		TextField text1 = new TextField();
		p1.add(text1);
		Panel p2 = new Panel();
		p2.setLayout(pLayout);
		Label l2 = new Label("Geheimtext:");
		p2.add(l2);
		TextField text2 = new TextField();
		p2.add(text2);
		fenster.add(p1);
		fenster.add(p2);
		Button b1 = new Button("Verschlüsseln");
		b1.addActionListener(this);
		fenster.add(b1);
		Button b2 = new Button("Entschlüsseln");
		b2.addActionListener(this);
		fenster.add(b2);

		text2.setForeground(Color.blue);

		fenster.setVisible(true);

	}

	public void actionPerformed(ActionEvent e) {
		String s = text1.getText();
		text2.setText(s);
	}
}
 

André Uhres

Top Contributor
Hallo NeverGod,

herzlich willkommen bei "java-forum.org"!

Nach Swing konvertieren ist nicht schwer: einfach nur ein J vor die Klassennamen setzen. Versuch's mal hiermit:
Java:
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class CaesarVerschluesselung {

    private final JTextField text1, text2;

    public CaesarVerschluesselung() {
        JFrame fenster = new JFrame("CaesarVerschluesselung");
        fenster.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        fenster.setSize(750, 375);
        fenster.setLocationRelativeTo(null);
        //Create GUI elements:
        JPanel p1 = new JPanel();
        JPanel p2 = new JPanel();
        text1 = new JTextField();
        text2 = new JTextField();
        JButton b1 = new JButton("Verschlüsseln");
        JButton b2 = new JButton("Entschlüsseln");
        //Layout:
        p1.setLayout(new GridLayout(1, 0));
        p1.add(new JLabel("Klartext:"));
        p1.add(text1);
        p2.setLayout(p1.getLayout());
        p2.add(new JLabel("Geheimtext:"));
        text2.setForeground(Color.blue);
        p2.add(text2);
        fenster.setLayout(new GridLayout(0, 2));
        fenster.add(p1);
        fenster.add(p2);
        fenster.add(b1);
        fenster.add(b2);
        fenster.setVisible(true);
        //Install listeners:
        ActionListener actionHandler = new ActionHandler();
        b1.addActionListener(actionHandler);
        b2.addActionListener(actionHandler);
    }

    public static void main(final String args[]) {
        //GUI must start on EventDispatchThread:
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                CaesarVerschluesselung caesarVerschluesselung = new CaesarVerschluesselung();
            }
        });
    }

    private class ActionHandler implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            String s = text1.getText();
            text2.setText(s);
        }
    }
}
Gruß,
André
 

hdi

Top Contributor
Um eine Sache explizit zu erwähnen - da dass schon sehr fundamental ist:

Dein Code stellt gar kein Programm dar. Du kannst da also gar nichts starten. Ein Programm wird definiert über die main-Methode. Du denkst natürlich, dass du die hast:

Java:
public void main(String[] args) { ... }

Aber da fehlt ein kleines Wörtchen namens static:

Java:
public static void main(String[] args) { ... }

Es gibt einen großen Unterschied zwischen statischen und nicht-statischen Methoden. Im Allgemeinen, und im Fall der speziellen main-Methode erst Recht. Sofern du das static noch in die Signatur einfügst, sollte das Programm (das du erst dann hast, um das nochmal zu betonen) soweit erstmal laufen.

Und ein kleiner Crashkurs in Sachen GUI (Das tritt auf AWT und Swing gleichermaßen zu):
Wenn du LayoutManager verwendest, was du löblicherweise tust, dann musst du die Größe für das Frame nicht selbst angeben. Das
Code:
fenster.setSize(...)
kannst du also löschen. Statt dessen baust du ein
Code:
fenster.pack();
in den Code ein, und zwar nachdem du alles geaddet hast! Und der
Code:
fenster.setLocationRelativeTo(null)
-Aufruf gehört idealerweise auch hinter das pack, sonst zentriert sich das Fenster nicht korrekt auf dem Desktop.

Und auch noch wichtig wenn's um GUI's geht (was an der Uni krasserweise echt fast nie erwähnt wird - aber lassen wir das Thema besser, da könnte ich so nen Hals kriegen, es ist unglaublich was die mit euch abziehen. Grad mal die main-Methode gelernt und schon geht's um GUI :autsch:):

GUI's erzeugen und anzeigen muss man auf dem EDT (Event Dispatcher Thread). Das siehst du auch in André's Code:

Java:
 //GUI must start on EventDispatchThread:
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                  // Hier kommt das Erzeugen und Anzeigen des Frames rein
            }
        });

Was es damit auf sich hat, das kann ich dir jetzt nicht auf die Schnelle erklären. Dazu müsstest du etwas von Multi-Threading verstehen. Wobei, wahrscheinlich habt ihr das noch vor der main-Methode gelernt ;)
 

NeverGod

Mitglied
Also vielen lieben Dank, dass du meinen Text übersichtlicher gemacht hast. Das "neue" Layout woher kommt das? ist es wegen swing? mein Label ist leicht violett auf einmal untermalt.

Das mit der static void wusste ich im hinterkopf, nur wenn ich static hinschrieb, funktionierte mein (this) in den klammern bei actionListener nicht mehr, und das hatte ich aus einem anderen beitrag aus diesem forum. hatte dann über static ein wenig gelesen und irgendwo stand dann, wann man static braucht und wann nicht. und da las ich raus, dass man es nur dazu braucht, wenn es einmalig für diese klasse verwendbar sien soll... und das war mir irgendiwe nicht so wichtig.

[JAVA=44] public static void main(final String args[]) {
//GUI must start on EventDispatchThread:
EventQueue.invokeLater(new Runnable() {

@Override
public void run() {
CaesarVerschluesselung caesarVerschluesselung = new CaesarVerschluesselung();
}
});
}[/code]

Diesen Teil verstehe ich leider gar nicht. Weder warum ein final String args[] steht noch habe ich jemals dieses EventQueue.invokeLater(newRunnable() mal gesehen. Die geschweifte klammer geht zu danach noch eine Klammer und dann ein ; ? tut mir leid, aber was macht das? und dann das @Override was bewirkt das?

Ich weiß viele Fragen, nur ich würde gerne verstehen wie oder was es bewirkt, statt es stumpf zu nutzen. Dann weiß ich beim nächsten mal direkt wieso weshalb :)

Vielen lieben Dank für alles bisher. Es funktioniert und ich werd nun mal der Verschlüsselung widmen.
 

hdi

Top Contributor
Das "neue" Layout woher kommt das? ist es wegen swing? mein Label ist leicht violett auf einmal untermalt.
Ja, Swing nutzt ein anderen Look & Feel. Du kannst das Aussehen in Swing auch ändern, ist jetzt aber nicht wichtig.

Das mit der static void wusste ich im hinterkopf, nur wenn ich static hinschrieb, funktionierte mein (this) in den klammern bei actionListener nicht mehr, und das hatte ich aus einem anderen beitrag aus diesem forum.
Das liegt daran dass "this" nur im Objekt-bezogenen Kontext funktioniert. Namentlich: In Konstruktoren, nicht-statischen Methoden nicht-statischen Init-Blöcken (was letzteres ist kann dir egal sein, wirst du an der Uni niemals lernen).

Du musst in deiner main-Methode ein Objekt deiner Klasse erzeugen, und dein ganzes Zeug haust du in den Konstruktor der Klasse. So wie in André's Code. (Das ist nicht Best Practice, aber so funktioniert es zumindest).

hatte dann über static ein wenig gelesen und irgendwo stand dann, wann man static braucht und wann nicht. und da las ich raus, dass man es nur dazu braucht, wenn es einmalig für diese klasse verwendbar sien soll... und das war mir irgendiwe nicht so wichtig.
Das hast du entweder falsch gelesen oder es war falsch geschrieben. "Einmalig verwendet" ist nämlich Quatsch. static brauchst du grundsätzlich in der Tat nicht so oft, weil wir mit Java objekt-orientiert programmieren wollen. und static drückt genau das Gegenteil dessen aus, was OOP ausdrückt. Allerdings ist die main-Methode static und das kannst du nicht ändern. Der Unterschied zwischen statischen Dingen und nicht-statischen Dingen ist, dass man letztere nur mit einem Objekt aufrufen kann, und sich diese Dinge dann auf dieses Objekt beziehen. Ersteres heißt: Du brauchst kein Objekt, entsprechend kannst du aber auch keine objekt-bezogenen Dinge machen. Das lässt sich auch nicht in einem Satz erklären, bzw. ich habe grad keine Zeit einen dicken Roman darüber zu schreiben. Informier dich genauer im Internet, auf jeden Fall musst du das verstehen.

Diesen Teil verstehe ich leider gar nicht. Weder warum ein final String args[] steht noch habe ich jemals dieses EventQueue.invokeLater(newRunnable() mal gesehen.
Von dem final lass dich mal nicht verwirren. Das ist egal, du kannst es hinschreiben oder nicht (Natürlich hat es einen Effekt, aber das braucht dich jetzt nicht zu interessieren).
Zu dem Rest: Hier wird eine anonyme Klasse erzeugst. Anonyme Klassen zählen zu den lokalen Klasse (diese wiederum zu den inneren Klassen), und die Syntax dafür sieht eben so aus. In der Tat eine gewöhnungsbedürftige Syntax. Es ist einfach eine Klasse definiert in der main-Methode, und alles was sie definiert ist eine run-Methode, die den Code enthält, der vom besagten EDT ausgeführt werden soll. Auch zu innerer/anonymer Klasse bitte ich dich zu googlen. @Override ist eine "Annotation" -> Google.

Ich weiß viele Fragen, nur ich würde gerne verstehen wie oder was es bewirkt, statt es stumpf zu nutzen.
Ist auch die richtige Einstellung :toll: Aber anfangs muss man sich erstmal paar Grundlagen verschaffen. Wenn ich dir alle Fragen genau hätte beantworten wollen hätte ich jetzt 25 Seiten geschrieben. Bitte such im Inet nach Quellen wo man Java lernen kann (deine Uni-Vorlesung kannst du nämlich wegwerfen, ich kenne solche Dinger zu genüge und von allen die ich kenne ist keine einzige auch nur ein klitzekleines bisschen akzeptabel)

Um's zu Lernen zB:
- Java Video Kurs - Java Video Tutorials - Online Java lernen! (Kostenpflichtig)
- Galileo Computing :: Java ist auch eine Insel - index (Kostenlos)
 
Zuletzt bearbeitet:

NeverGod

Mitglied
Okay, irgendwie finde ich den editier button nicht mehr :(

Habe nun meinen code soweit verarbeitet und mein Fenster ein wenig erweitert. Wenn die die Button kleiner haben will, muss ich sie direkt festlegen, was aber widerum problematisch wird, wenn man die fenstergröße ändert, daher lasse ich davon lieber die finger und die buttons bleiben so groß wie sie sind ;)
Ich habe nun die vignere Verschlüsselung implementiert, da ich diesbezüglich ein wenig nachgeguckt habe und durchaus auch verstanden habe wie es funktioniert. Mein Quelltext kann nun also einen Text verschlüsseln. Beim Entschlüsseln hatte ich es mir leider zu einfach vorgestellt. Dachte ich müsste einfach die zeichen "umkehren" und erhielte dann wider den ursprünglichen Text, klappt nur leider irgendwie nicht. Wäre lieb, wenn ihr mir bei der entschlüsselung helfen könntet. (Habe natürlich auch hierzu viele Codes et cetera gefunden, nur leider nicht nachvollzogen was dort passiert ist)

Java:
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class CaesarVerschluesselung {

	private final JTextField text1, text2, text3;

	public CaesarVerschluesselung() {
		JFrame fenster = new JFrame("CaesarVerschluesselung");
		fenster.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		fenster.setSize(750, 375);
		fenster.setLocationRelativeTo(null);
		// Create GUI elements:
		JPanel p1 = new JPanel();
		JPanel p2 = new JPanel();
		text1 = new JTextField();
		text2 = new JTextField();
		text3 = new JTextField();
		JButton b1 = new JButton("Verschlüsseln");
		JButton b2 = new JButton("Entschlüsseln");
		// Layout:
		p1.setLayout(new GridLayout(1, 0));
		p1.add(new JLabel("Klartext:"));
		p1.add(text1);
		p2.setLayout(p1.getLayout());
		p2.add(new JLabel("Schlüssel:"));
		text3.setForeground(Color.blue);
		p2.add(text2);
		fenster.setLayout(new GridLayout(0, 2));
		fenster.add(p1);
		fenster.add(p2);
		fenster.add(b1);
		fenster.add(b2);
		fenster.add(new JLabel("Geheimtext:"));
		fenster.add(text3);
		fenster.setVisible(true);
		// Install listeners:
		ActionListener actionHandler = new ActionHandler();
		ActionListener actionHandler1 = new ActionHandler1();
		b1.addActionListener(actionHandler);
		b2.addActionListener(actionHandler1);
	}

	public static void main(final String args[]) {
		// GUI must start on EventDispatchThread:
		EventQueue.invokeLater(new Runnable() {

			@Override
			public void run() {
				CaesarVerschluesselung caesarVerschluesselung = new CaesarVerschluesselung();
			}
		});
	}

	private class ActionHandler implements ActionListener {

		@Override
		public void actionPerformed(ActionEvent e) {
			String a = "";
			String b = "";
			a = text1.getText();
			b = text2.getText();
			text3.setText(vigenere(a, b));
		}
	}

	public static String vigenere(String originalText, String schluessel) {
		originalText = originalText.toUpperCase();
		schluessel = schluessel.toUpperCase();
		String geheimText = "";
		for (int i = 0, j = 0; i < originalText.length();i++, j++) {
			// i ist der Zähler für den Originaltext
			// j ist der Zähler für das Schlüsselwort
			if (j == schluessel.length()) {
				j = 0;
			}
			// wenn Schlüsselwort durchlaufen, wieder von vorne im Schlüssel
			geheimText += (char) ((originalText.charAt(i)
					+ schluessel.charAt(j) - 130) % 26 + 65);
		}
		return geheimText;
	}
	
	private class ActionHandler1 implements ActionListener {

		@Override
		public void actionPerformed(ActionEvent e) {
			String a = "";
			String b = "";
			a = text3.getText();
			b = text2.getText();
			text1.setText(vigenereR(a, b));
		}
	}
	
	public static String vigenereR(String geheimText, String schluessel) {
		geheimText = geheimText.toLowerCase();
		schluessel = schluessel.toLowerCase();
		String klaText = "";
		for (int i = 0, j = 0; i < geheimText.length();i++, j++) {
			// i ist der Zähler für den Geheimtext
			// j ist der Zähler für das Schlüsselwort
			if (j == schluessel.length()) {
				j = 0;
			}
			// wenn Schlüsselwort durchlaufen, wieder von vorne im Schlüssel
			klaText += (char) ((geheimText.charAt(i)
					- schluessel.charAt(j) - 130) % 26 + 65);
		}
		return klaText;
	}
}



LG
 
Zuletzt bearbeitet:

hdi

Top Contributor
Bitte genauer. Das ist kein Vignere-Forum ;) Zeig nur den Ausschnitt im Code der für's Verschlüsseln und Entschlüsseln ist, und sag
a) was bei der Entschlüsselung rauskommt
b) was bei der Entschlüsselung rauskommen sollte
 

NeverGod

Mitglied
Bitte genauer. Das ist kein Vignere-Forum ;) Zeig nur den Ausschnitt im Code der für's Verschlüsseln und Entschlüsseln ist, und sag
a) was bei der Entschlüsselung rauskommt
b) was bei der Entschlüsselung rauskommen sollte

Okay sry, wollte den Code nur vollständig mitliefern, damit keine Probleme auftauchen.

Java:
	public static String vigenere(String originalText, String schluessel) {
		originalText = originalText.toUpperCase();
		schluessel = schluessel.toUpperCase();
		String geheimText = "";
		for (int i = 0, j = 0; i < originalText.length();i++, j++) {
			// i ist der Zähler für den Originaltext
			// j ist der Zähler für das Schlüsselwort
			if (j == schluessel.length()) {
				j = 0;
			}
			// wenn Schlüsselwort durchlaufen, wieder von vorne im Schlüssel
			geheimText += (char) ((originalText.charAt(i)
					+ schluessel.charAt(j) - 130) % 26 + 65);
		}
		return geheimText;
	}

klappt wunderbar

Java:
	public static String vigenereR(String geheimText, String schluessel) {
		geheimText = geheimText.toLowerCase();
		schluessel = schluessel.toLowerCase();
		String klaText = "";
		for (int i = 0, j = 0; i < geheimText.length();i++, j++) {
			// i ist der Zähler für den Geheimtext
			// j ist der Zähler für das Schlüsselwort
			if (j == schluessel.length()) {
				j = 0;
			}
			// wenn Schlüsselwort durchlaufen, wieder von vorne im Schlüssel
			klaText += (char) ((geheimText.charAt(i)
					- schluessel.charAt(j) - 130) % 26 + 65);
		}
		return klaText;
	}

klappt leider nicht. Wenn ich als Klartext "Hallo" eingebe, und schlüssel "Licht" kommt als Geheimtext "SINSH" raus. Wenn ich dann auf entschlüsseln drücke kommt aber ".A225" raus.
 

jgh

Top Contributor
also ohne groß nachgedacht und gelesen zu haben, fällt mir folgendes schonmal auf:

Java:
    public static String vigenere(String originalText, String schluessel) {
        originalText = originalText.toUpperCase();
        schluessel = schluessel.toUpperCase();

Java:
  public static String vigenereR(String geheimText, String schluessel) {
        geheimText = geheimText.toLowerCase();
        schluessel = schluessel.toLowerCase();

Einmal upper, einmal lowerCase das dürfte eigentlich nicht passen.
und imho müsste man das reverse auch anderes implementieren. Das was als letztes gemacht wurde, sollte dann als erstes gemacht werden...aber evtl liege ich da auch vollkommen falsch.
 

hdi

Top Contributor
Du hast da nen Denkfehler, so kannst du das nicht zurückführen. Dir muss klar sein dass "geheimText" schon die komplette Verschlüsselung enthält,also inklusive %26 + 65. Entsprechend ist

Java:
geheimText.charAt(i) - schluessel.charAt(j)

irgendein Wert, der so im Prozess der Verschlüsseln nie vorkam. Sorry ich muss jetz weg und kann dir grad nicht mehr helfen, aber so einfach geht das halt nicht.
 

NeverGod

Mitglied
tut mir leid, aber ich verstehe nicht so ganz. wenn ich eine verschlüsselung mache, dann addiere ich zu meinem zeichen den wert des neuen zeichens. wenn ich es entschlüsseln will, dann muss ich vom neuen zeichen doch eigl. nur das zeichen wieder abziehen. warum sollte das nicht gehen?
 

NeverGod

Mitglied
okay das finde ich auch durchaus nachvollziehbar. ich habe mit einem schlüssel meinen klatext verändert. modulo muss ich ja rechnen, da mein zeichen bei y+c zum beispiel nicht mehr im alphabet wäre sondern zeichen danach. Nun muss ich (mathematisch) doch das gleiche machen, nur dass ich beim schlüssel z-(char des schlüsselzeichens) rechne. modulo muss ja auch wieder, da a-x zum beispiel wieder im modulo sein soll. (oder muss ich dann erst den absolutbetrag berechnen?)
und anschließend der klatext wieder aus den zeichen zusmamengesetzt. nur wie kann man das als code implementieren, dachte ich hätte das so gemacht.

Java:
	public static String vigenereR(String geheimText, String schluessel) {
		geheimText = geheimText.toUpperCase();
		schluessel = schluessel.toUpperCase();
		String klaText = "";
		for (int i = 0, j = 0; i < geheimText.length();i++, j++) {
			// i ist der Zähler für den Geheimtext
			// j ist der Zähler für das Schlüsselwort
			if (j == schluessel.length()) {
				j = 0;
			}
			// wenn Schlüsselwort durchlaufen, wieder von vorne im Schlüssel
			klaText += (char) ((geheimText.charAt(i)
					+ ('z' - schluessel.charAt(j)) - 130) % 26 + 65);
		}
		return klaText;
	}

war meine idee, klappt aber nicht
 
Zuletzt bearbeitet:

bERt0r

Top Contributor
Das Problem mit dem Modulo 26 ist, dass "A" bei 65 liegt. Rechnest du jetzt A % 26 kommt 13 raus. Ich weis nicht wie ichs besser ausdrücken soll, aber das impliziert quasi "A" wäre "M".
Machs einfach so:
Java:
char c; //Der zu verschlüsselnde Buchstabe in lowercase
char key; //auch in lowercase
int value=c-"a";
int keyVal=key-"a";
value=(value + keyVal) % 26;
value=value + "a";
char ergebnis=(char)value;
 

NeverGod

Mitglied
**** die henne ich habs :)

ich weiß zwar absolut nicht, was du mir sagen möchtest, weil als ich deinen code eingefügt habe, sprang mein compiler im kreis, man könne keine chars subtrahieren et cetera pp...

Java:
			 help = ((geheimText.charAt(i)
					 - schluessel.charAt(j)) % 26);
			 if (help < 0) {
				 help *= -1;
				 help = 26 - help;
			 }

			// wenn Schlüsselwort durchlaufen, wieder von vorne im Schlüssel
			 klaText += (char) (help + 65);

das war das fehlende stück salz in der suppe. mein text ist anschließend zwar in großbuchstaben nur funktioniert es soweit. bitte bei unsauberem code trotzdem meckern, da ich wie gesagt gerade erst anfange. bei bedarf schick ich auch die ganze methode oder den kompletten code.

falls ihr verbesserungsvorschläge habt, nur raus damit. :)


//edit: war leicht voreilig. es klappt nur bei einem wort bzw. meine satzzeichen werden entweder gelöscht oder durch einen buchstaben ersetzt. jmd eine idee wie man das fixen kann?

Klatext: Hallo wie geht es dir?
Schlüssel: Licht
Geheimtext: SINSH+EKL3RMJA3PA<KBCG
--> entschlüsselt: HALLOTWIETGEHTTESTDIRY
 
Zuletzt bearbeitet:

NeverGod

Mitglied
Sry wegen doppelpost nur meine stunde editierzeit ist gerade verstrichen. war keine absicht.

Java:
			if (geheimText.charAt(i) > 64 && geheimText.charAt(i) < 91) {
				help = ((geheimText.charAt(i) - schluessel.charAt(j)) % 26);
				if (help < 0) {
					help *= -1;
					help = 26 - help;
				}

				// wenn Schlüsselwort durchlaufen, wieder von vorne im Schlüssel
				klaText += (char) (help + 65);
			} else {
				klaText += (char) (geheimText.charAt(i));
			}

habe nun selbst noch verstanden wieso weshalb warum das mit den sonderzeichen war und es gefixt. klappt nun alles. Ich werde mal sehen, ob ich noch die unterscheidung einfüge wegen groß und kleinbuchstaben, aber soweit gefällt es mir, vielen lieben dank an alle.

ps.: das mit dem @Override versteh ich nicht, auch nicht nach lesen einiger abschnitte darüber. fällt also in die kategorie "ishaltso"

In dem Texteingabefeld der GUI, wie kann ich das ändern, dass er endlos weiterschreibt und nicht die nächste Zeile nimmt, wenn er am Rand des Textfeldes ist?
 
Zuletzt bearbeitet:

Ähnliche Java Themen

Neue Themen


Oben