这可能是一个愚蠢的问题,但是对于我来说,我不知道如何将数据从用户界面获取到主方法。这是针对一个学校项目,我必须在infix符号中输入计算器的数据,然后输出结果和后缀符号表达式。对不起,Switch语句的不良撰写。预先感谢。
class CalculatorFrame extends JFrame{
private String data;
public CalculatorGUI gui = new CalculatorGUI();
public void createAndShowUI(){
// CalculatorGUI gui = new CalculatorGUI();
CalculatorMenu menu = new CalculatorMenu(gui);
JFrame frame = new JFrame("Reverse Polish Notation Calculator");
frame.getContentPane().add(gui.getMainPanel());
frame.setJMenuBar(menu.getJMenuBar());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
if(gui.getIsDone()){
//setData(gui);
}
}
public void setData(CalculatorGUI gui){
this.data = gui.getDisplay().getText();
}
public String getData(){
return this.data;
}
}
class CalculatorGUI{
private boolean isDone = false;
private static final Font BTN_FONT = new Font(Font.DIALOG, Font.BOLD, 20);
private static final String[][] STANDARD_BTN_TEXTS = {
{"7", "8", "9", "/"}, {"4", "5", "6", "*"},
{"1", "2", "3", "-"}, {"0", "%", "^", "+"},
{"(",")","n!","ln","ENTER"}};
private static final int GAP = 5;
private JPanel mainPanel = new JPanel();
private JTextField display = new JTextField();
CalculatorGUI(){
display.setFont(BTN_FONT);
JPanel standardPanel = createBtnPanel(STANDARD_BTN_TEXTS, "Reverse Polish Notation");
mainPanel.setLayout(new BorderLayout());
mainPanel.setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP));
mainPanel.add(standardPanel, BorderLayout.CENTER);
mainPanel.add(display, BorderLayout.NORTH);
}
public boolean getIsDone(){
return isDone;
}
public void setIsDone(boolean bool){
this.isDone=bool;
}
public String sendData(){
return display.getText();
}
public JPanel getMainPanel(){
return mainPanel;
}
public JTextField getDisplay(){
return display;
}
private JPanel createBtnPanel(String[][] texts, String title) {
JPanel btnPanel = new JPanel();
int rows = texts.length;
int cols = texts[0].length;
ButtonAction command = new ButtonAction();
btnPanel.setLayout(new GridLayout(rows, cols, GAP, GAP));
for (int row = 0; row < texts.length; row++) {
for (int col = 0; col < texts[row].length; col++) {
JButton btn = new JButton(texts[row][col]);
btn.setFont(BTN_FONT);
btn.addActionListener(command);
btnPanel.add(btn);
}
}
btnPanel.setBorder(BorderFactory.createTitledBorder(title));
return btnPanel;
}
private class ButtonAction implements ActionListener{
public void actionPerformed(ActionEvent e){
String command = e.getActionCommand();
switch(command){
case "0": display.setText(display.getText()+"0");
break; case "1": display.setText(display.getText()+"1"); break;
case "2": display.setText(display.getText()+"2"); break; case "3": display.setText(display.getText()+"3");break;
case "4":display.setText(display.getText()+"4"); break;case "5": display.setText(display.getText()+"5");break;
case "6": display.setText(display.getText()+"6");break;case "7": display.setText(display.getText()+"7");break;
case "8": display.setText(display.getText()+"8");break;case "9": display.setText(display.getText()+"9");break;
case "(":display.setText(display.getText()+"(");break;case ")":display.setText(display.getText()+")");break;
case "^":display.setText(display.getText()+"^");break;case "*":display.setText(display.getText()+"*");break;
case "/":display.setText(display.getText()+"/");break;case "+":display.setText(display.getText()+"+");break;
case "-":display.setText(display.getText()+"-");break;case "ENTER":setIsDone(true);break;
}
}
}
}
class CalculatorMenu{
private static final String STANDARD = "Standard";
private CalculatorGUI gui;
private JMenuBar menuBar = new JMenuBar();
private JMenuItem standardView;
CalculatorMenu(CalculatorGUI gui) {
this.gui = gui;
standardView = new JMenuItem(STANDARD, KeyEvent.VK_T);
//scientificView = new JMenuItem(SCIENTIFIC, KeyEvent.VK_S);
ViewAction viewAction = new ViewAction();
standardView.addActionListener(viewAction);
standardView.setEnabled(false);
JMenu viewMenu = new JMenu("View");
viewMenu.setMnemonic(KeyEvent.VK_V);
viewMenu.add(standardView);
menuBar.add(new JMenu("Edit"));
menuBar.add(viewMenu);
menuBar.add(new JMenu("Help"));
}
public JMenuBar getJMenuBar() {
return menuBar;
}
private class ViewAction implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();
if (command.equals(STANDARD)) {
standardView.setEnabled(false);
}
}
}
}
public class RPN {
public static Scanner keyboard = new Scanner(System.in);
public static int operatorLength;
public static void main(String[] args){
CalculatorFrame calc = new CalculatorFrame();
//java.awt.EventQueue.invokeLater(new Runnable() {
//public void run() {
calc.createAndShowUI();
//}
//});
//System.out.print("Enter the operation in infix notation: ");
String infixString =calc.gui.getDisplay().getText();// keyboard.nextLine();
//infixString = infixString.trim();
LinkListStack infixLinkStack = new LinkListStack();
Stack infixArrayStack = new Stack(infixString.length());
Stack postfixArrayStack = new Stack(infixString.length());
operatorLength = getOperatorLength(infixString);
infixLinkStack = addToStack(infixString);
infixArrayStack = addToArrayStack(infixLinkStack);
infixArrayStack = deleteNullValues(infixArrayStack);
//String postfixString = convertToPostfix(infixArrayStack);
//System.out.println("posftixString: "+postfixString);
postfixArrayStack =convertToPostfix(infixArrayStack);// pushStringToArrayStack(postfixString);
postfixArrayStack.displayStack();
long result = computePostfixExpression(postfixArrayStack);
System.out.println("result: "+result);
}
我解决了问题!基本上,我只包含一个布尔功能,以检查是否已击中Enter,如果是的,则将数据发送到框架,然后从那里发送到我的主要方法和RPN类,我可以在其中计算它。现在,我只需要找到一种方法来输出结果和显示后的后缀字符串即可。
新方法在CalculatorGui类,getisdone()和senddata()中。while循环在框架类中。
以防万一其他人有同样的问题,这是我的新代码:
class CalculatorFrame extends JFrame{
private String data;
public CalculatorGUI gui = new CalculatorGUI();
public void createAndShowUI(){
CalculatorMenu menu = new CalculatorMenu(gui);
JFrame frame = new JFrame("Reverse Polish Notation Calculator");
frame.getContentPane().add(gui.getMainPanel());
frame.setJMenuBar(menu.getJMenuBar());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
while(gui.getIsDone()==false){
//if(gui.sendData()){
data += gui.sendData();
// }
}
}
public void setData(CalculatorGUI gui){
this.data = gui.getDisplay().getText();
}
public String getData(){
return this.data;
}
}
class CalculatorGUI{
private boolean isDone = false;
private static final Font BTN_FONT = new Font(Font.DIALOG, Font.BOLD, 20);
private static final String[][] STANDARD_BTN_TEXTS = {
{"7", "8", "9", "/"}, {"4", "5", "6", "*"},
{"1", "2", "3", "-"}, {"0", "%", "^", "+"},
{"(",")","n!","ln","ENTER"}};
private static final int GAP = 5;
private JPanel mainPanel = new JPanel();
private JTextField display = new JTextField();
CalculatorGUI(){
display.setFont(BTN_FONT);
JPanel standardPanel = createBtnPanel(STANDARD_BTN_TEXTS, "Reverse Polish Notation");
mainPanel.setLayout(new BorderLayout());
mainPanel.setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP));
mainPanel.add(standardPanel, BorderLayout.CENTER);
mainPanel.add(display, BorderLayout.NORTH);
}
public boolean getIsDone(){
return isDone;
}
public void setIsDone(boolean bool){
System.out.println("Set is done activated");
this.isDone=bool;
}
public String sendData(){
if(isDone){
System.out.println("send data activated");
return display.getText();
}
else{
return "";
}
}
public JPanel getMainPanel(){
return mainPanel;
}
public JTextField getDisplay(){
return display;
}
private JPanel createBtnPanel(String[][] texts, String title) {
JPanel btnPanel = new JPanel();
int rows = texts.length;
int cols = texts[0].length;
ButtonAction command = new ButtonAction();
btnPanel.setLayout(new GridLayout(rows, cols, GAP, GAP));
for (int row = 0; row < texts.length; row++) {
for (int col = 0; col < texts[row].length; col++) {
JButton btn = new JButton(texts[row][col]);
btn.setFont(BTN_FONT);
btn.addActionListener(command);
btnPanel.add(btn);
}
}
btnPanel.setBorder(BorderFactory.createTitledBorder(title));
return btnPanel;
}
private class ButtonAction implements ActionListener{
public void actionPerformed(ActionEvent e){
String command = e.getActionCommand();
//display.setText(display.getText()+command)
switch(command){
case "0": display.setText(display.getText()+"0"); break; case "1": display.setText(display.getText()+"1"); break;
case "2": display.setText(display.getText()+"2"); break; case "3": display.setText(display.getText()+"3");break;
case "4":display.setText(display.getText()+"4"); break;case "5": display.setText(display.getText()+"5");break;
case "6": display.setText(display.getText()+"6");break;case "7": display.setText(display.getText()+"7");break;
case "8": display.setText(display.getText()+"8");break;case "9": display.setText(display.getText()+"9");break;
case "(":display.setText(display.getText()+"(");break;case ")":display.setText(display.getText()+")");break;
case "^":display.setText(display.getText()+"^");break;case "*":display.setText(display.getText()+"*");break;
case "/":display.setText(display.getText()+"/");break;case "+":display.setText(display.getText()+"+");break;
case "-":display.setText(display.getText()+"-");break;case "ENTER":setIsDone(true);break;
}
}
}
}
class CalculatorMenu{
private static final String STANDARD = "Standard";
private CalculatorGUI gui;
private JMenuBar menuBar = new JMenuBar();
private JMenuItem standardView;
CalculatorMenu(CalculatorGUI gui) {
this.gui = gui;
standardView = new JMenuItem(STANDARD, KeyEvent.VK_T);
//scientificView = new JMenuItem(SCIENTIFIC, KeyEvent.VK_S);
ViewAction viewAction = new ViewAction();
standardView.addActionListener(viewAction);
standardView.setEnabled(false);
JMenu viewMenu = new JMenu("View");
viewMenu.setMnemonic(KeyEvent.VK_V);
viewMenu.add(standardView);
menuBar.add(new JMenu("Edit"));
menuBar.add(viewMenu);
menuBar.add(new JMenu("Help"));
}
public JMenuBar getJMenuBar() {
return menuBar;
}
private class ViewAction implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();
if (command.equals(STANDARD)) {
standardView.setEnabled(false);
}
}
}
}
public class RPN {
public static Scanner keyboard = new Scanner(System.in);
public static int operatorLength;
public static void main(String[] args){
CalculatorFrame calc = new CalculatorFrame();
//java.awt.EventQueue.invokeLater(new Runnable() {
//public void run() {
calc.createAndShowUI();
//System.out.print("Enter the operation in infix notation: ");
String infixString =calc.getData();// keyboard.nextLine();
//infixString = infixString.trim();
LinkListStack infixLinkStack = new LinkListStack();
Stack infixArrayStack = new Stack(infixString.length());
Stack postfixArrayStack = new Stack(infixString.length());
operatorLength = getOperatorLength(infixString);
infixLinkStack = addToStack(infixString);
infixArrayStack = addToArrayStack(infixLinkStack);
infixArrayStack = deleteNullValues(infixArrayStack);
//String postfixString = convertToPostfix(infixArrayStack);
//System.out.println("posftixString: "+postfixString);
postfixArrayStack =convertToPostfix(infixArrayStack);// pushStringToArrayStack(postfixString);
postfixArrayStack.displayStack();
long result = computePostfixExpression(postfixArrayStack);
System.out.println("result: "+result);
}
要回答您的问题,这是可能的,但这不是解决问题的方法。将主要方法视为您程序的一种绿灯。它告诉它去,不是驾驶员。
创建一个使用findViewById()
的ONCLICK方法来引用包含您要从infix操纵到Postfix的字符串的数据字段。当您创建对组件的引用时,可以使用getText()
方法将字符串从该组件中拉出并使用InfixToPostfix(myString)
方法。然后,有了您要使用的组件来显示数据,请调用.setText(ResultOfInfixToPostFix)
。
在Java中进行秋千的编辑:很抱歉在Android中编写解决方案,我一直在做一些项目,并让两个混乱落在了我的脑海中。至于一个点击的解决方案,Heres对于Java来说,它将如何工作。
在您的代码中,您应该具有文本字段,并以某种格式声明:
private JTextField myTextField = new JTextField();
makeInfixButton = new JButton("Make Table!");
您想要的是在按钮上执行您的文本字段条目上的计算,因此您要在按钮中添加ActionListener
。这是一个示例:
makeInfixButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
ConvertPostFixToInfix(myTextField.getText.toString())
}
});