JButton auf bestimmte Position legen

TheWalkingJoke

Lt. Junior Grade
Registriert
Aug. 2014
Beiträge
417
Hallo zusammen,
ich bin gerade dabei JFrame und JButton zu lernen. Ich habe jetzt mehrere Buttons erzeugt und auch ein Frame. Jetzt Möchte ich aber, dass ich die einzelnen Button auf Postion X/Y legen kann. Wie geht das?
Ich will z.B. dass der Button "zahl1" an Postion X=50 und Y= 250 ist.
Falls etwas am Code unklar ist oder besser gemacht werden kann, dann denkt bitte dran : Ich lerne noch ;)
Code:
import javax.swing.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.BorderLayout;
import java.awt.FlowLayout;

public class HelloWorld extends JFrame {
	JFrame meinFenster = new JFrame();
	JButton zahl1 = new JButton("1");
	JButton zahl2 = new JButton("2");
	JButton zahl3 = new JButton("3");

	JPanel meinPanel = new JPanel();

	public HelloWorld() {
		setLayout(null);
		meinFenster.setVisible(true);
		meinFenster.setSize(500, 500);
		meinFenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		meinPanel.add(zahl1);
		meinPanel.add(zahl2);
		meinPanel.add(zahl3);
		meinFenster.add(meinPanel);

		HandlerKlasse handler = new HandlerKlasse();
		zahl1.addActionListener(handler);
		zahl2.addActionListener(handler);
		zahl3.addActionListener(handler);
	}

	public static void main(String[] args) {
		new HelloWorld();

	}

	public class HandlerKlasse implements ActionListener {
		public void actionPerformed(ActionEvent event) {
			if (event.getSource() == zahl1) {
				System.out.println("Es wurde eine '1' gedrückt!");
			} else if (event.getSource() == zahl2) {
				System.out.println("Es wurde eine '2' gedrückt!");
			} else if (event.getSource() == zahl3) {
				System.out.println("Es wurde eine '3' gedrückt!");
			}

		}
	}
}
TheWalkingJoke
 
Du müßtest Deinem Panel ein nullLayout geben und anschließend dem Button per setBounds die Koordinaten zuweisen.

Also Deinen Code erweitern um:

meinPanel.setLayout(null);
und
zahl1.setBounds(int x,int y,int width,int height);
 
Zuletzt bearbeitet:
Dered schrieb:
Also Deinen Code erweitern um:

meinPanel.setLayout(null);
und
zahl1.setBounds(int x,int y,int width,int height);

Funktioniert, danke. Habe noch eine zweite Frage:
Kann ich mein Frame in 2 Hälften unterteilen und quasi in der rechten Hälfte alle möglichen Buttons habe und in der Linken Hälfte wird dann ein Text angezeigt, bzw. geändert wenn eine Button gedrückt wurde?
 
Klar, das ist auch mit dem null-Layout möglich.
Aber du fragst wahrscheinlich, ob das auch besser/schöner/einfacher geht? Mach dich mal mit Layoutmanagern vertraut.
 
Ok mache ich. Jetzt noch eine Frage. Ich will ein JLabel erstellen, das einen Text ausgibt. Klappt auch alles. Jetzt will ich aber, dass sich der Text ändert, wenn ich einen Button drücke. Wie geht das?
Code:
import javax.swing.*;
import javax.swing.JLabel;
import java.util.Scanner;

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

public class HelloWorld extends JFrame {
	JFrame meinFenster = new JFrame();
	Rechner rechner = new Rechner();

	JButton enter = new JButton("Enter");

	JPanel meinPanel = new JPanel();
	JLabel aStapel;
	public HelloWorld() {
		meinPanel.setLayout(null);
		meinFenster.setVisible(true);
		meinFenster.setSize(600, 400);
		meinFenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		aStapel = new JLabel(rechner.toString());
			
		enter.setBounds(90, 240, 120, 20);

		aStapel.setBounds(300, 280, 200, 100);

		meinPanel.add(enter);
		meinPanel.add(aStapel);
		meinFenster.add(meinPanel);

		HandlerKlasse handler = new HandlerKlasse();

		enter.addActionListener(handler);

	}

	public static void main(String[] args) {
		new HelloWorld();

	}

	public class HandlerKlasse implements ActionListener {
		Scanner sc = new Scanner(System.in);

		String eingabe = "";

		public void actionPerformed(ActionEvent event) {

                        if (event.getSource() == enter) {
				Double i = Double.valueOf(eingabe);
				rechner.stackZahlen.push(new Zahl(i));
				eingabe = "";
				aStapel = new JLabel(rechner.toString());
				System.out.println(rechner);
			}
		}
	}
}
 
In der Action-Methode erstellst du ein neues JLabel, das überhaupt keinen Bezug zu der bestehenden GUI hat. JLabel hat eine Methode zum festlegen des Texts, die du hier nutzen musst.
 
Habe
Code:
aStapel = new JLabel(rechner.toString());
zu
Code:
aStapel.setText(rechner.toString());
geändert und es funktioniert.

Jetzt habe ich aber folgendes Problem:
Die toString() Methode des Rechners soll eigentlich folgendes ausgeben:
Aktueller Stapel: Zahl1
Zahl2
Zahl3
....

In meinem Frame steht aber:
Aktueller Stapel : Zahl1Zahl2Zahl3...

Code:
public String toString() {
		String s = "\n Ihr aktueller Stapel: \n";
		Stack<Zahl> ersatzStackZahlen = new Stack<Zahl>();

		while (!stackZahlen.isEmpty()) {
			Zahl zObj = stackZahlen.top();
			stackZahlen.pop();
			ersatzStackZahlen.push(zObj);
		}

		while (!ersatzStackZahlen.isEmpty()) {
			Zahl zObj = ersatzStackZahlen.top();
			ersatzStackZahlen.pop();
			stackZahlen.push(zObj);
			s = s + zObj.toString() + "\n";
		}

		return s;

Ich möchte quasi, dass ganz oben einmal "Aktueller Stapel" steht, und dann da drunter neue Zahlen stehen, wenn ich den Button drücke.
So soll das aussehen.
Rechner.jpg
 
Zuletzt bearbeitet:
JLabel unterstützen den \n-Zeilenumbruch nicht. Eine Variante wäre, den Text als HTML zu übergeben mit <br> als Zeilenumbruch. Eine Andere wäre eine JTextArea zu nutzen und vom Design her den Hintergrund und Rahmen zu enfernen.
Am besten wäre sogar eine JList zu verwenden, da du hier tatsächlich einen Stapel hast.
 
Wie könnte da ein Beispiel Code aussehen? Noch eine Frage:
Wenn ich nachher so viele Zahlen habe, dass sie nicht komplett in ein Fenster passen, ist es dann möglich, dass man Scrollen kann? Und wenn ja wie?
 
Google bietet dir haufenweise Beispiele, wie man eine JList einsetzt, und ja, diese kann man scrollbar machen (wie auch andere Komponenten).
 
Super Danke für deine Hilfe :)
Ergänzung ()

Ich kriege es irgendwie nicht hin :(
Ich möchte also eine JList erzeugen, in der String's gespeichert werden. Die String's werden wenn ich einen Button drücke zu der Liste hinzugefügt.
Wie muss ich diese Liste erzeugen und wie kann ich zu der Liste die String's hinzufügen?
 
Zurück
Oben