Hallo zusammen,
ich hab ein kleines Bruchrechenprogramm geschrieben (man kann zwei Brüche eingeben und die dann addieren, subtrahieren, multiplizieren und dividieren). Ein Bruch wird jeweils durch 2 JTextFields (Nenner und Zähler) dargestellt. Da das Ergebnis auch eine ganze Zahl sein kann gibt es drei Ergebnis TextFields (2 wenn das Ergebnis ein Bruch ist, 1 wenn das Ergebnis eine ganze Zahl ist). Das JTextField für die ganze Zahl wird am Anfang nicht angezeigt. Soweit funktioniert auch alles.
Wenn man nun aber das Programm startet und die zwei Brüch so wählt, dass wenn man sie addiert eine ganze Zahl rauskommt (also z.B. beim ersten Bruch 2/2 eingibt und dann auf addieren klickt) verschwinden alle Ergebnis-TextFields.
Nun hab ich herausgefunden das dieses Problem davon abhängt wo der Befehl:
steht. Steht dieser Befehl vor setVisible(true), dann tritt das oben beschriebene Problem auf. Steht er nach setVisible(true) tritt dieses Problem nicht auf und alles funktioniert bestens. Kann mir diese Phänomen jemand erklären?
Schon mal vielen Dank für alle Antworten.
Hier noch der komplette Code des Programms
Und hier noch der Code der GBC-Klasse
ich hab ein kleines Bruchrechenprogramm geschrieben (man kann zwei Brüche eingeben und die dann addieren, subtrahieren, multiplizieren und dividieren). Ein Bruch wird jeweils durch 2 JTextFields (Nenner und Zähler) dargestellt. Da das Ergebnis auch eine ganze Zahl sein kann gibt es drei Ergebnis TextFields (2 wenn das Ergebnis ein Bruch ist, 1 wenn das Ergebnis eine ganze Zahl ist). Das JTextField für die ganze Zahl wird am Anfang nicht angezeigt. Soweit funktioniert auch alles.
Wenn man nun aber das Programm startet und die zwei Brüch so wählt, dass wenn man sie addiert eine ganze Zahl rauskommt (also z.B. beim ersten Bruch 2/2 eingibt und dann auf addieren klickt) verschwinden alle Ergebnis-TextFields.
Nun hab ich herausgefunden das dieses Problem davon abhängt wo der Befehl:
Code:
tf_ganzzahl.setVisible(false);
steht. Steht dieser Befehl vor setVisible(true), dann tritt das oben beschriebene Problem auf. Steht er nach setVisible(true) tritt dieses Problem nicht auf und alles funktioniert bestens. Kann mir diese Phänomen jemand erklären?
Schon mal vielen Dank für alle Antworten.
Hier noch der komplette Code des Programms
Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;
import GBC.*;
import static java.lang.Math.abs;
class BruchGUI extends JFrame implements ActionListener {
private int zaehler, zaehler2, nenner, nenner2, ergZaehler, ergNenner;
//Bruch1
private JTextField tf_zaehler = new JTextField("1", 10);
private JTextField tf_nenner = new JTextField("2", 10);
//Bruch2
private JTextField tf_zaehler2 = new JTextField("2", 10);
private JTextField tf_nenner2 = new JTextField("1", 10);
//Bruch3 (Ergebnis)
private JTextField tf_ergZaehler = new JTextField("5", 10);
private JTextField tf_ergNenner = new JTextField("2", 10);
//JTextField für Ganzzahl
private JTextField tf_ganzzahl = new JTextField("1", 10);
//Labels für die Rechenzeichen
private JLabel lbl_rechenzeichen = new JLabel("+", SwingConstants.CENTER);
private JLabel lbl_gleich = new JLabel("=", SwingConstants.CENTER);
//Radiobuttons für die 4 Rechenarten
private JRadioButton rb_addieren = new JRadioButton("Addieren", true);
private JRadioButton rb_subtrahieren = new JRadioButton("Subtrahieren", false);
private JRadioButton rb_multiplizieren = new JRadioButton("Multiplizieren", false);
private JRadioButton rb_dividieren = new JRadioButton("Dividieren", false);
//Buttongroup für die 4 Radiobuttons (Rechenarten)
ButtonGroup bg_rechenarten = new ButtonGroup();
public BruchGUI() {
super("Bruchrechnen");
//Layoutfestlegen
GridBagLayout gbl = new GridBagLayout();
setLayout(gbl);
add(tf_zaehler, new GBC(0, 0, 1, 1).setFill(GBC.NONE).setWeight(0,0).setAnchor(GBC.CENTER).setInsets(2, 10, 10, 10));
add(tf_nenner, new GBC(0, 1, 1, 1).setFill(GBC.NONE).setWeight(0,0).setAnchor(GBC.CENTER).setInsets(2, 10, 10, 10));
add(lbl_rechenzeichen, new GBC(1, 0, 1, 2).setFill(GBC.NONE).setWeight(0,0).setAnchor(GBC.CENTER).setInsets(2, 10, 10, 10));
add(tf_zaehler2, new GBC(2, 0, 1, 1).setFill(GBC.NONE).setWeight(0,0).setAnchor(GBC.CENTER).setInsets(2, 10, 10, 10));
add(tf_nenner2, new GBC(2, 1, 1, 1).setFill(GBC.NONE).setWeight(0,0).setAnchor(GBC.CENTER).setInsets(2, 10, 10, 10));
add(lbl_gleich, new GBC(3, 0, 1, 2).setFill(GBC.NONE).setWeight(0,0).setAnchor(GBC.CENTER).setInsets(2, 10, 10, 10));
add(tf_ergZaehler, new GBC(4, 0, 1, 1).setFill(GBC.NONE).setWeight(0,0).setAnchor(GBC.CENTER).setInsets(2, 10, 10, 10));
add(tf_ergNenner, new GBC(4, 1, 1, 1).setFill(GBC.NONE).setWeight(0,0).setAnchor(GBC.CENTER).setInsets(2, 10, 10, 10));
add(tf_ganzzahl, new GBC(4, 0, 1, 2).setFill(GBC.NONE).setWeight(0,0).setAnchor(GBC.CENTER).setInsets(2, 10, 10, 10));
add(rb_addieren, new GBC(0, 2, 1, 1).setFill(GBC.NONE).setWeight(0,0).setAnchor(GBC.CENTER).setInsets(2, 10, 10, 10));
add(rb_subtrahieren, new GBC(1, 2, 1, 1).setFill(GBC.NONE).setWeight(0,0).setAnchor(GBC.CENTER).setInsets(2, 10, 10, 10));
add(rb_multiplizieren, new GBC(2, 2, 1, 1).setFill(GBC.NONE).setWeight(0,0).setAnchor(GBC.CENTER).setInsets(2, 10, 10, 10));
add(rb_dividieren, new GBC(3, 2, 1, 1).setFill(GBC.NONE).setWeight(0,0).setAnchor(GBC.CENTER).setInsets(2, 10, 10, 10));
//Tabulatorreihenfolge festlegen
tf_ergZaehler.setFocusable(false);
tf_ergNenner.setFocusable(false);
rb_addieren.setFocusable(false);
rb_subtrahieren.setFocusable(false);
rb_multiplizieren.setFocusable(false);
rb_dividieren.setFocusable(false);
//Schriftgröße und Stil der Labels festlegen
lbl_rechenzeichen.setFont(new Font("", Font.BOLD, 23));
lbl_gleich.setFont(new Font("", Font.BOLD, 23));
//Ergebnis TextFields
tf_ergZaehler.setEditable(false);
tf_ergNenner.setEditable(false);
tf_ganzzahl.setEditable(false);
//RadioButtons zu einer Gruppe hinzufügen
bg_rechenarten.add(rb_addieren);
bg_rechenarten.add(rb_subtrahieren);
bg_rechenarten.add(rb_multiplizieren);
bg_rechenarten.add(rb_dividieren);
//ActionCommand für die RadioButtons setzen
rb_addieren.setActionCommand("ad");
rb_subtrahieren.setActionCommand("su");
rb_multiplizieren.setActionCommand("mu");
rb_dividieren.setActionCommand("di");
//ActionCommand für die TextFields setzen
tf_zaehler.setActionCommand("z");
tf_nenner.setActionCommand("n");
tf_zaehler2.setActionCommand("z2");
tf_nenner2.setActionCommand("n2");
//RadioButtons und TextField beim Listener-Objekt registrieren
rb_addieren.addActionListener(this);
rb_subtrahieren.addActionListener(this);
rb_multiplizieren.addActionListener(this);
rb_dividieren.addActionListener(this);
tf_zaehler.addActionListener(this);
tf_nenner.addActionListener(this);
tf_zaehler2.addActionListener(this);
tf_nenner2.addActionListener(this);
//Farben
rb_addieren.setBackground(Color.LIGHT_GRAY);
rb_subtrahieren.setBackground(Color.LIGHT_GRAY);
rb_multiplizieren.setBackground(Color.LIGHT_GRAY);
rb_dividieren.setBackground(Color.LIGHT_GRAY);
getContentPane().setBackground(Color.LIGHT_GRAY);
setSize(750, 250);
setVisible(true);
tf_ganzzahl.setVisible(false);
}
public void actionPerformed(ActionEvent e) {
String s = e.getActionCommand();
//Auswahl welche Rechenoperation gewählt wurde
if (s.equals("ad")) addieren();
else if (s.equals("su")) subtrahieren();
else if (s.equals("mu")) multiplizieren();
else if (s.equals("di")) dividieren();
if (s.equals("z") || s.equals("n") || s.equals("z2") || s.equals("n2")) {
if (rb_addieren.isSelected()) addieren();
else if (rb_subtrahieren.isSelected()) subtrahieren();
else if (rb_multiplizieren.isSelected()) multiplizieren();
else if (rb_dividieren.isSelected()) dividieren();
}
}
private void werteHolen() {
//Bruch 1
zaehler = Integer.parseInt(tf_zaehler.getText());
nenner = Integer.parseInt(tf_nenner.getText());
//Bruch 2
zaehler2 = Integer.parseInt(tf_zaehler2.getText());
nenner2= Integer.parseInt(tf_nenner2.getText());
}
private void ausgeben() {
if ((ergZaehler != 0) && (ergNenner != 1)) {
tf_ergZaehler.setText("" + ergZaehler);
tf_ergNenner.setText("" + ergNenner);
tf_ergNenner.setVisible(true);
tf_ergZaehler.setVisible(true);
tf_ganzzahl.setVisible(false);
}
if (ergNenner == 1) {
tf_ganzzahl.setText("" + ergZaehler);
tf_ergNenner.setVisible(false);
tf_ergZaehler.setVisible(false);
tf_ganzzahl.setVisible(true);
}
if (ergZaehler == 0) {
tf_ganzzahl.setText("" + 0);
tf_ergNenner.setVisible(false);
tf_ergZaehler.setVisible(false);
tf_ganzzahl.setVisible(true);
}
}
private void kuerzen() {
int min;
if (abs(ergZaehler) < abs(ergNenner)) min = abs(ergZaehler);
else min = abs(ergNenner);
for (int i = min; i >= 2; i--) {
if ( ((ergZaehler % i) == 0) && ((ergNenner % i) == 0)) {
ergZaehler = ergZaehler / i;
ergNenner = ergNenner / i;
}
}
ausgeben();
}
private void addieren() {
lbl_rechenzeichen.setText("+");
werteHolen();
ergZaehler = (zaehler * nenner2) + (zaehler2 * nenner);
ergNenner = nenner * nenner2;
kuerzen();
}
private void subtrahieren() {
lbl_rechenzeichen.setText("-");
werteHolen();
ergZaehler = (zaehler * nenner2) - (zaehler2 * nenner);
ergNenner = nenner * nenner2;
kuerzen();
}
private void multiplizieren() {
lbl_rechenzeichen.setText("*");
werteHolen();
ergZaehler = zaehler * zaehler2;
ergNenner = nenner * nenner2;
kuerzen();
}
private void dividieren() {
lbl_rechenzeichen.setText("/");
werteHolen();
ergZaehler = zaehler * nenner2;
ergNenner = nenner * zaehler2;
kuerzen();
}
}
public class BruchAusführen {
public static void main(String[] args) {
BruchGUI b = new BruchGUI();
b.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
Und hier noch der Code der GBC-Klasse
Code:
package GBC
import java.awt.*;
public class GBC extends GridBagConstraints
{
public GBC(int gridx, int gridy)
{
this.gridx = gridx;
this.gridy = gridy;
}
public GBC(int gridx, int gridy, int gridwidth, int gridheight)
{
this.gridx = gridx;
this.gridy = gridy;
this.gridwidth = gridwidth;
this.gridheight = gridheight;
}
public GBC setAnchor(int anchor)
{
this.anchor = anchor;
return this;
}
public GBC setFill(int fill)
{
this.fill = fill;
return this;
}
public GBC setWeight(double weightx, double weighty)
{
this.weightx = weightx;
this.weighty = weighty;
return this;
}
public GBC setInsets(int distance)
{
this.insets = new Insets(distance, distance, distance, distance);
return this;
}
public GBC setInsets(int top, int left, int bottom, int right)
{
this.insets = new Insets(top, left, bottom, right);
return this;
}
public GBC setIpad(int ipadx, int ipady)
{
this.ipadx = ipadx;
this.ipady = ipady;
return this;
}
}