PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Java-newbie will Dialoge zentrieren und ein schönes GUI-Design haben



DeeDee0815
18.05.2007, 14:24
Hallo,

ich habe folgendes Problemchen:

Ich möchte ein Dialogfenster relativ zum Elternfenster zentrieren:


public YesNoDialog(Frame owner, String msg)
{
super(owner, "Frage");
Point parloc = owner.getLocation();
setLocation(parloc.x + (290 - WIDTH/2), parloc.y + (210 -HEIGHT/2));
setResizable(false);

setLayout(new BorderLayout());

add(new Label(msg), BorderLayout.CENTER);
Panel panel = new Panel();
panel.setLayout(new FlowLayout(FlowLayout.CENTER));
Button button = new Button("Ja");
button.addActionListener(this);
panel.add(button);

button = new Button("Nein");
button.addActionListener(this);
panel.add(button);
add(panel, BorderLayout.SOUTH);

pack();
}

So


setLocation(parloc.x + (290 - WIDTH/2), parloc.y + (210 -HEIGHT/2));

geht es eben nicht. Wie kann ich die größe des Dialogfensters auslesen. Festlegen mit setSize kann ich sie jedenfalls nicht.

Mein zweites Problem ist, dass ich bei einem windowsbenutzenden Freund festgestellt habe, das mein Java-Programm die Windows-Design-Farben annimmt. Das was ich eben auch über Java 6 gehört habe. Unter Ubuntu (GNOME/GTK) geht das aber nicht. Muss ich als Programmierer nacharbeiten oder fehlt mir ein Javazusatzpaket?

Mfg
DeeDee0815

DeeDee0815
28.05.2007, 19:57
HAAAAAALLLLLLLLLOOOOOOO!!!! Geht das mit dem Zentrieren nicht, oder was? Und was ist mit dem GUI-Design?

MfG

b00
28.05.2007, 20:45
ich glaub das dir keiner antwortet liegt daran dass keiner der mehr ahnung von java hat als du diesen thread gelesen hat. ich gehöre dazu! also gedulde dich!

foexle
31.05.2007, 19:27
hi poste mal bitte die gesamte class ... ich muss wissen was du eingeunden hast und von was du erbst
.
.
.
EDIT (autom. Beitragszusammenführung) :
.
versuchs mal so :)


setLocation(parloc.x + ( WIDTH/2-290), parloc.y + (HEIGHT/2-210));

ich denke mal die hälfe des parent fensters ist grösser als 290 pixel aus diesem Grund hast du eine negative pixel zahl

DeeDee0815
02.06.2007, 15:12
@foexi: Nein, so geht das nicht. Jetzt landet das Fenster "außerhalb" des parent-fensters.

Hier die gesamte ModalDialog-Class, die etwas anders ist, als der ursprüngliche Code - allerdings mit dem Selben problem.


import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Dialog;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.Panel;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.StringTokenizer;

class ModalDialog
extends Dialog
implements ActionListener
{
private static final long serialVersionUID = 1L;

String result;

public static String OKDialog(Frame owner, String msg)
{
ModalDialog dlg;
dlg = new ModalDialog(owner, "Hinweis", msg, "OK");
dlg.setVisible(true);
return dlg.getResult();
}

public static String YesNoDialog(Frame owner, String msg)
{
ModalDialog dlg;
dlg = new ModalDialog(owner, "Frage", msg, "Ja,Nein");
dlg.setVisible(true);
return dlg.getResult();
}

public static String YesNoCancelDialog(Frame owner, String msg)
{
ModalDialog dlg;
dlg = new ModalDialog(owner, "Frage", msg, "Ja,Nein,Abbrechen");
dlg.setVisible(true);
return dlg.getResult();
}

public ModalDialog(Frame owner, String title, String msg, String buttons)
{
super(owner, title, true);
setLayout(new BorderLayout());
setResizable(false);
Point parloc = owner.getLocation();
setLocation(parloc.x + (290-(getWidth()/2)), parloc.y + 30);
add(new Label(msg), BorderLayout.CENTER);
Panel panel = new Panel();
panel.setLayout(new FlowLayout(FlowLayout.CENTER));
StringTokenizer strtok = new StringTokenizer(buttons, ",");
while (strtok.hasMoreTokens()) {
Button button = new Button(strtok.nextToken());
button.addActionListener(this);
panel.add(button);
}
add(panel, BorderLayout.SOUTH);
pack();
}

public void actionPerformed(ActionEvent event)
{
result = event.getActionCommand();
setVisible(false);
dispose();
}

public String getResult()
{
return result;
}
}

MfG
DeeDee0815

P.S.: @b00: Jaja, ich werde mich demnächst mehr in Gedult üben. Ich habe nur eben schonmal erlebt, dass ich ein halbes Jahr lang auf einen Beitrag keine Antwort bekam....

Der Code ist übrigens nicht allein von mir. Den habe ich aus dem Java Buch "Handbuch der Java-Programmierung" abgeschrieben. Verstanden habe ich ihn aber schon - und angepasst.

foexle
03.06.2007, 11:01
gut dann fangen wir mal an :)
also
was mir direkt auffällt, was aber nichts mit dem Problem zu tun hat, sondern rein programmiertechnisch ist

while (strtok.hasMoreTokens()) {
Button button = new Button(strtok.nextToken());
button.addActionListener(this);
panel.add(button);
}
sowas macht mannicht in einen funktions aufruf, sondern erstellt für sowas eine innerClass

also wenn ich mich so durch deinen Quellcode durchlese, kann ich keinen Syntax-fehler auf anhieb sehen.
nur was mir halt auffällt, du setzt erst das Layout bevor du überhaupt weist, ab welchen kords dein Fenster zeichnen soll

also bring das ganze mal in die richtige reihenfolge ... auch das du erst ein Label erzeugst dann ein Panel.... in deinem Buch sollte stehen, das man immer auf panels zeichnet

desweitern implementiert man keine actionListener, da wenn sich dein Prog aufbläht du bei der Compelierung mehrere Interfaces direkt einbindest, und das bremst die performance
machs besser so:
im construkor


addIrgendEinListener(new MyListenerClass());
weiter dann die innerclass

class MyListenerClass extends DenAdapter
{
<DIe Functions>
}


bring das so mal bischen iO


da ich noch nicht genau weis, was dein fehler ist, sondern nur das dein fenster anscheinend nicht gezeichnet wird, das kann evtl sogar ganz einfach an den fehlern liegen die ich dir bisher aufgezählt habe...
syntaktisch was du da schreibst ist richtig, nur logisch falsch platziert

wenn du das gemacht hast, und immer noch nicht geht poste den function aufruf ....

bzw haste mal das ganze verfolgt mit breakpoints?