Announcement

Collapse
No announcement yet.

Wieso ist die Anzahl meiner JButtons zufällig, obwohl ich einen festen Wert angebe?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Wieso ist die Anzahl meiner JButtons zufällig, obwohl ich einen festen Wert angebe?

    Guten Abend,
    Es handelt sich um folgenden Programmcode:

    [highlight=java]
    public class Lotto implements ActionListener
    {
    JFrame frame=new JFrame();
    JLabel label=new JLabel();
    JPanel panel=new JPanel();
    JButton spielen=new JButton("Spielen");
    JButton kaufen=new JButton("Lottozettel kaufen");

    public static void main(String[] args)
    {
    Lotto lotto=new Lotto();
    }

    public Lotto()
    {
    frame.setSize(500,500);
    frame.setTitle("Lotto");
    frame.add(panel);
    frame.setVisible(true);
    panel.add(spielen);
    panel.add(kaufen);
    panel.add(label);
    JButton[] array=new JButton[49];
    for(int b=0;b<49;b++)
    {
    array[b]=new JButton("Button"+b);
    panel.add(array[b]);
    }
    spielen.addActionListener(this);
    }

    @Override
    public void actionPerformed(ActionEvent a)
    {
    if(a.getSource()==this.spielen)
    {
    JOptionPane.showInputDialog("Gebe deine erste Lottozahl ein:");
    }
    }

    }

    [/highlight]



    Dieser Code sollte eigentlich einen Button "Spielen", einen Button "Lottozettel kaufen" und 49 Buttons mit den Namen "Button0-48" ausgeben.
    Wenn ich den Code mit eclipse oder bluej ausführe, dann ist die anzahl der 49 Buttons mit den Namen "Button0-48" aber zufällig und bei jeder Ausführung habe ich eine verschiedene Anzahl an Buttons. Woran liegt das?
    Zuletzt editiert von Christian Marquardt; 13.01.2013, 07:14. Reason: Code formatiert

  • #2
    Weil du keinen Layoutmanager benutzt.

    [highlight=java]
    public class Lotto extends JFrame
    {
    private JButton spielen=new JButton("Spielen");
    private JButton kaufen=new JButton("Lottozettel kaufen");
    private JPanel panel=new JPanel();
    private JLabel label=new JLabel();

    public static void main(String args[])
    {
    java.awt.EventQueue.invokeLater(new Runnable()
    {
    @Override
    public void run()
    {
    new Lotto().setVisible(true);
    }

    });
    }

    public Lotto()
    {
    setSize(500,500);
    setTitle("Lotto");
    setDefaultCloseOperation(WindowConstants.EXIT_ON_C LOSE);
    add(panel);
    panel.setLayout(new FlowLayout());
    panel.add(spielen);
    panel.add(kaufen);
    panel.add(label);
    JButton[] array=new JButton[49];
    for(int b=0;b<49;b++)
    {
    array[b]=new JButton("Button"+b);
    panel.add(array[b]);
    }
    spielen.addActionListener(new ActionListener()
    {
    @Override
    public void actionPerformed(ActionEvent e)
    {
    spielenActionPerformed(e);
    }

    });

    }

    private void spielenActionPerformed(ActionEvent e)
    {
    JOptionPane.showInputDialog("Gebe deine erste Lottozahl ein:");
    }

    }


    [/highlight]


    Du musst dich hier einarbeiten

    Oder eine IDE wie Netbeans benutzen, die dir eine visuelle Entwicklung ermöglicht.

    Selbst mit dem auf die schnelle oben verwendeten FlowLayout sieht das bescheiden aus
    Zuletzt editiert von Christian Marquardt; 13.01.2013, 08:06.
    Christian

    Comment


    • #3
      Erstmal Danke für die Antwort!
      Ich werde mich in Zukunft natürlich noch mit LayoutManagern beschäftigen, aber ich wollte eigentlich nicht wissen wie ich diesen Fehler behebe, sondern wieso dieser Fehler auftritt. Wenn ich statt
      JButton[] array=new JButton[49];
      for(int b=0;b<49;b++)
      {
      array[b]=new JButton("Button"+b);
      panel.add(array[b]);
      }
      einfach 49 mal JButton button1 = new JButton("Button1");
      JButton button2 = new JButton("Button2");
      JButton button3 = new JButton("Button3");
      JButton button4 = new JButton("Button4");

      usw. von Hand eingebe, dann funktioniert das Programm ja auch ohne Layoutmanager und dadurch wäre der Fehler auch behoben, aber mich würde es interessieren wodurch dieser Fehler überhaupt entsteht?

      Comment


      • #4
        Wahrscheinlich daran, dass sobald der Konstrutor abgearbetiet wurde deine Button futsch sind. -> Gültigkeitsbereich vom Array


        aber ich wollte eigentlich nicht wissen wie ich diesen Fehler behebe
        Ah, ja
        Zuletzt editiert von Christian Marquardt; 13.01.2013, 12:49.
        Christian

        Comment


        • #5
          Hm so ganz verstehe ich aber immer noch nicht warum es zufällig viele Buttons gibt. Wenn die Buttons futsch sind, sobald der Konstruktor abgearbeitet ist, dann sollten doch eigentlich gar keine Buttons angezeigt werden, wenn ich das richtig verstanden habe. Aber ich verstehe nicht wie der exakt selbe Programmcode am selben Computer ausgeführt ohne irgendwelche benutzten Zufallsgeneratoren immer etwas anderes ausgibt und nicht wie alle anderen Programme, die ich vorher ausgeführt habe, immer das gleiche?

          Comment


          • #6
            Wenn du ein Null-Layout benutzt, musst du die Bounds setzen. Da du das nicht tust und keinen Mannager benutzt, wird wohl Java nicht mehr wissen wohin es die Buttons zeichnen soll und sie werden ggf. außerhalb des Frames gesetzt. Wenn du es genau wissen willst, debugge den Sourcecode der Paint-Methode der Buttons durch (dann siehst du wo der Button mit welchen Daten hinkommt). Mehr fällt mir dazu nicht ein. Ist auch irrelevant, da der Code so falsch ist. Darüber zu sinnieren, warum nun falscher Code zu falschem Ergebnis führt, halt ich für sinnlos.

            Also
            Layoutmanager benutzen
            wenn Null-Layout die Bounds setzen
            Christian

            Comment


            • #7
              Aber ich benutze doch keinen Null-Layout, oder ist der automatisch von Anfang an eingestellt, wenn man keinen Layout-Manager benutzt?
              Bzw. gibt es keinen "standard"-Layoutmanager, der benutzt wird wenn man kein Layout einstellt?

              Comment


              • #8
                Was bekommst du, wenn du das Layout des Panels abfragst?

                EDIT
                Da ist ein Border bzw. FlowLayout drin

                Dann weiss ich auch nicht, warum die Buttons nicht kommen ohne ein Layout. Debugge das durch
                Zuletzt editiert von Christian Marquardt; 13.01.2013, 13:21.
                Christian

                Comment


                • #9
                  Das gibt der mir aus, wenn ich den Layout des Panels abfrage:
                  java.awt.FlowLayout[hgap=5,vgap=5,align=center]

                  Comment


                  • #10
                    Dann weiss ich auch nicht, warum die Buttons nicht kommen ohne ein Layout. Debugge das selbst durch
                    Christian

                    Comment


                    • #11
                      Lustigerweise konnte ich das mit der variablern Anzahl der Buttons vorhin auf meinem Desktoprechner nachvollziehen. Jetzt hier auf dem Notebook kommen immer die gewünschte Anzahl der Buttons. Muss dann doch etwas damit zu tun haben, diesen explizit zu setzen
                      Zuletzt editiert von Christian Marquardt; 13.01.2013, 13:42.
                      Christian

                      Comment


                      • #12
                        Hm Schade, trotzdem Danke für die Hilfe, hab auf jeden Fall einiges dazu gelernt!
                        So richtig verstehe ich immer noch nicht wieso die Anzahl der Buttons zufällig ist, aber hab das jetzt mit Null-Layout gemacht und die Buttons durch .setBounds gesetzt und da kommen immer alle =)
                        Edit: Bei mir kommen die zufällige Anzahl der Buttons auf meinem Notebook, also liegt nicht daran, ob man einen Desktoprechner oder Notebook verwendet.

                        Comment


                        • #13
                          Nachdem ich den neuen Programmcode (mit Null-Layout und setBounds) mehrmals ausgeführt habe, bekam ich wieder das selbe Problem. Ich habe aber jetzt die Lösung selber gefunden.
                          Die Buttons werden immer alle erstellt, aber nicht immer alle angezeigt. Wenn man aber über das ganze Programm mit der Maus geht, dann erscheinen die Buttons, wenn man mit der Maus über die Stelle, wo sie sich befinden, geht. Ich hab das "frame.setVisible(true)" jetzt ans Ende des Programms geschrieben, und dadurch werden jetzt immer alle 49 Buttons angezeigt =)

                          Comment


                          • #14
                            sehr schön
                            Christian

                            Comment

                            Working...
                            X