Warum reagiert dieser JButton in Java nicht?

2 Antworten

Hey,

auf den Bildern ist das nicht so leicht zu erkennen, besser Text kopieren und als Code formatieren (gibt hier extra so eine Format-Option).

So wie ich das sehe fügst Du deinem button2 erst den ActionListener hinzu, wenn button1 gedrückt wird.
Mach das mal vorher, also schon wenn Du button1 den ActionListener gibst, dann eben auch button2.

Du kannst den button2 auch vorher schon hinzufügen, genau wie button1 und dann machst Du button2.setVisible(false);

Und erst in der actionPerformed Methode dann button2.setVisible(true); damit er sichtbar wird.

Gruß


BinarySuns 
Fragesteller
 02.05.2022, 18:45

Hier ist dieser Code:)

import java.awt.Font;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.JTextArea;

import javax.swing.JTextField;

import java.awt.Dimension;

import java.awt.event.*;

public class RechnerPage implements ActionListener {

 

    JFrame frame = new JFrame();

    JLabel label = new JLabel();

    JLabel label2 = new JLabel();

    JLabel label3 = new JLabel();

    JLabel label4 = new JLabel();

    JTextField textfield = new JTextField();

    JTextField textfield2 = new JTextField();

    JButton button = new JButton();

    JButton button2 = new JButton();

    JPanel panel = new JPanel();

    JTextArea textarea = new JTextArea(5,20);

    JScrollPane scrollpane = new JScrollPane(textarea);

public void werteEingeben(ActionEvent event) {

    int zähler = Integer.parseInt(textfield.getText());

    int nenner = Integer.parseInt(textfield2.getText());

 

   

   

   

   

}

RechnerPage() {

    frame.setLayout(null);

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    frame.setSize(400, 300);

 

 frame.add(label);

 frame.add(label2);

 frame.add(label3);

 frame.add(label4);

frame.add(textfield);

frame.add(textfield2);

frame.add(button);

frame.setVisible(true);

    label.setText("Wie viel Prozent ist...");

    label.setBounds(110, 0, 400, 50);

    label.setFont(new Font("null", Font.BOLD, 20));

textfield.setPreferredSize(new Dimension(50,40));

textfield.setBounds(10, 65, 50,35);

label2.setText("von");

label2.setBounds(70, 65, 20, 35);

textfield2.setBounds(100, 65, 50,35);

label3.setText("?");

label3.setBounds(160, 65, 50, 35);

 

label4.setBounds(5, 100, 500, 50);

label4.setText("Ergebniss =");

label4.setFont(new Font(null, Font.BOLD,15));

button.setText("Berechnen");

button.setBounds(200,65, 120,35);

button.setFont(new Font(null,Font.BOLD,13));

button.addActionListener(this);

}

@Override

public void actionPerformed(ActionEvent e) {

    // TODO Auto-generated method stub

if (e.getSource()==button) {

int nenner = Integer.parseInt(textfield2.getText());

int zähler = Integer.parseInt(textfield.getText());

if (nenner<100) {

double multiplikationsfaktor = (double)100/nenner;

double neuerNenner = (double)nenner * multiplikationsfaktor;

double neuerZähler = zähler * multiplikationsfaktor;

double ergebniss = (double)neuerZähler;

label4.setText("Ergebniss = " + neuerZähler/neuerNenner + " " + "=" + " " + ergebniss + " " + "%");

}

if (nenner>100) {

    double multiplikationsfaktor = (double)nenner/100;

    double neuerNenner = (double)nenner / multiplikationsfaktor;

    double neuerZähler = zähler * multiplikationsfaktor;

    double ergebniss = (double)neuerZähler;

        label4.setText("Ergebniss = " + neuerZähler/neuerNenner + " " + "=" + " " + ergebniss + " " + "%");

    }

    if (nenner==100) {

 double ergebniss = (double)zähler;

label4.setText("Ergebniss = " + zähler/nenner + " " + "=" + " " + ergebniss + " " + "%");

        }

frame.add(button2);

button2.setText("Lösungsweg anzeigen");

button2.setBounds(5,150, 180,35);

button2.setFont(new Font(null, Font.BOLD,13));

button2.addActionListener(this);

if (e.getSource()==button2) {

   

panel.setBounds(5, 200, 200, 75);

frame.add(panel);

frame.add(textarea);

textarea.setText("");

textarea.setPreferredSize(new Dimension(200,75));

textarea.setLineWrap(true);

textarea.setWrapStyleWord(true);

panel.add(scrollpane);  

   

 if (nenner < 100) {

     textarea.setText("Hallo,...");

 }  

   

   

   

}

   

}

}

}

0
BinarySuns 
Fragesteller
 02.05.2022, 18:46
@BinarySuns

"So wie ich das sehe fügst Du deinem button2 erst den ActionListener hinzu, wenn button1 gedrückt wird.

Mach das mal vorher, also schon wenn Du button1 den ActionListener gibst, dann eben auch button2."
Wie mache ich das den voher so vom code her? (sorry ich versteh nur 0,5von diesem gui dings da thema bis jetzt

)

0
AldoradoXYZ  02.05.2022, 19:28
@BinarySuns

Nun, Du entfernst die Zeile mit

button2.addActionListener(this)

und fügst die mal direkt unter dem

button.addActionListener(this);

ein.

Wenn das nicht reicht, dann gucke ich mal genauer :D

Mehrfach ActionListener hinzufügen ist eh nicht so toll. Du machst das bei jedem actionPerformed vom button1. Du sammelst im Grunde ActionListener.

Gruß

0
regex9  02.05.2022, 19:41
@BinarySuns

Noch eine Anmerkung zu deiner Methodik, die GUI zu bauen.

Vergiss dieses Antipattern

frame.setLayout(null);

besser schnell wieder. Ein Kernkonzept von Swing ist die Anordnung aller Komponenten via Layout Manager. Dieses Konzept hebelst du an dieser Stelle einfach aus und schaffst die Grundlage für unflexible / nutzerunfreundliche Oberflächen.

Beschäftige dich also mit Layout Managers. Die setBounds-Methode kannst du in diesem Zuge auch gleich komplett vergessen. Zu bevorzugen wäre setPreferredSize.

Wenn dir das zu kompliziert ist, nimm einen Swing Builder, wie er in NetBeans, Eclipse oder IntelliJ integriert ist. Mit dem kannst du deine Oberfläche via Drag&Drop zusammenbauen.

Rufe des Weiteren setVisible erst auf, sobald alle Komponenten auf deinem Frame zugefügt wurden - er also startklar ist. Wenn du es vorher tust, ist es wahrscheinlich, dass der Frame mehrmals komplett neugezeichnet werden muss, um den aktuellen Stand zu präsentieren. Dieser Aufwand ist vermeidbar.

0
AldoradoXYZ  02.05.2022, 19:49
@regex9

Wobei, als Anfänger finde ich das Null-Layout völlig okay.

Hab auch so angefangen ;D
Erst mal irgendwas ans Laufen bekommen. Die Layouts muss man ja auch erst mal verstehen und bis die machen was man will dauert auch.

Gruß

0
regex9  02.05.2022, 20:01
@AldoradoXYZ
Erst mal irgendwas ans Laufen bekommen.

Mein Verweis auf existierende Swing Builder war nicht grundlos. 😉

Zudem vermeidet man so auch verschiedene Probleme:

  • Fehler, die aufgrund fehlender Layout Managers auftreten (der Klassiker sind fehlende oder abgeschnittene Komponenten)
  • Man muss sich später dazu überwinden, nicht mehr auf dieses Antipattern zurückzugreifen und stattdessen tatsächlich mit Layout Managern auseinandersetzen. Meiner Erfahrung nach macht das nicht jeder.
0

Vielleicht siehst du die Lösung, wenn du deinen Quelltext so formatierst, dass die Einrückung stimmt.

Wenn du deinen grauenhaft bzw. gar nicht formatierten Quelltext als Screenshot hier einstellst, mag niemand auf Fehlersuche gehen.