2016-04-26 10 views
1

Ich versuche, eine Einheit Konvertierungsprogramm mit Jbuttons in einem jpanel machen. Wenn ich jedoch das Programm starte, erscheint das erste Fenster, ich wähle "Länge". Nun, es zeigt 8 Tasten auf jeder Seite, nach der Auswahl einer davon, die Hälfte der Tasten funktioniert nicht mehr, nur die rechte Spalte jeder Seite funktioniert.Java-Hälfte der JButtons aufhören zu arbeiten in JPanel

public class Gui extends JFrame { 

private JButton Subject[] = new JButton[8]; 
private String SubjNames[] = {"Length", "Mass", "Currency", "Temperature", "Time", "Speed", "Data", "Cooking"}; 
private JButton Length1[] = new JButton[8]; 
private JButton Length2[] = new JButton[8]; 
private String LengNames[] = {"inches", "feet", "yards", "miles", "millimeters", "centimeters", "meters", "kilometers"}; 
private JTextField convertedFrom; 
private JTextField amountFrom; 
private JTextField convertedTo; 
private JTextField amountTo; 
private String from; 
private String CTo; 
private String ATo; 
private int SubjectLocX = 40; 
private int SubjectLocY = 50; 
private int Length1LocX = 40; 
private int Length1LocY = 150; 
private int Length2LocX = 330; 
private int Length2LocY = 150; 
private int t = 0; 

public Gui(){ 

    super("Converter"); 
    setLayout(null); 

    System.out.println("yes"); 

    for (int i = 0; i<8; i++) { 
    Subject[i] = new JButton(SubjNames[i]); 
    Subject[i].setLocation(SubjectLocX,SubjectLocY); 
    Subject[i].setSize(200,50); 
    add(Subject[i]); 
    if (i < 3) { 
     SubjectLocX = 40; 
     SubjectLocY += 100; 
    } else if (i == 3) { 
     SubjectLocX = 330; 
     SubjectLocY = 50; 
    } else if (i > 3) { 
     SubjectLocY += 100; 
     } 
    } 

    HandlerClass handler = new HandlerClass(); 

    for (int i = 0; i<8; i++) { 
    Subject[i].addActionListener(handler); 
    } 


    for (int i = 0; i<8; i++) { 
    Length1[i] = new JButton(SubjNames[i]); 
    Length2[i] = new JButton(SubjNames[i]); 
    } 

    for (int i = 0; i<8; i++) { 
     Length1[i].addActionListener(handler); 
     Length2[i].addActionListener(handler); 
     } 

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setSize(600,500); 
    setLocation(400,200); 
    setVisible(true); 
} 

public void Step2() { 

    for (int i = 0; i<8; i++) { 
     remove(Subject[i]); 
    } 
    for (int i = 0; i<8; i++) { 
     remove(Length1[i]); 
     remove(Length2[i]); 
    } 

    HandlerClass handler = new HandlerClass(); 

    convertedFrom = new JTextField(from, 20); 
    convertedFrom.setEditable(false); 
    convertedFrom.setLocation(40,50); 
    convertedFrom.setSize(200,30); 
    add(convertedFrom); 
    convertedTo = new JTextField(CTo, 20); 
    convertedTo.setEditable(false); 
    convertedTo.setLocation(330,50); 
    convertedTo.setSize(200,30); 
    add(convertedTo); 
    amountFrom = new JTextField("amount", 20); 
    amountFrom.setLocation(40,100); 
    amountFrom.setSize(200,30); 
    add(amountFrom); 
    amountTo = new JTextField(ATo, 20); 
    amountTo.setEditable(false); 
    amountTo.setLocation(330,100); 
    amountTo.setSize(200,30); 
    add(amountTo); 

    for (int i = 0; i<8; i++) { 
     Length1[i].setLocation(Length1LocX, Length1LocY); 
     Length1[i].setSize(90, 50); 
     add(Length1[i]); 
     if (i < 3) { 
      Length1LocX = 40; 
      Length1LocY += 100; 
     } else if (i == 3) { 
      Length1LocX = 150; 
      Length1LocY = 150; 
     } else if (i > 3) { 
      Length1LocY += 100; 
      } 
     Length2[i].setLocation(Length2LocX, Length2LocY); 
     Length2[i].setSize(90, 50); 
     add(Length2[i]); 
     if (i < 3) { 
      Length2LocX = 330; 
      Length2LocY += 100; 
     } else if (i == 3) { 
      Length2LocX = 440; 
      Length2LocY = 150; 
     } else if (i > 3) { 
      Length2LocY += 100; 
      } 
    } 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setSize(600,600); 
    setLocation(400,200); 
    setVisible(true); 
} 
private class HandlerClass implements ActionListener { 
    public void actionPerformed(ActionEvent event) { 

     for (int i = 0; i<8; i++) { 
      if (event.getSource() == Length1[i]) { 
       from = event.getActionCommand(); 
      } 
      if (event.getSource() == Length2[i]) { 
       CTo = event.getActionCommand(); 
      } 
     } 

     Step2(); 
    } 
} 
}` 

(Hinweis: Ich habe keine Importe oder Hauptmethode in Code oben, aber ist in Echtprogramm). Der Konstruktor erstellt die JButtons und Aktionslistener. Bei der Methode step2() werden die Schaltflächengröße, der Speicherort und das Fenster erstellt und neu erstellt. (Length1 und Length2 JButtons sind was hier vermasselt). Ich weiß nicht, warum die Hälfte der Knöpfe nach dem zweiten Mal nicht mehr funktioniert.

+0

Vermeiden Sie 'null' Layouts, pixelgenaue Layouts sind eine Illusion in modernem Design. Es gibt zu viele Faktoren, die die individuelle Größe von Komponenten beeinflussen, von denen Sie keine kontrollieren können. Swing wurde entwickelt, um mit Layout-Managern im Kern zu arbeiten, das Verwerfen dieser führt zu keinem Ende der Probleme und Probleme, die Sie mehr und mehr Zeit verbringen werden, versuchen zu beheben – MadProgrammer

Antwort

2

Wenn Sie eine der 16 Tasten auswählen, wird die Methode Step2() erneut aufgerufen, und die Tasten werden verschoben, ohne dass Ihre Standortwerte zurückgesetzt werden. Wenn Sie die Standortvariablen in der Step2() - Methode zurücksetzen, funktionieren die Schaltflächen. Wie folgt aus:

step2() 
    Length1LocX = 40; 
    Length1LocY = 150; 
    Length2LocX = 330; 
    Length2LocY = 150; 
    [rest of method....] 

aber vom Kurs wollen Sie nicht step2() aufrufen jedes Mal eine Schaltfläche geklickt wird .....

+0

Ehrfürchtig, ich habe nicht einmal daran gedacht, diese wieder neu einzustellen. Es funktioniert jetzt, vielen Dank! : p – airide101

+0

Gern geschehen, aber bitte schaut euch das Antwortformular @AJNeufeld an! Er hat auch einen Punkt .... –

2

Sie erstellen und das Hinzufügen von JTextField UI-Elemente und sie mehrere Male an der gleichen Stelle hinzufügen, und nie Entfernen von ihnen:

  • convertedFrom
  • amountFrom
  • convertedTo
  • amountTo

Diese werden oben oder unter den vorherigen gestapelt; der Benutzer kann Text zu den oberen hinzufügen, und das Programm kann auf die darunter liegenden verdeckten schreiben oder lesen, was das Programm daran hindert, wie beabsichtigt zu funktionieren.

+0

Ich vergaß ich musste diese sowie die Schaltflächen jedes Mal entfernen Methode wird aufgerufen. Vielen Dank! – airide101

Verwandte Themen