Erste Schritte Zahlen einlesen und auswerten

Hallo zusammen,

ich bin sowohl hier komplett neu, als auch bei der Erlernung von Java. Ich habe mir zwei Bücher gekauft, die ich zunächst durcharbeiten will. In dem einen "Programmieren lernen mit Java" Hans Peter Habelitz bin ich gerade in Übung 8 und soll dort ein Programm schreiben, was eine Notenbilanz erstellt. Ich möchte das Programm von ihm aber nicht übernehmen, weil ich sonst nichts lerne. Aktuell bin ich bei einem Problem, was ich mit meinem aktuellen Wissenstand leider nicht lösen kann und hoffe, ihr könnt mir helfen.
Ausgangspunkt:
Ich habe einen Butten ("Übernehmen2"), der mir ein privates void uebernehmen2() ausführen soll.
In uebernehmen2() habe ich mir eine Notenanzahl als Int angelegt, die von der vorherigen Eingabe ausgelesen wird. Der Bediener soll so oft auf den Button "Übernehmen2" klicken können, bis die Notenanzahl erreicht ist.
Dafüür ist denke ich, der Ansatz bis zum while vorerst richtig. Nach jedem Durchlauf der Schleife soll i 1 höher gezählt werden, weshalb ich i++ gemacht habe. Jetzt erkennt das Programm aber schon einmal nicht die beiden lblNotennummer und lbl Notenanzahl, obwohl ich die anderen Frames, die sich in dem GUI befinden auch ansprechen kann (also wie tfNote oder tfAnzNoten). Könnt ihr mir zum Einen sagen, warum der die nicht erkennt und zum anderen einen Hinweis geben, wie ich es mache, dass er die Noten, die jedes Mal eingegeben werden in einer "separaten" Variable ausgibt, damit ich damit weiter rechnen kann?

Als Beispiel habe ich meinen aktuellen Stand mal angehängt.

Danke euch schonmal für eure Hilfe.
LG Markus
Java:
private void uebernehmen2(){
    int notenanzahl = Integer.parseInt(tfAnzNoten.getText());
    int i=0, summe;
    while (i<=notenanzahl){
        summe = Integer.parseInt(tfNote.getText());
       
        //System.out.print(summe);
        tfNote.setText("");
        tfNote.requestFocus();
        i++;
        lblNotennummer.setText(i+1 +". Note");
        lblNotenanzahl.setText(i+1);
       
        break;
 
Ich würde vermuten, dass du einen Layout Manager verwendest, der in keinem Fall zu wenig Platz hat.

1.
Du kannst mal einen Rahmen hier setzen und schauen, ob das Label an der gewünschten stellen angezeigt wird.

lblNotennummer.setBorder(BorderFactory.createLineBorder(Color.GREEN));
lblNotenanzahl.setBorder(BorderFactory.createLineBorder(Color.GREEN));


2.
Das Label ist "zusammengebrochen". Ich meine damit, dass es keine höhe und keine breite bekommen hat. Auch hier würde der Rahmen erstmal helfen. Spiel mal mit dem Beispiel setPreferredSize() herum. Am Besten du kombinierst beides:

lblNotennummer.setPreferredSize(new Dimension(300, 200));
lblNotennummer.setBorder(BorderFactory.createLineBorder(Color.GREEN));


Tip:
Wenn du setResizable(false); in deinem Quellcode stehen hast, kommentiere es erstmal aus. Ziehe etwas an keinem Fenster und schau dir mal an, wie sich Layout Manager verhalten. Speziell wenn sie keinen Platz zum anzeigen von Komponenten haben.


PS - Zu deinem Post:
Schau dir bitte mal deinen Quellcode Beispiel an. Meine ersten Gedanken waren: "Was ist denn das für ein syntaktischer kauderwelsch".

Technisch Schnitzer:
- Fehlende schließende Klammer in der while Schleife
- ein break ohne Sinn.

- tfNote.setText(""); immer wieder pro Schleifendurchlauf leeren ?!?
- Anfordern von tfNote.requestFocus(); pro Schleifendurchlauf macht kein Sinn. Erst wenn du mit deiner Berechnung fertig bist, dass den Focus anfordern.
- Mit lblNotennummer.setText(i+1 +". Note"); und lblNotenanzahl.setText(i+1); ist es das gleiche.

Faschlische Schnitzer:
- Du hast erwähnt, dass du ein Programm schreiben willst, dass eine Notenbilanz berechnet - Im Quellcode nicht zu erkennen.


Whatever. Ich hatte gerade etwas Langeweile und hab dir mal ein Programm zusammengebaut, dass eine Notenbilanz (Quasi ein paar Noten) zusammenrechnet.

Zum einen hast du dann nochmal ein weiteres Beispiel und ich hab dir gleich noch den Effekt mir den "nicht" sichtbaren Komponenten eingebaut,

Vielleicht hilft es dir weiter.


Grüße
Frix
 

Anhänge

1.) Dein break beended auf jeden Fall schonmal die Schleife nach dem ersten Durchlauf.
Aber wenn ich das richtig verstanden hab, willst du sowieso nichts automatisch hochzählen, sondern so lange auf den Button drücken bis es hochgesetzt wird.
Daher, nimm die schleife und das break einfach raus.

2.)
nach den setText() aufrufen solltest du noch sowas hier machen:
Code:
panel.repaint();
panel.validate();
ich weiß nicht, wie dein Panel heißt, aber das solltest du ganz am Ende einfügen 😉
Das bewirkt das die Änderungen auch angezeigt werden 😀
 
Hallo zusammen und danke für die Antworten. Ich habe nur einen Stück vom Quelltext entnommen, weil ich gerade an der Stelle hänge. Ich denke nicht, dass es etwas mit der Größe des Labels zutun hat, da ich das Label in anderen Operationen auch ansprechen kann.
ich habe im Buch ein wenig weiter gelesen und versuche das Problem jetzt einfach mit einem Array. Denn der speichert ja alle Zahlen, die eingegeben werden. Das sollte die Lösung für das Problem sein. Die Frage für mich persönlich wäre nur, wie man sowas ohne Array löst. Also ich habe ein Textfeld, in das eine Zahl eingegeben wird und der Bediener darf so lange Zahlen eingeben und entweder mit Enter oder eben mit dem Button die Zahlen übernehmen, bis die vorgegebene Anzahl erreicht ist. Die eingegebenen Zahl aus jedem Durchlauf soll gespeichert werden, später ausgegeben werden und summiert werden. Aus VBA kenne ich sowas, was aber nicht das Problem wäre, wenn ich die Zahl jedes Mal in eine andere Zelle speichern kann. Das geht ja hier aber nicht. Solltet ihr da noch einen Hinweis haben, bin ich euch dankbar. Ansonsten werde ich hier sicherlich noch ziemlich oft tätig sein. LG Markus
 
Also so wie ich das verstanden hab suchst du so ein Programm:
Java:
import java.awt.Dimension;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Fenster extends JPanel {
  private static final long serialVersionUID = 1L;
  private JTextField textfeld;
  private JButton button;
  private JLabel label;
  private int zuEreichendeZahl = 1000;

  public Fenster() {
    setPreferredSize(new Dimension(400, 100));
    baueKomponenten();
    fuegeVerhaltenHinzu();
    baueFenster();
  }

  private void baueKomponenten() {
    textfeld = new JTextField();
    textfeld.setPreferredSize(new Dimension(100, 30));
    button = new JButton("Speichern");
    label = new JLabel("0");
    label.setPreferredSize(new Dimension(100, 30));
    add(textfeld);
    add(button);
    add(label);
  }

  private void fuegeVerhaltenHinzu() {
    button.addActionListener(e -> {
      uebernehmen();
    });
    textfeld.addKeyListener(new KeyListener() {

      @Override
      public void keyTyped(KeyEvent e) {
      }

      @Override
      public void keyReleased(KeyEvent e) {
      }

      @Override
      public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_ENTER)
          uebernehmen();
      }
    });
  }

  private void uebernehmen() {
    if (textfeld.getText().matches("\\d+")) {
      int text = (Integer.parseInt(label.getText()) + Integer.parseInt(textfeld.getText()));

      if (text >= zuEreichendeZahl) {
        JOptionPane.showMessageDialog(null, "Ziel erreicht!");
        System.exit(0);
      }

      label.setText(String.valueOf(text));
    } else {
      JOptionPane.showMessageDialog(null, "Textfeld beinhaltet keine Zahl!");
      textfeld.setText("");
    }
  }

  private void baueFenster() {
    JFrame frame = new JFrame("Titel");
    frame.add(this);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    frame.setVisible(true);
  }

  public static void main(String[] args) {
    new Fenster();
  }

}
 
Hallo Viktim,

wie gesagt, mein erstes Problem war, dass ich die Labels nicht ansprechen konnte. Das Problem habe ich gelöst, indem ich nicht veränderbare Textfelder eingesetzt habe, denn die kann ich ansprechen. ( Also Bsp. lblNote.setText(""); ging nicht, weil er das lblNote nicht erkannt hat. Wenn ich aber tfNote.setText(""); nehme, dann erkennt er das und ich weiß nicht warum.
Wegen Teil 2 der Frage probiere ich gerade noch ein bisschen umher bzw. schau mir erst einmal noch einige Videos an, bevor ich weiter mache.

LG Markus
 
wie gesagt, mein erstes Problem war, dass ich die Labels nicht ansprechen konnte. Das Problem habe ich gelöst, indem ich nicht veränderbare Textfelder eingesetzt habe, denn die kann ich ansprechen. ( Also Bsp. lblNote.setText(""); ging nicht, weil er das lblNote nicht erkannt hat. Wenn ich aber tfNote.setText(""); nehme, dann erkennt er das und ich weiß nicht warum.
Geht es denn jetzt?
Wegen Teil 2 der Frage probiere ich gerade noch ein bisschen umher bzw. schau mir erst einmal noch einige Videos an, bevor ich weiter mache.
Was genau ist denn Teil 2?

EDIT: Wäre gut, wenn du mal den ganzen Code Postest.
 

Neue Themen


Zurück
Oben