Eclipse -> Window Builder

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Eclipse → Window Builder
Hallo Leute,

ich gehöre zu den Glücklichen, die sich in diesem Semester mit Algorithmen und Datanstrukturen rumschlagen. Jetzt wollte ich mal mit Window Builder für Eclipse ein Programm mit eigenem GUI basteln. Soll was ganz einfaches sein:

Ein Spiel, bei dem sich der PC eine Zahl zwischen 0 und 99 aussucht, und man 5 versuche hat, diese zu erraten. liegt man daneben, erhält man jeweils die information, ob die eingegebene Zahl höher oder tiefer liegt.

das programm an sich ist nicht schwierig, aber mit dem GUI tu ich mir noch schwer, da es mein erster Versuch ist.

Mal zu meinem Hauptproblem:

Meine GUI enthält einen Button. Für diesen habe ich einen ActionListener hinzugefügt, sowie eine passende ActionPerformed().
(zu testzwecken habe ich eingestellt, das bei knopfdruck die variable “versuche” um +1 erhöht wird.)
Wenn ich mein Programm nun loslaufen lasse, kommt meine GUI fehlerfrei. wenn ich dann aber dort auf meinen button klicke, passiert nichts weiter.

eigentlich sollte ein von mir eingebauter progressbar einen schritt machen (für +1 versuche), das klappt aber nicht.

schreibe ich jedoch in meine actionPerformed() hinter “versuche++;” einen code, der mir das fenster neu anzeigt, so wird der progressbar korrekt angezeigt. es liegt also nicht am actionListener oder der actionPerformed().

Nun habe ich mir meine main angeschaut, und dort eine EventQueue gefunden. hab mal im internet gegoogelt, aber viel schlauer wurde ich auch nicht.

Ich poste jetzt einfach mal hier meinen bisherigen Code und hoffe, das mir jemand nen tipp geben kann.
Sry wenn es etwas wirr aussieht, wie gesagt, es ist mein erster Versuch, und so viel Java-Erfahrung habe ich auch nicht.

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JTextPane;
import java.awt.BorderLayout;
import java.awt.Color;
import javax.swing.UIManager;
import com.sun.imageio.plugins.jpeg.JPEG;
import java.util.Scanner;

import java.io.InputStream;
import java.util.Locale;
import java.util.ResourceBundle;
import java.awt.*;
import java.awt.event.*;

import com.sun.media.jai.codec.PNGDecodeParam;

import com.sun.media.jai.codec.ImageDecodeParam;

import java.awt.ComponentOrientation;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import java.awt.Window;

import javax.swing.JProgressBar;
import javax.swing.SwingConstants;
import java.awt.Font;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JButton;

public class HOCHtiefGUI implements ActionListener {

	private JFrame frame;
	private JTextField textField;
	private static int versuche = 0;

	/*
	 * int comp = computerZahl(); private static String input = ""; static
	 * HOCHtiefGUI window; JButton los; int[] inputs = { 1 };
	 */

	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					HOCHtiefGUI window;
					window = new HOCHtiefGUI();
					window.frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the application.
	 * 
	 * @wbp.parser.entryPoint
	 */
	public HOCHtiefGUI() {
		int comp = computerZahl();
		String input = "";
		JButton los;
		int[] inputs = { 1 };
		initialize(meldung(versuche, input, tester(input, comp), comp),
				versuche(inputs), versuche);
	}

	public String versuche(int[] inputs) {
		int i = 0;
		String out = "";
		while (i < 5) {
			if ((inputs.length + i) - 5 < 0) {
				out = out + "- \n\n";
			} else {
				out = out + String.valueOf(inputs[4 - i]);
				out = out + " ";
			}
			i++;
		}
		return out;
	}

	public String meldung(int versuche, String input, boolean finish, int zahl) {
		if (versuche < 5 && finish) {
			return "Herzlichen Glueckwunsch, Sie haben die Zahl gefunden!";
		}
		if (versuche == 5) {
			return ("Leider verloren! Die gesuchte Zahl war " + zahl);
		}
		if (input.length() == 0) {
			return "Viel Glueck!";
		}
		if (Integer.parseInt(input) < zahl) {
			return "Die gesuchte Zahl ist groesser!";
		}
		if (Integer.parseInt(input) > zahl) {
			return "Die gesuchte Zahl ist kleiner!";
		}
		return "Da stimmt was nicht!";
	}

	public boolean tester(String input, int zahl) {
		if (input.length() == 0) {
			return false;
		}
		if (Integer.parseInt(input) == zahl) {
			return true;
		} else {
			return false;
		}
	}

	public int computerZahl() {
		long compzahl = System.currentTimeMillis();
		String zahl = String.valueOf(compzahl);
		zahl = zahl.substring(zahl.length() - 2);
		int zahlout = Integer.parseInt(zahl);
		return zahlout;
	}

	public void actionPerformed(ActionEvent e) {
		versuche++;
	}

	/**
	 * Initialize the contents of the frame.
	 * 
	 * @wbp.parser.entryPoint
	 */
	public void initialize(String meldung, String versuche, int balken) {
		frame = new JFrame();
		frame.getContentPane().setBackground(new Color(205, 133, 63));
		frame.setBounds(100, 100, 450, 300);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.getContentPane().setLayout(null);

		JTextPane txtpnFindeDieGesuchte = new JTextPane();
		txtpnFindeDieGesuchte.setBounds(0, 0, 450, 50);
		txtpnFindeDieGesuchte.setBackground(Color.GRAY);
		txtpnFindeDieGesuchte.setEditable(false);
		txtpnFindeDieGesuchte
				.setToolTipText("Der Computer w\u00E4hlt eine Zahl zwischen "
						+ "0 und 99. Du hast f\u00FCnf Versuche, "
						+ "diese zu erraten.");
		txtpnFindeDieGesuchte
				.setText("\n       Finde die gesuchte Zahl!            "
						+ "(Zahl zwischen 0 und 99)\n");
		frame.getContentPane().add(txtpnFindeDieGesuchte);

		JTextPane txtpnVersuche = new JTextPane();
		txtpnVersuche.setBounds(355, 53, 167, 50);
		txtpnVersuche.setBackground(new Color(205, 133, 63));
		txtpnVersuche.setEditable(false);
		txtpnVersuche.setText("\n\n   Versuche:");
		frame.getContentPane().add(txtpnVersuche);

		JProgressBar progressBar = new JProgressBar();
		progressBar.setValue(balken);
		progressBar.setForeground(new Color(205, 133, 63));
		progressBar.setFont(new Font("Impact", Font.PLAIN, 13));
		progressBar.setMaximum(5);
		progressBar.setOrientation(SwingConstants.VERTICAL);
		progressBar.setBounds(365, 126, 30, 146);
		frame.getContentPane().add(progressBar);

		JTextArea txtrGibHierDeine = new JTextArea();
		txtrGibHierDeine.setFont(txtrGibHierDeine.getFont().deriveFont(
				txtrGibHierDeine.getFont().getSize() + 5f));
		txtrGibHierDeine.setBackground(new Color(205, 133, 63));
		txtrGibHierDeine.setEditable(false);
		txtrGibHierDeine.setText("Gib hier deine Zahl ein:");
		txtrGibHierDeine.setBounds(38, 78, 231, 23);
		frame.getContentPane().add(txtrGibHierDeine);

		textField = new JTextField();
		textField.setBounds(72, 124, 134, 28);
		frame.getContentPane().add(textField);
		textField.setColumns(2);

		JButton los = new JButton("los");
		los.setBounds(226, 125, 117, 29);
		los.addActionListener(this);
		los.setEnabled(true);

		frame.getContentPane().add(los);

		JTextPane txtpnH = new JTextPane();
		txtpnH.setText(versuche);
		txtpnH.setEditable(false);
		txtpnH.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
		txtpnH.setBackground(Color.GRAY);
		txtpnH.setBounds(407, 126, 17, 146);
		frame.getContentPane().add(txtpnH);

		JTextPane txtpnNichtGanzDie = new JTextPane();
		txtpnNichtGanzDie.setBackground(new Color(128, 128, 128));
		txtpnNichtGanzDie.setText("\n\n" + meldung);
		txtpnNichtGanzDie.setEditable(false);
		txtpnNichtGanzDie.setFont(new Font("Lucida Grande", Font.PLAIN, 15));
		txtpnNichtGanzDie.setBounds(38, 164, 298, 108);
		frame.getContentPane().add(txtpnNichtGanzDie);
	}
}

Es reicht nicht, einfach den Wert der Variablen in actionPerformed hochzuzaehlen. Du musst ihn auch “neu anzeigen” bzw. in dein Textfeld schreiben.


das würde heißen, dass ich das fenster refreshen muss. diese funktion gibt es aber nicht.

ich kann es lediglich löschen und neu aufstellen. das funktioniert ja auch. aber das ist nun wirklich keine elegante lösung, nach jeder eingabe ein neues fenster.

es geht sicher auch anders, und ich denke dass es mit der eventQueue zusammenhängt, aber ich verstehe nicht wie.^^


Du moechtest folgenden Code vielleicht mal ausprobieren:

public void actionPerformed(ActionEvent e)
{
   // die Variable versuche inkrementieren
   versuche++;
   
   // den Wert der Variable versuche in das Textfeld eintragen
   textFeld.setText("Versuche: " + versuche);
   
   // den Wert der Variable versuche ueber eine ProgressBar visualisieren
   progressBar.setValue(versuche);
}

textFeld und progressBar muessen natuerlich angelegt sein.


ausserdem solltest die Variablen vernuenftig benennen. Gibt verschiedene Moeglichkeiten das zu machen, wie z.b. http://www.n0sl33p.org/dev/java_naming.html, aber prinzipiell gilt, dass der name der Variable irgendwie auf deren gueltigkeitsbereich aufschluss geben sollte.


Ungarische Notation finde ich übertrieben…

5 „Gefällt mir“

ungarische Notation ist zum kotzen, total unlesbar

3 „Gefällt mir“

Ungarische Notation in Java ist fuer Leute die nicht verstanden haben wozu ungarische Notation ueberhaupt da ist. Naemlich um in nicht-typsicheren Sprachen die Mehrfachverwendung von Typen wie ‘int’ zumindest durch passende Benennung kenntlich zu machen.

3 „Gefällt mir“

Also in actionPerformed() kann ich den progressBar nicht updaten, da wirft er mir immer die fehlermeldung (egal was ich mit ihm anstelle)

Die Meldung sieht so aus:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at HOCHtiefGUI.actionPerformed(HOCHtiefGUI.java:129)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2028)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2351)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
	at java.awt.Component.processMouseEvent(Component.java:6373)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
	at java.awt.Component.processEvent(Component.java:6138)
	at java.awt.Container.processEvent(Container.java:2085)
	at java.awt.Component.dispatchEventImpl(Component.java:4735)
	at java.awt.Container.dispatchEventImpl(Container.java:2143)
	at java.awt.Component.dispatchEvent(Component.java:4565)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4621)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4282)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4212)
	at java.awt.Container.dispatchEventImpl(Container.java:2129)
	at java.awt.Window.dispatchEventImpl(Window.java:2478)
	at java.awt.Component.dispatchEvent(Component.java:4565)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:679)
	at java.awt.EventQueue.access$000(EventQueue.java:85)
	at java.awt.EventQueue$1.run(EventQueue.java:638)
	at java.awt.EventQueue$1.run(EventQueue.java:636)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
	at java.awt.EventQueue$2.run(EventQueue.java:652)
	at java.awt.EventQueue$2.run(EventQueue.java:650)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:649)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Ich nehme an progressbar ist null. Genaueres sagt dir Zeile 129 in HOCHtiefGUI.java. Du solltest es oben so deklariert haben:
private JProgressBar progressBar;
Und in initialize() ein entsprechendes Objekt angelegt haben:
progressBar = new JProgressBar();
Deine Initialize-Methode aus dem oberen Post legt lokal ein neues JProgressBar an, was du willst ist aber this.progressbar.

4 „Gefällt mir“

vielen dank! das hab ich in dem wirrwarr total übersehen, hat mein problem auch sofort gelöst. super!


Sehr schön, ich wäre dir dankbar wenn du mir dafür ein +1 geben könntest. Ich habe nämlich da gerade einen Wettbewerb mit dem Griesgram mute am laufen wer mehr kriegt. Es geht um einen Kasten Mate und ein seltenes fettfleckenfreies Fefe-Autogramm.

15 „Gefällt mir“

[color=crimson] Hallo ich mache dieses Semester auch AuD und finde es total gut dass ihr hier Musterlösungen postet! :slight_smile: :slight_smile: :slight_smile: [thumbsup.jpg]

Weiter so!

1 „Gefällt mir“

was für ne musterlösung?

ach ja, diether, selbstverständlich unterstütze ich dich in deiner wette^^


also mein programm funktioniert jetzt einwandfrei. hab da noch ne frage:

ich habe ja einen knopf zum bestätigen eingebaut. weiß jemand, wie ich es anstelle, dass er auch das drücken der ENTER-taste als “bestätigen” ansieht, also wie einen knopfdruck behandelt? dazu müsste ich ja irgendwie mein keyboard überwachen und auf eingaben warten. aber wie mache ich das?

Hab mal das fertige Exemplar angehängt.

Attachment:
Hochtief.jar: https://fsi.cs.fau.de/unb-attachments/post_103078/Hochtief.jar


Da brauchst du auch einen EventListener der auf keyPressed() oder ähnliche hört und wenn der keyCode für Enter im Event Objekt steht die Aktion ausgeführt werden soll.


Wenn du nur willst, dass Enter deinen Button betätigt, dann kannst du ihn einfach als Default-Button setzen:

Quelle: How to Use Buttons, Check Boxes, and Radio Buttons (The Java™ Tutorials > Creating a GUI With Swing > Using Swing Components)