Problem mit Java-Code

godfather22

BIOS-Overclocker(in)
Hi,
ich hab gestern mit hilfe dieses Tutorials angefangen Java zu lernen. Dazu wollte ich mir ein JFrame basteln auf den ein Knopf und ein Text zu sehen sein sollen.
Ich habe es mit diesem Quelltext versucht:
import javax.swing.JButton;
//import javax.swing.*;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class Test1 {
public static void main(String args[]){

JLabel text;
JButton b;

JFrame jf = new JFrame();
jf.setTitle("MeinFenster");
jf.setSize(500, 400);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setLocationRelativeTo(null);

JPanel panel = new JPanel();

text = new JLabel("to win click");
text.setBounds(100, 100, 200, 200);
panel.add (text);

b = new JButton("here");
b.setBounds(10, 10, 100, 25);
b.setVisible(true);
panel.add(b);
jf.add(panel);

}}
(Kann sein, dass das alles auch einfacher geht aber ich hab erst gestern angefangen und möchte da erstmal reinkommen ;))
Nun ist mein Problem, dass weder JButton noch JLabel auf Änderungen, seitens set.bounds reagieren. Der Typ im Tutorial hat es ganz ohne panel gemacht aber ich hab auf einer anderen Seite davon gehört und versucht es zu implementieren. Wenn ich es ohne panel versuche erscheint nur mein JFrame ohne Text und ohne Knopf. Wäre dankbar, wenn ihr mir helfen könntet :)
 
Also ohne Panel funktioniert der Quellcode so ganz wunderbar, wenn du daran denkst, den Button und den Text direkt dem Frame hinzuzufügen ;)
 
Danke für deine Antwort.
Wie mache ich das denn? Wie gesagt ich lerne erst seit gestern Java. Kann ich dann einfach alle befehle, die was mit dem panel zu tun haben löschen?
 
Ja, nimm das Panel raus, und schreibe jf.add(b); jf.add(text); dazu ;)

Du kannst übrigens auch die import-befehle kürzen, javax.swing.* zu importieren reicht völlig ;)

Warum das mit dem panel nicht will ist mir aber gerade auch schleierhaft, hab grade etwas rumprobiert, und es will einfach nicht. wenn man das fenster vergrößert/verkleinert bleiben die beiden objekte ebenfalls an genau der stelle, wandern also von der mitte ab. irgenwas hält sie da fest, aber mir ist nicht klar was ...
 
Genauso war das auch bei mir. Mir wird langsam klar, warum das bei mir nicht ohne panel funktioniert hat: ich hab nur add(b); geschrieben und nicht jf.add(b); kein wunder das das nicht funktioniert hat. Was ist eigentlich ein panel und wofür braucht man das, wenn es auch ohne geht?
 
add(b) kann man nehmen, es ist gleichbedeutend mit this.add(b). das bedeutet, deine klasse müsste von JFrame erben, dann wäre die klasse sozusagen selbst das fenster-objekt. das mache ich meist, ist aber im grunde egal.

ein panel (wiki) nutze ich meist zur grafischen strukturierung. inwiefern es sonst nutzbar ist weiß grad auch garnicht ...
 
Hab jetzt den Quelltext:
import java.awt.Label;

import javax.swing.*;

public class Versuch1 {
public static void main (String args[]) {

Label text;
JButton b;

JFrame jf = new JFrame();
jf.setTitle("Mein erstes Fenster");
jf.setSize(700, 500);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setLocationRelativeTo(null);


text = new Label("to win click");
text.setBounds(10, 10, 100, 25);
jf.add(text);

b = new JButton("here");
b.setVisible(true);
b.setBounds(200, 10, 100, 25);
jf.add(b);
}

}

aber jetzt hab ich das Problem, dass der JButton das ganze Frame ausfüllt. Label musste ich importieren, weil sonst eclipse rumgemuckt hat.
 
gegen das rummucken von eclipse: es heißt JLabel, nicht nur Label ;) dann läuft das auch mit swing.*

also bei mir läufts so:

Code:
import java.awt.Color;

import javax.swing.*;

public class Versuch1 {
    
    JLabel text;
    JButton b;
    
    public Versuch1()
    {

    JFrame jf = new JFrame();
    jf.setTitle("Mein erstes Fenster");
    jf.setSize(700, 500);
    jf.setVisible(true);
    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    jf.setLocationRelativeTo(null);
    jf.setLayout(null);


    text = new JLabel("to win click");
    text.setBounds(10, 10, 100, 25);
    jf.add(text);
    
    b = new JButton("here");
    b.setVisible(true);
    b.setBounds(200, 10, 100, 25);
    jf.add(b);
    
    }
public static void main (String args[]) {
    Versuch1 X = new Versuch1();

}

}
 
Naja, wenn du Panel verwendest braucht das Panel halt nen Layout. Da arbeitet man (soweit ich mich noch dran erinnern kann, nie so der Fan von swing gewesen...) nicht mit setBounds, sondern bsp. mit dem GridLayout mit dem man dann seine Objekte ausrichtet und positioniert.
Panels sind deswegen eigentlich sehr praktisch, weil du eben nicht anfangen musst Pixel zu zählen, sondern im Panel anhand des angegebenen Layouts der Inhalt logisch automatisch positioniert wird.
 
Deshalb hab ich das Layout mit setLayout(null) abgeschaltet.

das thema ist recht leicht, layouts sind wie der name schon sagt vorgefertigte anordnungsmuster. damit kannst du recht leicht die grafischen objekte zu den meistgenutzten ansichten ordnen.
 
Gut :)

Freut mich auch, dass meine bescheidenen Java-Kenntnise schon jemandem helfen konnten, vom Profi bin ich ja auch noch weit entfernt :D
 
Zurück