试图将gui与逻辑分离的问题

时间:2014-01-16 09:57:32

标签: java swing user-interface methods get

GUI.java

package ccc;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;


public class GUI implements ActionListener {

JFrame f;
JPanel bg, s, a;
JLabel ca, £, cav, co, cov, co2, pr, error;
JTextField tf;
JButton b1, b2;

public GUI(){

    f = new JFrame();

    bg = new JPanel();
    bg.setSize(650, 500);
    bg.setBackground(Color.darkGray);
    bg.setLayout(null);
    bg.setLocation(0, 0);

    s = new JPanel();
    s.setSize(180, 445);
    s.setBackground(Color.white);
    s.setLayout(null);
    s.setLocation(10, 10);

    a = new JPanel();
    a.setSize(430, 445);
    a.setBackground(Color.white);
    a.setLayout(null);
    a.setLocation(202, 10);

    ca = new JLabel("CASH:");
    ca.setSize(70,25);
    ca.setLocation(10, 25);

    £ = new JLabel("£");
    £.setSize(10, 25);
    £.setLocation(80, 25);

    cav = new JLabel("128.23");
    cav.setSize(80, 25);
    cav.setLocation(90, 25);

    co = new JLabel("COCAINE:");
    co.setSize(70, 25);
    co.setLocation(10, 50);

    cov = new JLabel("6 units");
    cov.setSize(70, 25);
    cov.setLocation(80, 50);

    co2 = new JLabel("COCAINE");
    co2.setSize(70, 25);
    co2.setLocation(10, 25);

    pr = new JLabel("£39.95");
    pr.setSize(60, 25);
    pr.setLocation(90, 25);

    tf = new JTextField();
    tf.setSize(70, 25);
    tf.setLocation(160, 25);

    b1 = new JButton("BUY");
    b1.setSize(70, 25);
    b1.setLocation(270, 25);
    b1.addActionListener(this);

    b2 = new JButton("SELL");
    b2.setSize(70, 25);
    b2.setLocation(350, 25);
    b2.addActionListener(this);

    error = new JLabel();
    error.setSize(200, 25);
    error.setLocation(50, 50);




    s.add(ca);
    s.add(£);
    s.add(cav);
    s.add(co);
    s.add(cov);

    a.add(co2);
    a.add(pr);
    a.add(tf);
    a.add(b1);
    a.add(b2);
    a.add(error);

    bg.add(s);  
    bg.add(a);

    f.add(bg);




    f.setSize(650, 500);
    f.setLayout(null);
    f.setLocationRelativeTo(null);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setVisible(true);
}




public static void main(String[] args) {

    new GUI();
}




@Override
public void actionPerformed(ActionEvent e) {

    if (e.getSource() == b1){
        Buy a = new Buy();
    a.Buy();
    }
    if (e.getSource() == b2){

    }
}

}

Buy.java

package ccc;

public class Buy extends GUI {

String pri, qua, cas, uni, aaa;
double price, quantity, cash, units, total, deduction;

public Buy(){

    pri = pr.getText();
    price = Double.parseDouble(pri);

    qua = tf.getText();
    quantity = Double.parseDouble(qua);

    cas = cav.getText();
    cash = Double.parseDouble(cas);

    uni = cov.getText();
    units = Double.parseDouble(uni);    

    total = price * quantity;



    if (cash >= total){

        deduction = cash - total;
        aaa = String.valueOf(deduction);        
        cav.setText(aaa);
    }

    else if (cash < total){
        error.setText("Sorry, you don't currently have the funds");
    }       
}
}

嗨大家好,

我目前正在学习java,并希望给自己一个充满挑战和乐趣的项目。当我还是一个名叫dopewars的孩子时,我决定建立一个我记得玩的游戏。

这是我在这场比赛中的第二次尝试。当我开始第一次尝试时,一切顺利。过了一会儿,我的源代码开始疯狂地失控,直到我不再继续,因为我不断迷失在代码之中。

然后我决定重新开始,只是这次我想从逻辑(2个不同的.java文件)中分离gui。这就是我的问题所在。以前这可行。自从分离我的java文件以来,功能已经停止。

当我按下jbutton b1时,我的程序应该取可卡因的价格值和用户输入到jtextfield的单位值,通过访问Buy.java中的方法执行计算,然后更新相应的JLabel在GUI.java的s jpanel中。

例如,用户x想要以指定的价格购买可卡因,因此他输入一个代表他想要的数量的值。然后他按下购买按钮,最终通过使用Buy类中的方法从程序窗口左侧显示的钱包中扣除钱。

我希望你能理解我的解释,我希望很快能收到你的回复。提前致谢。我的源代码如下。

2 个答案:

答案 0 :(得分:0)

以下没有形状或形式的答案鼓励真正的涂鸦战争;)

MVC是你的朋友。我这样做的方式通常是首先编写代码的数据和数据操作部分,而不考虑它在屏幕上的显示方式。

首先尝试将代码的“数据”部分分开。把它整齐地放在别处;例如,表示真实世界对象的简单pojo对象。

然后将您可以对这些对象执行的操作写入不同的类。正如我之前所说,使这些完全独立于UI。这可以确保代码的功能部分很好并且是独立的,并且基本上是可测试的。

然后编写您的UI部分。单击按钮可以在代码的操作部分中路由到方法调用,例如。

希望有所帮助。

答案 1 :(得分:0)

你的问题就在这里开始:

public class Buy extends GUI {

尝试重写游戏逻辑,以便它不会对GUI有任何了解。假设您想通过命令行使您的游戏可玩。您的游戏逻辑应该以不必更改的方式编写,以使其成为可能。

尝试识别用户通过其与游戏模型交互的界面。然后实现此接口。

以下是一些想法(我不知道DopeWars,所以我会给你一些概括性的例子)

public class MyGameEngine {

    public PlayerData getPlayerData() { ... }

    public void sellSomeStuff(int numberOfStuff) throws InvalidPlayerOperation {
        if (numberOfStuff > getPlayerData().getAmountOfStuff() {
            throw new InvalidPlayerOperation("Not enough stuff");
        }
        ....
    }
}

public class PlayerData {

    public int getAmountOfStuff() { ... }
}

public class InvalidPlayerOperation extends RuntimeException { ... }

这个领域有很多模式。但是如果你真的想要学习一些东西,那就试试吧,不要先查看模式。当你使用它时,将有足够的时间来学习模式,然后检查你的代码,如果你直观地使用它们,或者你可以介绍它们来提高它的质量。

特别是MVC模式可能对你的简单游戏来说太过分了,特别是如果你不想使用MVC框架(你没有)。 另一方面,Singleton模式起初看起来很简单,但通常是不好的风格,只会在以后引起问题。