Optische Aufmachung meines Programms

Status
Nicht offen für weitere Antworten.

Hecke

Aktives Mitglied
Hey Leute,
Ich habe für die Schule ein Würfelspiel programmiert - Mir fehlt jetzt nur noch der optische Schnickschnack!
Deswegen fällt dies auch wirklich nicht unter Hausaufgaben, da ich den ganzen funktionellen Teil selbst geschrieben habe und nur Teile des optischen Bestandteils noch fehlen.

Wäre klasse, wenn mir jemand mein Programm "aufmotzen" könnte;)

Links zum Programm:
RapidShare: Easy Filehosting
Java-App.zip
Java-App.zip ... at uploaded.to - Free File Hosting, Free Image Hosting, Free Music Hosting, Free Video Hosting, ...
File-Upload.net - Java-App.zip
MEGAUPLOAD - The leading online storage and file delivery service
Free File Hosting - NetGull

Vielen Dank!
 
Zuletzt bearbeitet:

0x7F800000

Top Contributor
Du hast dein Schulprojekt eben bei 6 verschiedenen filehosts hochgeladen, habe ich das richtig verstanden? :eek:

Das soll irgendwie den Eindruck erwecken, dass du an deinem Problem fleißig gearbeitet hast, odr wie? :autsch:
 

Hecke

Aktives Mitglied
Nein, das sollte eigentlich nur helfen, dass wenn jemand Probleme mit einem bestimmten Filehoster hat, trotzdem durch einen anderen Hoster an mein Programm gelangen kann.

Dennoch danke für deine Antwort und vielen Dank für weitere Hilfe!
 

0x7F800000

Top Contributor
Für jede weitere Hilfe wobei? Beim Träumen, dass jemand "just for fun" dein Schulprojekt für dich fertigschreibt? Ich glaube das ist nicht so wahrscheinlich. Zum einen mögen es die meisten nicht, sich in gruseligen code von irgendwelchen Schülern einzulesen (95% würden den code wohl lieber komplett neuschreiben: nichts für ungut, deinen code hab ich mir nicht angeschaut, der kann auch total toll sein^^).
Zum Anderen hört sich das Thema "Würfelspiel" nicht sonderlich faszinierend an, wenn du hier mit einem Tetrix oder einem Pacman-Klon vorbeikommen würdest, könnte man noch hoffen, dass sich der eine oder der andere einfach so faszinieren lässt, aber bei einem Würfelspiel? Bezweifle ich eher.

Poste einen Ansatz oder Konkrete Fragen, oder erzähl wenigstens, was dir bei der "optischen Aufmachung" so viele Probleme bereitet, vielleicht kann man dir dann wenigstens gezielt Literatur empfehlen.

Oder erzähle wenigstens mal, was du zu dem Thema überhaupt weißt, dann können wir wenigstens mal einschätzen, auf welchem Niveau die Tipps sein sollen...
 

Loki

Aktives Mitglied
Das Layout verursacht Augenkrebs.
Fenster mit roten Hintergrund und komischer Verteilung der Schaltflächen.
 

0x7F800000

Top Contributor
Also, habe mir den code jetzt sogar mal angeschaut...
Die Würfelbecher-Klasse schreibst du bitte mit Arrays und schleifen um, okay?
Sechs mal der selbe Kram an mehreren Stellen, das ist echt nicht so schön.

Ansonsten verstehe ich nicht, warum du gemeint hast dass der optische Schnickschnack fehlen würde, da ist doch schon diese "Oberfläche"-Klasse und anscheinend macht sie sogar irgendwas halbwegs sinnvolles, da ist jedenfalls menge code drin...

Was konkret willst du denn daran verändern / hinzufügen bzw "aufmotzen"?
Chromfelgen und fette Stereoanlage oder wie? ???:L
 

0x7F800000

Top Contributor
Hmmm, nnaja, das ist jetzt fast schon geschmackssache^^
Rote Farbe ist echt ein wenig ätzend, aber ansonsten erfüllt es ja einigermaßen den Zweck...

Über das design will ich mich da jetzt nicht streiten, dazu werden irgendwelche design-spezialisten mehr zu sagen haben, aber im Programm sollte man sicherlich keine setBounds-verwenden, das überlässt man lieber einem LayoutManager.
 

Hecke

Aktives Mitglied
Danke,
Wie bekomme ich denn das Fenster, in dem das Programm gestartet wrid, kleiner?

Da könnte ja rechts gut die Hälfte weg.

Vielen Dank!
 

Lexi

Bekanntes Mitglied
setSize() am Frame aufrufen.

Bei dir ist das in der Klasse Starter. Dort in der Main-Methode rufst du wnd.setSize(breite,höhe) auf. Du muss einfach den ersten Parameter kleiner machen.
 
Zuletzt bearbeitet:

Hecke

Aktives Mitglied
Danke, das hat schonmal geklappt!

Wie bekomme ich denn jetzt in das "Ergebnis"-Feld das Ergebnis rein? Bis jetzt steht da ja zunächst nur der Text "Ergebnis".

Vielen vielen Dank!
 

Lexi

Bekanntes Mitglied
JTextField.setText(String text)
___

EDIT :
Wenn du die ContentPane einmal in einer Objektvariablen speicherst, sparst du dir die Mühe andauernd this.getContentPane() aufrufen zu mussen. Die Variable muss vom Typ Container sein.
 
Zuletzt bearbeitet:

Hecke

Aktives Mitglied
Danke, aber das verstehe ich nicht:
Wo genau muss das rein? Wenn ich das in die Klasse "Starter" einfüge, dann steht da nur "Ergebnis" drin.
 

Lexi

Bekanntes Mitglied
Das muss in die actionPerformed Methode in deiner Oberfläche Klasse rein.
Ich sehe gerade, dass der Befehl dort auch schon auskommentiert drinsteht.
 

Hecke

Aktives Mitglied
Jetzt kommt:

Code:
--------------------Configuration: <Default>--------------------
surface.java:78: cannot find symbol
symbol  : variable Result
location: class java.lang.String
      JTextField.setText(String.Result);
                               ^
surface.java:78: non-static method setText(java.lang.String) cannot be referenced from a static context
      JTextField.setText(String.Result);
                ^
Oberflaeche.java:81: non-static variable XXX cannot be referenced from a static context
      result.setText(""+ Spiel.XXX.points());
                              ^
surface.java:81: cannot find symbol
symbol  : method Points()
location: class Spieler
      result.setText(""+ Spiel.XXX.points());
                                      ^
4 errors

Process completed.


Vielen Dank!
 
Zuletzt bearbeitet:

Lexi

Bekanntes Mitglied
Kannst du den Code Ausschnitt, von der actionPerformed Methode einmal posten ?

Wenn du result.setText(""+Spiel.Florian.Punkte) aufrufst , versucht dein Programm auf die Variable "Punkte" zuzugreifen, die es aber in der Klasse "Spieler" garnicht gibt. Wenn du aus "punkte" zugreifst sollte es gehen.

Edit: Spiel ist in deinem Fall kein Objekt sondern die Klasse. Da die Feldvariablen nicht als static deklariert sind, kannst du dort nur auf Feldvariablen oder Methoden zugreifen, wenn du vorher ein Objekt erstellt hast.

Das hast du auch gemacht, nur heißt dein Objekt "spiel" und nicht "Spiel". Demzufolge musst du dann spiel.Florian.punkte aufrufen

Das ist aber auch eher unschön, eigentlich deklariert man Klassenvariablen immer private und erstellt dann je nach Verwendungszweck Getter und/oder Setter.

Code:
//....

private int punkte;

//...

public int getPunkte()
{
    return punkte;
}

public void setPunkte(int punkte)
{
    this.punkte = punkte;
}
 
Zuletzt bearbeitet:

Hecke

Aktives Mitglied
Code:
public void actionPerformed(ActionEvent event)   
  { 
    String cmd = event.getActionCommand();
    if (cmd.equals("RollADice"))
    { 
       int helpnumber=0;
      while (helpnumber<5)
      {game.yyy.becher.mixen();
       game.xxx.becher.mixen();
      punkte1.setText(""+ spiel.Dennis.becher.lieferPunkte());
      punkte2.setText(""+ spiel.Florian.becher.lieferPunkte());
      helpnumber++;
      JTextField.setText(String.Text);
      }

      result.setText(""+ Spiel.Florian.points());



    }
    else if(cmd.equals("Reset"))
    {
          punkte1.setText("");
          punkte2.setText("");
          spiel.reset();
          result.setText("");
    }
    
    else if (cmd.equals("Exit"))
    { 
        setVisible(false);
        dispose();
        System.exit(0);
    }
  }
}

Vielen Dank!
 
Zuletzt bearbeitet:

Lexi

Bekanntes Mitglied
Code:
JTextField.setText(String.Text);

das geht natürlich nicht ^^

Du musst schon ein konkretes Objekt nehmen und darauf dann Methoden aufrufen.

result ( Ist ein Objekt von der Klasse JTextField )
setText ( ist eine Methode die sich in der Klasse JTextField befindet )
String text ( damit meine ich einfach nur, dass die Methode einen Parameter vom Typ String erwartet )

so...

Code:
result.setText("Hier kommt der Text rein den du in das JTextField  result reinscheiben möchtest");
 

Hecke

Aktives Mitglied
Danke und Sorry, mir raucht der Kopf gerade - Bin den ganzen Tag am Programmieren, da ich morgen abgeben muss.:(

Jetzt weiß ich noch nicht mal mehr, was in das Feld "Ergebnis" eigentlich rein soll....;(
 
Zuletzt bearbeitet:

0x7F800000

Top Contributor
wüsste nicht, dass es direkt geht (zB ist unklar, wo das bild dann eigentlich hin soll, wenn es nicht groß genug ist usw...)
Ich würde spontan folgendes vorschlagen: überschreibe einfach die paintComponent-methode des JPanels, der die ganzen anderen elemente beinhaltet:
Code:
		myJFrame.setContentPane(new JPanel(){
			Image img;
			{
				try{
					img=ImageIO.read(new URL("http://upload.wikimedia.org/wikipedia/commons/6/6a/Dice.jpg"));
				}catch(IOException e){
					e.printStackTrace();
				}
			}
			@Override
			public void paintComponent(Graphics g){
				super.paintComponent(g);
				if(img!=null){
					g.drawImage(img,0,0,this.getWidth(),this.getHeight(),this);
				}
				g.setColor(new Color(10,50,10,200));
				g.fillRect(0,0,this.getWidth(),this.getHeight());
			}
		});
und schon ist ein hübsches eingeblendetes bild im Hintergrund zu sehen...

Du brauchst packages java.awt.*; und java.net.*;
 

0x7F800000

Top Contributor
Danke und Sorry, mir raucht der Kopf gerade - Bin den ganzen Tag am Programmieren, da ich morgen abgeben muss.:(
Geschieht dir zurecht. Aber sieh es mal positiv: Je schmerzhafter es jetzt ist, desto kleiner ist die wahrschinlichkeit, dass du nächstes Mal umfangreichere aufgaben wieder auf den letzten Moment verschiebst ;)
 

Hecke

Aktives Mitglied
Vielen Dank!

Also der Code der Klasse "Surface" sieht jetzt so aus:
Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*; 
import java.net.*;

public class Oberflaeche extends JFrame implements ActionListener
{  
   Color myColor = new Color (205,0,0);
  private JTextField result,points1,points2;
  private Game game = new Game();
                  
  public Surface()
  { 
    super("Dice-Game");
   
    		myJFrame.setContentPane(new JPanel(){
			Image img;
			{
				try{
					img=ImageIO.read(new URL("//URL-of-Image"));
				}catch(IOException e){
					e.printStackTrace();
				}
			}
			@Override
			public void paintComponent(Graphics g){
				super.paintComponent(g);
				if(img!=null){
					g.drawImage(img,0,0,this.getWidth(),this.getHeight(),this);
				}
				g.setColor(new Color(10,50,10,200));
				g.fillRect(0,0,this.getWidth(),this.getHeight());
			}
		});
    
    this.getContentPane().setBackground(myColor);
    this.getContentPane().setLayout(null);

    punkte1 = new JTextField();
    punkte1.setBounds(130,20,60,25);
    this.getContentPane().add(points1);
    
    punkte2= new JTextField();
    punkte2.setBounds(330,20,60,25);
    this.getContentPane().add(points2);


    
    result=new JTextField("Result");
    result.setBounds(71,125,279,30);
    this.getContentPane().add(result);

    JLabel punktestand1 = new JLabel ("Punkte XXX");
    pointsMoment1.setBounds(25,25,110,15);
    this.getContentPane().add(pointsMoment1);
    
    JLabel pointsMoment2 = new JLabel ("Punkte YYY");
    pointsMoment2.setBounds(225,25,110,15);
    this.getContentPane().add(pointsMoment2);
    
     
   

    JButton RollDice= new JButton ("RollDice");
    RollDice.setBounds (71,165,130,30);
    this.getContentPane().add(RollDice);
    RollDice.addActionListener(this);
    

    JButton Reset = new JButton ("Reset");
    Reset.setBounds (220,165,130,30);
    this.getContentPane().add(Reset);
    Reset.addActionListener(this);
    
    
    JButton Exit = new JButton ("Out");
    Out.setBounds (250,300,130,30);
    this.getContentPane().add(Out);
    Out.addActionListener(this);
    
        result=new JTextField("Result");
    result.setBounds(71,125,279,30);
    this.getContentPane().add(result);

        
  }
  
  public void actionPerformed(ActionEvent event)   
  { 
    String cmd = event.getActionCommand();
    if (cmd.equals("RollDice"))
    { 
       int helpnumber=0;
      while (helpnumber<5)
      {game.XXX.becher.mix();
       game.YYY.becher.mix();
      points1.setText(""+ spiel.XXX.becher.getPoints());
      points2.setText(""+ spiel.YYY.becher.getPoints());
      helpnumber++;
      }
 
Zuletzt bearbeitet:

Hecke

Aktives Mitglied
Ich google bestimmt schon seit 2h wegen des Hintergrundbildes:(

Wie mache ich das mit den Packages?

Danke:)
 

0x7F800000

Top Contributor
Haha, meine eigene satirische aussage hat sich eben auf eine äußerst witzige weise bestätigt: ich hab dir versehentlich was falsches erzählt^^
Es wird javax.imageio.*; gebraucht, neben java.io.*; :D
Also echt: frag doch google oder IDE, die wissen's echt besser^^

Also:
import javax.imageio.*;
import java.net.*; (falls du das bild aus dem internet holen willst, bzw um mein beispiel zum laufen zu bringen)
[edit: hoppla, schon wieder vertippt, kein x^^]
import java.io.*;
 
Zuletzt bearbeitet von einem Moderator:

0x7F800000

Top Contributor
wo was einzufügen ist? die import-anweisungen? ganz oben, gleich nah der package-deklaration, wie immer...
 

0x7F800000

Top Contributor
aus deinem code da oben muss natürlich mein example-mäßiges "myJframe" weg, deine "Oberfläche" IST ja das angezeigte JFrame, also kannst du da direkt
[HIGHLIGHT="Java"]
class GUI extends JFrame and some other shit{
public GUI(){ //konstruktor
super("Fenstername");
setContentPane( //hier kommt mein ganzer anderer code rein
...
);

... //das ganze andere zeug, was vorher schon da stand
}
}
[/HIGHLIGHT]
hinschreiben. Ein bisschen mitdenken schadet auch nicht, wenn du irgendwelchen undefinierten "myJFrame"-krempel verwendest, brauchst du dich nicht zu wundern, dass der compiler flammen spuckt^^
 
Zuletzt bearbeitet von einem Moderator:

Hecke

Aktives Mitglied
[HIGHLIGHT="Java"]
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.imageio.*;
import java.net.*;
import java.io.*;

public class aurface extends JFrame implements ActionListener
{
Color my Color = new Color (205,0,0);
private JTextField result,points1,ponits2;
private game game = new game();

public surface()
{ //Image einfügen, wie du beschrieben hast

punkte1 = new JTextField();
punkte1.setBounds(130,20,60,25);
this.getContentPane().add(points1);

punkte2= new JTextField();
punkte2.setBounds(330,20,60,25);
this.getContentPane().add(points2);



result=new JTextField("Result");
result.setBounds(71,125,279,30);
this.getContentPane().add(result);

JLabel punktestand1 = new JLabel ("Points XXX");
punktestand1.setBounds(25,25,110,15);
this.getContentPane().add(points1);

JLabel punktestand2 = new JLabel ("Points YYY");
punktestand2.setBounds(225,25,110,15);
this.getContentPane().add(points2);



Buttons usw....[/HIGHLIGHT]
 
Zuletzt bearbeitet von einem Moderator:

Hecke

Aktives Mitglied
Ich liebe Dich!
Du bist so genial!

Ich hab anstatt "set" "get" geschrieben.
Jetzt funktioniert es erstmal....Vielen vielen Dank!

EDIT:
Nur was mache ich mit dem Feld "Ergebnis"?
Das hat der Lehrer so vorgegeben...

Danach gebe ich Ruhe;)
 
Zuletzt bearbeitet:

0x7F800000

Top Contributor
Ich liebe Dich!
Du bist so genial!
juhu, meine fangemeinde wächst und gedeiht^^
Nur was mache ich mit dem Feld "Ergebnis"?
Das hat der Lehrer so vorgegeben...
Keine Ahnung, kommt drauf an, was du damit machen willst, bzw was dein Lehrer dir befohlen hat... Was soll denn da rein? Du solltest es jedenfalls bei jedem Aufruf von actionPerformed() irgendwie sinnvoll manipulieren...

[hinweis für die restliche Weltbevölkerung: sowas sollte man natürlich nicht machen, aber MVC lassen wir einfachheitshalber mal draußen^^]
 
Zuletzt bearbeitet von einem Moderator:

0x7F800000

Top Contributor
Ja, toll... Fällt dir denn Irgendetwas sinnvolles zum thema "ergebnis eines Würfelspiels" ein? Vielleicht solltest du da einfach nur
"Noob1 hat gewonnen" oder "Noob2 hat gewonnen" oder "Beide Noobs sind noobs"
reinschreiben, je nach dem welcher spieler mehr Punkte hat? Das wäre imho noch einigermaßen sinnvolle Interpretation...

edit: okay, mein Tipp kam ein paar sekunden zu spät^^

Das kriegst du ja wohl noch hin, hoffe ich mal?
 
Zuletzt bearbeitet von einem Moderator:

Hecke

Aktives Mitglied
EDIT:
Dann bin ich direkt ehrlich:
Nein, das bekomme ich nicht hin:(

Wenn du möchtest, bezahle ich dich für deine Hilfe!
 

0x7F800000

Top Contributor
wunderbar, dann rufst du diese merkwürdige "Spielablauf"-methode auf, packst das ergebnis in das ergebnisfeld, und freust dich.
 

Hecke

Aktives Mitglied
Freue mich gerade, dass ich es alleine geschafft habe, die Schriftfarbe der jLabel zu ändern.

Ich glaube, das ist dann schon wieder zu hoch für mich.:(

Dafür hatte ich doch das:
[HIGHLIGHT="Java"]
Ablauf des Spieles
[/HIGHLIGHT]
 
Zuletzt bearbeitet:

Hecke

Aktives Mitglied
Es passiert ja nichts.

Es steht nur "Ergebnis" da.;)

EDIT: Und ich glaube ein Unentschieden habe ich auch nicht berücksichtigt.:(
 

0x7F800000

Top Contributor
solange du mit result.setText(String s) nichts anderes dahinschreibst, wird da selbstverständlich auch nichts anderes stehen...
 

Hecke

Aktives Mitglied
Ich glaube, du bist zu schlau für mich. Wärst du so nett und präzisiert das noch ein Bisschen?

Alleine kann ich das nicht:(

Ich bin dir sooo dankbar!
 
Zuletzt bearbeitet:

0x7F800000

Top Contributor
Wozu hast du da oben irgendwo ein Spiel-Objekt erzeugt?
-> Um Spielzustand zu speichern
Was soll beim Aufruf von actionPerformed passieren?
-> Spielzustand soll verändert werden
Was soll am ende des Spiels passieren?
-> Du fragst deine Spiel-Klasse wer denn nun gewonnen hat, und setzt den inhalt des "result"-Textfeldes auf das entsprechende zurückgelieferte Ergebnis.

Wie sieht es momentan aus?
-> Oberfläche hat mit dem spiel.Objekt anscheinend nichts zu tun.

Korrekturmaßnahmen?
-> Siehe zu, dass der Speilzustand bei jedem actionPerformed-Aufruf korrekt verändert wird, gib das ergebnis im result-textfeld aus.

Trink 'n kaffee, überlege ruhig was du schreiben willst, und schreib's einfach hin. Google hilft da jetzt nicht weiter, ich helfe da nur bedingt, weil ich zwar einigermaßen brauchbare ratschläge gebe, aber momentan akkut keinen code schreiben will^^

Vielleicht um deine gedanken etwas zu ordnen, 2Fragen:
1) welche methoden stellt die spiel-klasse bereit?
2) bei welchen ereignissen sollte was aufgerufen werden?

Die Antworten würden mich auch mal interessieren, weil ich bei deinem code nicht so wirklich durchblicke^^

Ich bin dir sooo dankbar!
iss gut, sieh lieber zu dass du dein programm zum laufen kriegst^^
 

Hecke

Aktives Mitglied
Morgen um 6 Uhr aufstehen - Viel Spaß wünsche ich mir.:)

EDIT: Das wird wohl gar nix...:(
 
Zuletzt bearbeitet:

Hecke

Aktives Mitglied
Wenn ich das in der Klasse "Oberfläche" habe:
[HIGHLIGHT="Java"]
result.setText(""+ Spiel.YYY.Punkte());[/HIGHLIGHT]

kommt der Fehler

Wenn das:
[HIGHLIGHT="Java"]
result.setText(""+ Spiel.YYY.Punkte());[/HIGHLIGHT]
auskommentiert ist, läuft das Programm prinzipiell...
 
Zuletzt bearbeitet:

0x7F800000

Top Contributor
och, das passt schon, solange man nicht 3 tage zusammenkleben muss, geht das einigermaßen...

Die Seals müssen am Stück 48 Stunden lang im Dreck rumkriechen, tauchen, sprengsätze entschärfen, und gezielt rumballern können... Da ist doch eine Informatikhausaufgabe im Vergleich dazu relativ harmlos. ;) Außerdem bist du selbst schuld dran. Das kenn ich zu gut^^

Bzgl des Fehlers:
's' != 'S'

Und überhaupt: bist du dir sicher, dass du nicht zu früh mit der Gui angefangen hast? Deine Spiel-Klasse scheint irgendwelchen mist zu machen, schaue es dir nochmal genauer an, schmeiß die hälfte weg, und schreib wirklich nur das rein, was gebraucht wird.
Gab es nicht irgendwelche vorgaben an die Klasse?
 
Zuletzt bearbeitet von einem Moderator:
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben