2016-05-06 14 views
-1

Ich habe wahrscheinlich triviales Problem, aber ich habe Stunden damit verbracht, nach Antwort zu suchen.Java Swing - Manipulation der GUI

Ich möchte eine Schaltfläche (Schaltfläche EINGABE) erstellen, die einmal geklickt hat, entfernt bestimmte Komponenten auf der Benutzeroberfläche (wie Numpad). Das Problem besteht darin, dass die Klasse, die Anweisungen definiert, die ausgeführt werden sollen, wenn die Schaltfläche einmal angeklickt wurde, die Komponenten nicht sieht. Ich habe versucht, implements ATM zu dieser Klasse hinzuzufügen, aber dann die Konsole zurückgegeben sehr seltsame Fehler (bei der Ausführung). Gibt es einen "sauberen" Weg, dies zu tun?

import java.awt.*; 
import javax.swing.*; 
import java.awt.event.*; 

public class ATM extends JFrame{ 

// Container 
int state = 0; // PIN screen 

// ELEMENTS 
JPanel container = new JPanel(); 
JTextArea display = new JTextArea("Please enter your PIN", 10, 50); 
JTextField inputArea = new JTextField(""); 
JPanel buttons = new JPanel(); 
JButton one = new JButton("1"); 
JButton two = new JButton("2"); 
JButton three = new JButton("3"); 
JButton four = new JButton("4"); 
JButton five = new JButton("5"); 
JButton six = new JButton("6"); 
JButton seven = new JButton("7"); 
JButton eight = new JButton("8"); 
JButton nine = new JButton("9"); 
JButton zero = new JButton("0"); 
JButton clear = new JButton("Clear"); 
JButton enter = new JButton("Enter"); 
JButton quit = new JButton("Quit"); 

// EVENTS 
ButtonPresser buttonPress = new ButtonPresser(inputArea, display); 
EnterPresser enterPress = new EnterPresser(inputArea, display, state, buttons); 

ATM(){ 
super("ATM Cash Machine"); 
buildGUI(); 
pack(); 
setVisible(true); 
} 

private void buildGUI(){ 

    // EVENT BINDINGS 
    one.addActionListener(buttonPress); 
    two.addActionListener(buttonPress); 
    three.addActionListener(buttonPress); 
    four.addActionListener(buttonPress); 
    five.addActionListener(buttonPress); 
    six.addActionListener(buttonPress); 
    seven.addActionListener(buttonPress); 
    eight.addActionListener(buttonPress); 
    nine.addActionListener(buttonPress); 
    zero.addActionListener(buttonPress); 
    clear.addActionListener(buttonPress); 
    quit.addActionListener(buttonPress); 
    enter.addActionListener(enterPress); 

    // ELEMENT SETTINGS 
    inputArea.setEditable(false); 
    display.setEditable(false); 

    container.setLayout(new BoxLayout(container, BoxLayout.PAGE_AXIS)); 
    container.add(display); 
    container.add(inputArea); 

    // Numeric pad 
    buttons.setLayout(new GridLayout(5,3)); 
     buttons.add(one); 
     buttons.add(two); 
     buttons.add(three); 
     buttons.add(four); 
     buttons.add(five); 
     buttons.add(six); 
     buttons.add(seven); 
     buttons.add(eight); 
     buttons.add(nine); 
     buttons.add(clear); 
     buttons.add(zero); 
     buttons.add(enter); 
     buttons.add(quit); 
    container.add(buttons); 

add(container, BorderLayout.NORTH); 
} 

// Main method 
public static void main(String[] args){ 
    ATM atm = new ATM(); 
} 
} 

class ButtonPresser implements ActionListener{ 

private JTextField iField; 
private JTextArea oArea; 

ButtonPresser(JTextField in, JTextArea out){ 

iField = in; 
oArea = out; 

} 

public void actionPerformed(ActionEvent e){ 

switch(e.getActionCommand()){ 
    case "Quit": 
    System.exit(0); 
    break; 
    case "Clear": 
    iField.setText(""); 
    break; 
    default: 
    String fieldText = iField.getText(); 
    if(fieldText.length() < 4){ 
     iField.setText(fieldText+e.getActionCommand()); 
    } 
    break; 

} 


} 

} 
class EnterPresser implements ActionListener{ 

    private JTextField iField; 
private JTextArea oArea; 
private int state; 
private JPanel buttons; 

private final String PIN = "1234"; 

EnterPresser(JTextField in, JTextArea out, int st, JPanel but){ 

iField = in; 
oArea = out; 
state = st; 
buttons = but; 

} 

public void actionPerformed(ActionEvent e){ 

if(state == 0){ 
    String fieldText = iField.getText(); 
    if(fieldText.equals(PIN)){ 
    iField.setText(""); 
    state = 1; 
    uiState0To1(); 
    } 
} 

} 

public void uiState0To1(){ 
    buttons.remove(one); 
    } 

} 

Antwort

-4

Ich bin nicht sicher, welche Komponenten Sie versuchen zu entfernen, aber Ihr Problem ist ziemlich klar. Alle in der ATM-Klasse definierten Komponenten sind nicht öffentlich. Eine Möglichkeit, diese Komponenten aus anderen Klassen zu manipulieren, besteht darin, sie öffentlich zu machen.

Der einfachste Weg ist, sie als "public static" zu deklarieren und sie statisch über die ATM-Klasse zu referenzieren. Abhängig von Ihrem Fall benötigen Sie möglicherweise mehrere ATM-Instanzen. In diesem Fall würden Sie sie nicht als statisch deklarieren.

Hier ist eine weitere Frage mit guten Informationen: Difference between public static and private static variables

+0

ich immer Probleme mit dem Verständnis der statischen und nicht-statischen Sachen. Es funktioniert trotzdem, danke! – Jojko

+3

Es war schlimm genug, dass Sie vorgeschlagen haben, die Felder "öffentlich" zu machen, aber auch "statisch", das ist einfach falsch und unglaublich schlechter Rat in beiden Fällen. – MadProgrammer

+0

Ich bin mir nicht sicher, wie es falsch ist. Wenn er Komponenten aus seiner anderen Klasse manipulieren möchte, dann ist dies eine der Möglichkeiten, dies zu tun ... Es ist nichts falsch an meiner Antwort. – znick

2

Die Lösung für Ihr Problem ist einfach. Sie müssen einen Weg für Ihre ButtonPresser Klasse mit Ihrer ATM Klasse zu sprechen, dies ist ein klassisches Beispiel für ein Observer Pattern

Die Idee ist, würden Sie eine Art von Ereignisbenachrichtigung, die Ihre ButtonPresser unter bestimmten Bedingungen ausgelöst wird, dann ATM Klasse würde auf diese Ereignisse hören, würde es dann entscheiden, was es aufgrund dieser Ereignisse tun sollte.

Es ist nicht in der Verantwortung des ButtonPresser den Zustand der ATM, zu modifizieren, nur damit wir klar sind.

Sie bewegen sich nun in den Bereich der Model-View-Controller, mit dem Sie ein Mittel CardLayout zu nutzen, bieten könnte, was die Gesamtkomplexität des Problems reduzieren, sondern auch die Verantwortung isolieren und entkoppeln Code