2016-05-06 54 views
-1

我有可能微不足道的问题,但我花了几个小时寻找答案。爪哇秋千 - 操纵的GUI

我想创建一个按钮(ENTER按钮),一旦点击,删除GUI上的某些组件(如numpad)。问题在于,定义一旦点击按钮后执行的指令的类没有看到组件。我试图给这个类添加implements ATM,但是然后控制台返回了非常奇怪的错误(执行时)。有没有“干净”的方式来做到这一点?

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); 
    } 

} 

回答

-4

我不确定你试图删除哪些组件,但是你的问题很明显。 ATM类中定义的所有组件都不公开。从其他课程操纵这些组件的一种方法是将其设置为公开。

最简单的方法是将它们声明为“公共静态”,并通过ATM类静态引用它们。根据您的情况,您可能需要多个ATM实例,在这种情况下,您不会将其声明为静态。

这里是好消息了另一个问题:Difference between public static and private static variables

+0

我一直有理解静态和非静态的东西的问题。无论如何,它工作,谢谢! – Jojko

+3

已经足够坏了,你建议将字段设置为'public',但是'static',这只是显而易见的错误和令人难以置信的糟糕的建议,这两个问题 – MadProgrammer

+0

我不知道它是怎么回事。如果他想操纵其他班级的组件,那么这是做这件事的方法之一......我的答案没有错。 – znick

2

到您问题的解决方法很简单。您需要为您ButtonPresser类与ATM类谈话某种程度上,这是一个Observer Pattern

的想法是一个典型的例子,你会提供某种事件通知您ButtonPresser在一定条件下触发,那么你的班级会监听这些事件,然后根据这些事件决定应该做什么。

这不是ButtonPresser的责任来修改ATM状态,只是让我们很清楚的。

你现在搬进的Model-View-Controller的境界,这可以为您提供一种手段,利用CardLayout,这将进一步降低你的问题的总体复杂性,同时也隔离责任和解耦代码