fehlende spalte bei gridbaglayout

Status
Nicht offen für weitere Antworten.

skaal

Mitglied
ich habe einen dialog, bei dem ich jetzt noch einen button zum abbrechen zufügen wollte, der erscheint aber nicht.
hier der code:

Code:
public class LoginDialog extends JDialog {

    private GridBagLayout gbl = new GridBagLayout();
    private GridBagConstraints gbc = new GridBagConstraints();
    private JTextField tf_name = new JTextField();
    private JPasswordField pf_pw = new JPasswordField();
    private JButton btn_login = new JButton(ClientMainFrame.getLabel("log")),
                    btn_reg = new JButton(ClientMainFrame.getLabel("reg")),
                    btn_cancel = new JButton(ClientMainFrame.getLabel("cancel"));
    private JLabel lbl_name = new JLabel(ClientMainFrame.getLabel("name")),
                   lbl_pw = new JLabel(ClientMainFrame.getLabel("pw"));

    private CommandProcessor server ;

  public LoginDialog ( final Frame frame,
                       final String title,
                       CommandProcessor s ) {
    super(frame,title,true);
    setSize(300,100);
    setResizable(false);
    setLocation(300,200);
    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent e) {
        System.exit(0);
      }
    });
    getContentPane().setLayout(gbl);

    server = s;

    //set layout components gbl and gbc to reference value
    gbc.fill = GridBagConstraints.BOTH;
    gbc.gridx = GridBagConstraints.RELATIVE;
    gbc.gridy = GridBagConstraints.RELATIVE;
    gbc.weightx = 1.0;
    gbc.weighty = 1.0;
    gbc.gridwidth = GridBagConstraints.RELATIVE;
    gbc.gridheight = 1;

    //configure components
    gbl.setConstraints(lbl_name,gbc);
    getContentPane().add(lbl_name);
     gbc.gridwidth = GridBagConstraints.REMAINDER;
    gbc.weightx = 3.0;
    gbl.setConstraints(tf_name,gbc);
    getContentPane().add(tf_name);
    gbc.weightx = 1.0;
    gbc.gridwidth = GridBagConstraints.RELATIVE;
    gbc.weightx = 1.0;
    gbl.setConstraints(lbl_pw,gbc);
    getContentPane().add(lbl_pw);
    gbc.gridwidth = GridBagConstraints.REMAINDER;
    gbc.weightx = 3.0;
    gbl.setConstraints(pf_pw,gbc);
    getContentPane().add(pf_pw);
    gbc.gridwidth = GridBagConstraints.RELATIVE;
    gbc.weightx = 1.0;
    gbl.setConstraints(btn_login,gbc);
    getContentPane().add(btn_login);
    gbl.setConstraints(btn_reg,gbc);
    getContentPane().add(btn_reg);
    gbc.gridwidth = GridBagConstraints.REMAINDER;
    gbl.setConstraints(btn_cancel,gbc);
    getContentPane().add(btn_cancel);
  }
}

kann mir jemand sagen, woran das liegt?
ich habe das problem allerdings noch in einem etwas größeren rahmen. dort befinden sich einige komponenten einfach außerhalb des dialogs (man sieht noch einen ganz kleinen teil vom ihnen, daher weiß ich das).
das ganze läuft noch auf java 1.4.2.
 
1. Du musst für jede Component noch gridx, gridy, gridwidth und gridheight setzen. Diese 4 Werte geben nämlich an, wo die Component zu liegen kommt.

2. Für jede Component brauchst du eine eigene Instanz von GridBagConstraints, also müssen noch ein paar "new..." hin.

3. du kannst auch "add( component, gridBagConstraints)" verwenden, dann musst du nicht "setConstraints" aufrufen, und die Gefahr einer Verwechslung von Componenten ist auch geringer :wink:
 
zu 1: die sind eigentlich angegeben, zumal gridheight immer eins sein soll und gridwidth ständig verändert wird.

zu 2: es ist immer eine eigene instanz da. dass das immer die selbe mit aktualisierten werten ist, sollte keine rolle spielen.

und das immer alles neu zu konstruieren sit so verdammt aufwendig. zumal ich das per hand schreibe...
 
Zu 1: Ja schon, nur gibts du immer dieselben Koordinaten an. das ist so, wie wenn du mehrere Blätter Papier übereinanderlegst, das unterste ist nicht mehr gut lesbar...

Zu 2: Sorry, da hab ich mich geirrt. Das GridBagLayout erstellt ja eine Kopie der Constraints.
 
dafür sind ja gridx und gridy auf RELATIVE gesetzt. das hat bisher immer funktioniert.
aber nur bisher.
wenn ich es mit dem editor alles aufgedröselt mache, geht es so wie es soll. der produziert nur immer so grausamen code, den man nicht mehr lesen kann...

danke. jetzt hab ich mal einen grund mich damit auseinanderzusetzen.
 
ich hab es jetzt hinbekommen ohne immer ein neues objekt anzulegen.

falls die lösung jemanden interessiert (und weil ich keinen blassen schimmer habe, wo jetzt der unterschied liegt):
ich kann gridx und gridy auf RELATIVE belassen. ich muss nur statt gridwidth = RELATIVE gridwidth = 1 nehmen.
???:L keine ahnung wo der unterschied liegt.
 
Dieses GridBagLayout kann ja noch mehr als ich dachte, ich setz mich wohl besser wieder hinter die API...

Sorry für die verwirrende "Hilfe" skaal :roll:
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben