Swing Dezimal in Binärumwandler

Alex2013

Bekanntes Mitglied
Hallo Leute,

ich wollte mal einen grafischen Dezimalzahl in Binärzahl umwandler schreiben. Leider klappt es noch nicht so wie ich es möchte.
Ich möchte erreichen, dass ich in einem linken Textfeld eine Dezimalzahl eingebe, dann auf den Button umwandeln klicke und mir im rechten Textfeld die Zahl in binärer Schreibweise angezeigt wird.
Hat jemand einen Tipp, wie ich meinen Code bzw. das ganze Programm verbessern kann?

Hier der Code:

Java:
[code]


import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTextField;

public class Binaerumwandler2_grafisch extends JFrame
{
		JTextField tf1,tf2;
		JButton b1;
		private static final long serialVersionUID = 1L;
		
		public Binaerumwandler2_grafisch(String titel)
		{
			setSize(400,300);
			setLocation(500,300);
			setLayout(new FlowLayout());
			setVisible(true);
			setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			add(tf1=new JTextField("Dezimalzahl"));
			add(b1=new JButton("umwandeln"));
			add(tf2=new JTextField("Ergebnis"));
			b1.addActionListener(a);
			ActionListener a=new ActionListener() 
			{
				@Override
				public void actionPerformed(ActionEvent arg0) 
				{
					if(arg0.getActionCommand().equals(b1))
					{
						String eingabe;
						eingabe = JOptionPane.showInputDialog(null,"Geben Sie eine  ganze Zahl ein, die umgewandelt werden soll.");
						int zahl = Integer.parseInt(eingabe);
						JTextField eingabe1=tf1;
						String binaer = ""; 
						int rest;
						
						int b[][][]=new int[9][9][9];
						for(int i=0;i<b.length;i++)
						{
							for(int j=0;j<b.length;j++)
							{
								for(int k=0;k<b.length;k++)
								{
									int b1=i*j*k;
									String b2=toString();
									System.out.println(tf1.getText());
								}
							}
						}
						do
						{	//der rest der zahl ist ist zahl modulo 2
							rest = (int) (((zahl % 2)*100)/100.);
							//anschließend wird die zahl durch 2 geteilt und dem integer zugewiesen
							zahl = zahl / 2;
								
							//Zusammensetzung des Strings zur Binaerdarstellung
							binaer = rest + binaer;
						}//solange wie die zahl größer 0 ist
						while(zahl > 0);
							
						System.out.println("Die ganze Zahl "+eingabe+" hat die binaere Darstellung "+binaer+".");
						System.exit( 0 );
					}
					System.out.println("Fehler!");
				}
			};
		}
			
		public static void main (String args[])
		{	
			new Binaerumwandler2_grafisch("Binärumwandler 2 grafisch");
		}
	}
[/code]
 

butterbemme

Gesperrter Benutzer
Ich hab einen Tipp für dich: Du könntest erstmal beschreiben wo genau dein Problem im Code liegt.
Sonst muss sich jeder von oben bis unten durch deinen Code durcharbeiten.
Und mit der Fehlerbeschreibung " Leider klappt es noch nicht so wie ich es möchte." kann man auch nix anfangen. Vllt kompiliert der Code, aber du bist mit dem Layout nicht zufrieden. Dann muss man schon mal nicht den Code durchgehen um einen Fehler zu finden
 

Alex2013

Bekanntes Mitglied
Also wenn ich die Zeilen 29 -73 ausklammere, dann kompiliert das Programm und es erscheint das Fenster mit den zwei Textfeldern und dem Button in der Mitte.
Nun wollte ich die Rechenoperationen etc. alles in den Button selbst hineinschreiben um direkt bei betätigen des Knopfes die Berechnungen ausführen und anzeigen zu lassen, aber da hapert es noch.
Soll heißen, wenn ich das Programm von Zeile 29-73 nicht auskomentiere läuft es nicht durch.
Hast du vlt. eine Idee, wo ich die Rechenoperation hinverlegen kann? Vlt. doch eher außerhalb des Buttons?
Außerdem wollte ich mit den for Schleifen und dem Array, jede Ziffer die ich eintippe einzeln abspeichern um sie anschließend wieder auszugeben (umgewandelt).
Falls du einen besseren Ansatz siehst, kannst du ihn mir gerne mitteilen, dann versuche ich es anders :)

Lg
 

butterbemme

Gesperrter Benutzer
Hm, also wirklich hilfreich ist deine Antwort wo es hapert auch nicht. Du sagst wenn du von Zeile 29 bis 73 auskommentierst funktioniert alles. Wundert dich das?? In diesen Zeilen, die übrigens den Großteil deines Quellcodes ausmachen, befindet sich auch die ganze Logik für Berechnungen.

Wieso kommentierst du nicht nach und nach von oben nach unten einzelne Zeilen wieder ein um das REsultat zu überprüfen, wenn alles funktioniert, kannst du die nächste Zeile einkommentieren. Irgendwo passts dann nicht mehr und du weißt an welchem Befehl das liegt und kannst dich schlau machen...

Da seit das Forum wieder on ist geposteter Quellcode fehlerhaft angezeigt wird und vor allem deine FEhlerbeschreibung im Prinzip immer noch plump "Es geht nicht, helft mir" lautet, habe ich keine Lust mit da reinzudenken.

Zum Thema wo der Code stehen sollte.
Ich würd dir zu sowas raten:
Java:
class DeineKlasse extends JFrame implements ActionListener{
   ...
   public DeineKlasse(){
      ...
      button.addActionListener(this);
      ...
   }

   public void actionPerformed(ActionEvent e){
      //hier der Code der ausgeführt werden soll, wenn der Button gedrückt wurde
   }

Da der Code der in die actionPerformed reinkommt doch etwas länger ausfällt, würd ich den ActionListener so umsetzen.
Wiederkehrende Codestücke kannst du nochmal in eigene Funktionen auslagern
 

Alex2013

Bekanntes Mitglied
Ich glaube ich stehe gerade auf dem Schlauch... :-(

Ich habe das Programm jetzt einmal so umgeformt.
Das mit dem Zeilenweisen einkommentieren, werde ich später noch probieren. Ich wäre aber jetzt auch schon für Hilfe dankbar :)

Java:
[code]

import java.awt.Component;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTextField;

public class Binaerumwandler2_grafisch extends JFrame implements ActionListener
{
		JTextField tf1,tf2;
		JButton b1;
		private static final long serialVersionUID = 1L;
		
		public Binaerumwandler2_grafisch(String titel)
		{	//aufruf des Fenster mit den Komponenten
			setSize(400,300);
			setLocation(500,300);
			setLayout(new FlowLayout());
			setVisible(true);
			setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			add(tf1=new JTextField("Dez"));
			add(b1=new JButton("umwandeln"));
			add(tf2=new JTextField("      "));
			b1.add(ActionListener(this));
		}
		//der Button und was er machen soll
		String eingabe="";
		tf1.setText(eingabe);//tDialog(null,"Geben Sie eine ganze Zahl ein, die umgewandelt werden soll."));
		int zahl = Integer.parseInt(tf1.getText());//eingabe);
		
		@Override
		public void actionPerformed(ActionEvent e) 
		{
			if(e.equals(b1))
			{
				//Initialisierung
				String binaer = ""; 
				int rest;
				//tue
				do
				{	//der rest der zahl ist ist zahl modulo 2
				rest = (int) (((zahl % 2)*100)/100.);
				//anschließend wird die zahl durch 2 geteilt und dem integer zugewiesen
				zahl = zahl / 2;
					
				//Zusammensetzung des Strings zur Binaerdarstellung
				binaer = rest + binaer;
				}//solange wie die zahl größer 0 ist
				while(zahl > 0);
			}
		}
				
		private String toString(String binaer) 
		{
			return null;
		}
		private Component ActionListener(Binaerumwandler2_grafisch binaerumwandler2_grafisch) 
		{
			String binaer = null;
			tf2.setText(binaer);
			return null;
		}
		public static void main (String args[])
		{	
			new Binaerumwandler2_grafisch("Binärumwandler 2 grafisch");
		}
	}
[/code]
 

butterbemme

Gesperrter Benutzer
Was genau heißt "Ich glaube ich stehe gerade auf dem Schlauch... " ?

Noch ein paar Hinweise:
-setVisible() immer granz zum Schluss im Konstruktor aufrufen, da es sonst zu seltsamen Darstellungseffekten kommen kann (Komponente(n) wird nicht gezichnet...)
-Das was du in Zeile 34 versuchst, muss in actionPerformed() rein. Das ist doch das Auslesen der eingegebenen Dezimalzahl. Das muss jedes Mal wenn der Button gedrückt wird ausgeführt werden.
- du hast meinen Hinweis von oben nicht richtig gelesen
Java:
b1.add(ActionListener(this));
...
 private Component ActionListener(Binaerumwandler2_grafisch binaerumwandler2_grafisch)
        {
            String binaer = null;
            tf2.setText(binaer);
            return null;
        }
zu sowas hab ich dir jedenfalls nicht geraten.

Mir scheint, dass du noch erhebliche Schwierigkeiten im Umgang mit GUIs hast. Deswegen rate ich dir dich erstmal da nochmal schlau zu machen
 

Alex2013

Bekanntes Mitglied
Auf dem Schlauch stehen, sollte in der Hinsicht aussagen. Dass ich es versucht habe logisch nachzuvollziehen, anschließend die Methoden mit Code gefüllt habe, da aber anschließend nichts vernünftiges bei rum kam, habe ich versucht, den Code zu verschieben.
Das hat aber leider alles nichts gebracht.
Ich werde mich also wohl noch mal etwas intensiver mit der Grafikprogrammierung beschäftigen und falls ich noch immer keine Lösung habe, noch einmal hier den Code reinstellen.
Bis hierhin aber vielen Dank für deine Hilfe.

Lg
 

Alex2013

Bekanntes Mitglied
Ich habe die letzten drei Monaten durch die Arbeit eine kleine Pause in der Programmierung eingelegt.
Heute Abend habe ich mich aber noch einmal dem Dezimal in Binärumwandler Projekt gewidmet.
Ich habe den Code mal etwas angepasst und umgeformt.

Kann mir evtl.jemand sagen oder einen Tipp geben was ich noch falsch gemacht habe?
im linken Textfeld möchte ich die dezimalzahl eingeben dann möchte ich auf den button "umwandeln" klicken und anschließend soll mir das zweite textfeld die binäre Form der Zahl anzeigen.

Hier der Code:

Java:
[code]

import java.awt.Component;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;

public class Binaerumwandler2_grafisch extends JFrame implements ActionListener
{
		JTextField tf1,tf2;
		JButton b1;
		private static final long serialVersionUID = 1L;
		
		public Binaerumwandler2_grafisch(String titel)
		{	
			setSize(400,300);
			setLocation(500,300);
			setLayout(new FlowLayout());
			setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			add(tf1=new JTextField("Dez"));
			add(b1=new JButton("umwandeln"));
			add(tf2=new JTextField("      "));
			b1.add(ActionListener(this));
			setVisible(true);
		}
	
		public String berechnung(int zahl)
		{
			String binaer = ""; 
			int rest;
			zahl = Integer.parseInt(tf1.getText());

			do
			{	
			rest = (int) (((zahl % 2)*100)/100.);
			zahl = zahl / 2;
				
			binaer = rest + binaer;
			}
			while(zahl > 0);
			return binaer;
		}
		
		@Override
		public void actionPerformed(ActionEvent e) 
		{
				if(e.getActionCommand().equals("umwandlen"))
				{
					int zahl = 0;
					tf2.setText(berechnung(zahl));
				}
		}
			
		private Component ActionListener(Binaerumwandler2_grafisch binaerumwandler2_grafisch) 
		{
			@SuppressWarnings("unused")
			String binaer = null;
			tf2.setText(getTitle());
			return null;
		}
		public static void main (String args[])
		{	
			new Binaerumwandler2_grafisch("Binärumwandler 2 grafisch");
		}
	}
[/code]

In der Fehlerausgabe zeigt er mir an, dass der Compiler offenbar mit den Zeilen 26 und 66
ein Problem hat.
Also zum einen die Zeile in der ich dem Button den ActionListener anhänge und zum anderen den Konstruktor, den ich in der main Methode aufrufe.

Kann mir da evtl. jemand helfen?

Lg
 

DrZoidberg

Top Contributor
Da waren mehrere Fehler drin. Versuch mal den Code.
Java:
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.JLabel;
 
public class Binaerumwandler2_grafisch extends JFrame implements ActionListener
{
    JTextField tf1,tf2;
    JButton b1;
    private static final long serialVersionUID = 1L;
    
    public Binaerumwandler2_grafisch(String titel)
    {   
        setSize(500,300);
        setLocation(500,300);
        setLayout(new FlowLayout());
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        add(new JLabel("Dez:"));
        add(tf1=new JTextField(10));
        add(b1=new JButton("umwandeln"));
        add(new JLabel("Bin:"));
        add(tf2=new JTextField(10));
        b1.addActionListener(this);
        setVisible(true);
    }

    public String berechnung(int zahl)
    {
        String binaer = ""; 
        while(zahl > 0) {
            int rest = zahl%2;
            zahl = zahl/2;
            binaer = rest + binaer;
        }
        return binaer;
    }
    
    @Override
    public void actionPerformed(ActionEvent e) 
    {
            if(e.getActionCommand().equals("umwandeln"))
            {
                int zahl = Integer.parseInt(tf1.getText());
                tf2.setText(berechnung(zahl));
            }
    }
    
    public static void main (String args[])
    {   
        new Binaerumwandler2_grafisch("Binärumwandler 2 grafisch");
    }
}
 

Alex2013

Bekanntes Mitglied
Super! :)
Ich danke dir vielmals!

Der funktioniert exakt so wie ich es wollte.
Wo waren denn genau meine Fehler? Ich möchte mich ja verbessern und lernen...
Ich habe nur keine Fehler mehr gesehen. Es wäre super wenn du mir die anhand der Zeilennummer sagen könntest und beschreiben könntest, was genau ich falsch gemacht habe, damit ich das beim nächsten Mal nicht wiederhole.

Aber für die Fehlerlösung: Besten Dank :)
 

DrZoidberg

Top Contributor
Also,
In Zeile 24 steht bei dir "new JLabel("Dez:")". Das Dez: wird dann aber im Textfeld angezeigt.
Es ist sinnvoller dafür ein JLabel zu verwenden. Ausserdem kannst du die Grösse des Textfeldes bestimmen z.B. mit "new JTextField(10)".

Deine Methode "private Component ActionListener" macht keinen Sinn. Und sie macht im übrigen auch gar nichts.
Dein Binaerumwandler2_grafisch Objekt ist schon ein ActionListener, du musst es lediglich an die addActionListener Methode übergeben.

Wieso übergibst du die Zahl an die "berechnung" Methode und in der Methode liest du sie noch einmal aus dem Textfeld aus. Eins von beiden reicht da aus.
Und zahl*100/100 ist gleich zahl, die 100 kann man sich sparen.
Und wieso übergibst du eine 0 an "berechnung" in Zeile 54? Methodenargumente, die immer gleich sind, sind sinnlos.
 

Alex2013

Bekanntes Mitglied
Ok, danke. Deine Tipps habe ich verstanden. :)

ja die private Component methode hätte ich ausklammern können, habe ich aber nicht gemacht. Ich dachte mir da wohl, das ich da später noch mal etwas ändere...

Nun bei der übergebenen Zahl habe ich gedacht, das ich sie zum einen übergeben muss, aber dann auch angeben muss woher sie kommt. Was natürlich im Nachhinein gesehen quatscht ist, da hast du recht. Ich weiß nicht wieso ich das gemacht habe. Da war ich wohl etwas müde... aber so könnte ich mir das Verhalten erklären.

Mit der Berechnung zahl*100/100 wollte ich erreichen, dass nur 2 Nachkommastellen angezeigt werden. Allerdings habe ich hier vergessen, den Punkt zu setzen.

Und ja wegen Zeile 54..., die Return anweisung sollte zum einen schriftlich vorhanden sein und zum anderen auch etwas zurückgeben, dass in diesem fall nicht null ist.

Wenn ich jetzt so drüberschaue hätte ich drei Fehler erkennen (können).
Aber den Tipp mit dem Festlegen der JLabel Größe kannte ich so noch nicht.
Das einfache anhängen der ActionListener Methode hätte ich wahrscheinlich auch noch lange übersehen...
Also danke für die Tipps :)
 

Ähnliche Java Themen

Neue Themen


Oben