PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Java] JLabel & Co. bringen mich noch um!


Kenny1702
2008-03-01, 16:52:49
Allse was ich gerne hätte ist ein Frame mit 2 Buttons, 3 Textfeldern und den passenden Beschriftungen. Nachdem ich mittlerweile einen Großteil des bisherigen Tages verbracht habe, ein passendes zu bauen und es partout nicht klappt, würde mich mal interessieren, was schiefläuft. Ich schaffe es, 3 Textfelder und 2 Buttons richtig zu positionieren, jedoch die Beschriftung will schlicht nicht.

Ich habe mal ein kurzes TestFrame geschrieben, an dem ich mal meinen Frust zeige. Also kurz und knapp


public class TestFrame extends JFrame {

private JButton button1;
private JButton button2;
private JLabel jlabel1;

public TestFrame(){
//always
this.setSize(200, 200);
//Teil 1
jlabel1=new JLabel("Text1");
this.add(jlabel1);
//Teil 2
button1=new JButton("OK");
button1.setBounds(0,0,60,20);
this.add(button1);
//Teil 3
button2=new JButton("Not OK");
button2.setBounds(0,0,60,20);
this.add(button2);
//always
this.setVisible(true);
//System.out.println(jlabel1.isShowing());
}

public void paint(Graphics g){
//Teil 4
button1.setLocation(10,10);
button2.setLocation(110,10);
}

}

1. Wenn nur Teil 1 ausgeführt wird, dann sehe ich das JLabel.
2. Wenn Teil 1 und Teil 2 ausgeführt werden => riesiger JButton
3. Wenn alles ausgeführt wird => kleiner "OK"-JButton und riesiger Not OK-JButton.
Vom JLabel sehe ich in beiden Fällen nichts.
4. Wenn nur Teil 1 ausgeführt wird und man jlabel.setLocation(int x, int y) benutzt, so wird der Befehl scheinbar ignoriert. Verschiedene Werte führen auf anscheinend gleiche Ergebnisse.

Erwarten tue ich nur den ersten Fall, die anderen finde ich sehr seltsam. Jemand der Erklärungen hat für mich, vielleicht sogar noch mit einer (oder mehreren) Lösungsmöglichkeit(en)?

Gast
2008-03-03, 12:16:36
Also Teil 4 würd ich nicht machen, paint sollte man nicht ohne triftigen Grund anfassen :)

Ansonsten solltest du dich mal mit den LayoutManagern von Java beschäftigen
siehe: http://java.sun.com/docs/books/tutorial/uiswing/layout/visual.html

Entweder benutzt du einen entsprechenden Manager oder du benutzt keinen und kannst/musst dann alles von Hand machen, z.B. mit setBounds(..)

Gruß

astro
2008-03-03, 12:27:59
Der Gast hat das Wesentliche schon gesagt. Entweder verwendest Du LayoutManager, oder du setzt den LayoutManager auf "null". In diesem Fall positionierst Du die Elemente mit .setBounds(x-coordinate, y-coordinate, breite, höhe).

Hier Dein Beispiel im null-Layout:

import java.awt.*;
import javax.swing.*;

public class TestFrame extends JFrame {

private JButton button1;
private JButton button2;
private JLabel jlabel1;

public TestFrame(){
//always
this.setSize(200, 200);
this.setLayout(null);
//Teil 1
jlabel1=new JLabel("Text1");
jlabel1.setBounds(60, 30, 80, 20);
this.add(jlabel1);
//Teil 2
button1=new JButton("OK");
button1.setBounds(0,0,60,20);
this.add(button1);
//Teil 3
button2=new JButton("Not OK");
button2.setBounds(80,0,80,20);
this.add(button2);
//always
this.setVisible(true);
//System.out.println(jlabel1.isShowing());
}

// execute for testing
public static void main (String[] args) {
TestFrame test = new TestFrame();
test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}

Kenny1702
2008-03-03, 19:43:41
So, danke, das mit LayoutManagern hat funktioniert, aber ich habe noch eine Frage zur paint-Funktion.

Was kann ich machen, wenn ich in dem Frame "rummalen", also verschiedene geometrische Figuren zeichnen will? paint ist da ja nicht so prickelnd.

RMC
2008-03-03, 19:57:57
So, danke, das mit LayoutManagern hat funktioniert, aber ich habe noch eine Frage zur paint-Funktion.

Was kann ich machen, wenn ich in dem Frame "rummalen", also verschiedene geometrische Figuren zeichnen will? paint ist da ja nicht so prickelnd.


Wenn du so eine Art "Mini-Paint" Programm mit Klassen für div. geometrische Figuren wie Rectangles, Triangles, Circles etc. baust, dann ist die paint-Funktion genau die richtige ;)

Du machst eigene Components, die die paint-Funktion nach deinen Vorlieben überschreiben. In der Funktion befinden sich alle Zeichenbefehle für deine Figur.

Du solltest diese Funktion aber nie selber aufrufen, denn die wird vom Gui-System getriggert. Wenn du selbst ein Neuzeichnen durchführen willst, solltest du repaint() verwenden.

Mehr zum Thema: http://java.sun.com/products/jfc/tsc/articles/painting/index.html

Kenny1702
2008-03-27, 20:24:17
Ich hab es erst heute wieder angepackt, und hab gemerkt, daß ich kurz vorm Ziel stand. Nachdem ich die Ex-Applets von JComponent statt JFrame hab erben lassen und ich aus paint() paintComponent() gemacht hab, lief es fast so, wie ich es haben wollte. :)

Jetzt müssen nur noch ein paar kleine getGraphics-Hacks beseitigt werden und ich bin glücklich.

Danke!

Abnaxos
2008-03-28, 05:47:26
Wenn du so eine Art "Mini-Paint" Programm mit Klassen für div. geometrische Figuren wie Rectangles, Triangles, Circles etc. baust, dann ist die paint-Funktion genau die richtige ;)
Mal abgesehen davon, dass unter Swing paint() streng verboten ist, und das stattdessen paintComponent() heissen muss ... :ugly: SCNR ...

[...] und ich aus paint() paintComponent() gemacht hab, lief es fast so, wie ich es haben wollte. :)