Warum reagiert dieser JButton in Java nicht?
Hi, ich bin programmieranfänger und mache gerade so ein projekt , wo man ausrechnen lassen kann, wie viel Prozenz x von y ist. - Und sich den Lösungsweg dazu anzeigen kann. Dazu gibt es diesen Button den ihr im Bild unten sieht. Er erschient übrigends , sobald man auf den Berechenen - Button klickt. Wie auch immer - der Lösungsweg button funktioniert nicht bzw. es passiert nichts beim daraufklicken. Eigentlich sollte er unter sich ein JTextArea erzeugen und darin text ausgeben. Aber warum funktioniert der Button nicht? Ich check gar nichts mehr, he.
Hier ist der Code:
Und hier ist so ein ding wenn man auf run drückt:
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ß
"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
)
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ß
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.
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ß
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.
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.
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,...");
}
}
}
}
}