2014-01-16 6 views
0

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 и хотел дать себе проект, было одновременно сложным и забавным. Я решил создать игру, которую я помню, играя, когда я был ребенком под названием «Доппары».

Это моя вторая попытка в этой игре. Когда я начал свою первую попытку, все прошло хорошо. Через некоторое время мой исходный код начал заполняться дико из-под контроля, пока я не смог продолжить больше, так как я все время терялся в горах кода.

Затем я решил начать снова, только на этот раз я хотел отделить gui от логики (2 разных файла .java). Вот где моя проблема. Раньше это работало бы хорошо. После разделения моих java-файлов функциональность прекратилась.

Когда я нажимаю jbutton b1, моя программа должна принять ценовое значение кокаина и значение единиц, введенное пользователем jtextfield, выполнить расчет, обратившись к методу в Buy.java, а затем обновить соответствующий JLabels внутри jpanel GUI.java.

Например, пользователь x хочет купить кокаин по указанной цене, поэтому он вводит значение, представляющее желаемое количество. Затем он нажимает кнопку покупки, которая в конечном счете вычитает деньги из кармана, которые отображаются в левой части окна программы, используя метод в классе Buy.

Надеюсь, вы сможете понять мои объяснения, и я надеюсь услышать от вас в ближайшее время. Заранее спасибо. Мой исходный код приведен ниже.

+0

Имея реальные проблемы с загрузкой вопроса и кода sourc вместе. Там должно быть два файла .java, но кажется, что некоторые были отключены. По крайней мере, это выглядит так на моем телефоне?!? – dazbrad

+1

См. Также этот [пример] (http://stackoverflow.com/a/3072979/230513). – trashgod

ответ

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 кажется простым, но, как правило, плохой стиль, и это может вызвать проблемы позже.

+0

Дайте мне время, и попробуйте что-то вроде того, что вы описали, и посмотрите, как оно идет, спасибо за ваше время. – dazbrad

0

Следующий ответ не в форме или форме поощряющей реального Dope Wars;)

MVC является вашим другом. То, как я это делаю, обычно состоит в том, чтобы сначала сначала написать части данных и данные для обработки кода, не думая о том, как это будет выглядеть на экране.

Попробуйте сначала выделить часть данных вашего кода. Храните это аккуратно в другом месте; Например, простые объекты pojo, представляющие объекты реального мира.

Затем записывайте операции, которые вы можете выполнять с этими объектами в разные классы. Сделайте это полностью независимым от пользовательского интерфейса, как я уже говорил. Это гарантирует, что функциональная часть вашего кода будет приятной и раздельной, и, по существу, пробной.

Затем напишите свой пользовательский интерфейс. Например, нажмите кнопку «Путь» к вызову метода в вашей рабочей части кода.

Надеюсь, что это поможет.

Смежные вопросы