Java - 一个简单的PlayerAction计数器,用于练习面向对象的编程

时间:2015-08-27 17:07:27

标签: java oop object

我正在学习Java的基础知识,并决定通过制作一个我称之为“PlayerAction Counter”的简单程序来练习对象。当单击“重置”按钮时,单击“+1”按钮并另外重置计数器时,它只会计算一个“动作”。对于这种情况,我创建了一个 Application.java ,它包含main方法并启动程序, Interface.java 用于GUI,EventHandling.java用于事件和 Person.java ,它包含更改其状态的接口组件和方法。它看起来像这样:

enter image description here

我的想法是在接口类中创建窗口并设置它的布局,然后创建两个名为PlayerOne和Player Two的Person对象。 Person 类创建两个标签和两个按钮,并通过构造函数参数设置一个标签。 我已经设法通过 getters 将这两个对象的元素添加到GUI中,它看起来很好。我将ActionListener添加到Person类中的两个按钮,它也可以正常工作。

我无法从 EventHandling 类返回人员字段和方法。我创建了一个setValueLabel(),它将'action'的值增加一个并将其设置在标签上,但我必须知道如何从另一个类启动该方法。我不能在里面创建另一个对象(抛出StackOverFlow错误),但它是否应该以某种方式引用接口类中的那两个?

以下是代码:

Application.java

import java.awt.EventQueue;

public class Application {

    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {
            public void run() {

                new Interface().setVisible(true);
            }   
        });
    }
}

Interface.java

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;

import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSeparator;
import javax.swing.SwingConstants;

public class Interface extends JFrame {

    private JLabel titleLabel;
    private JPanel mainPanel;
    private JPanel leftPanel, rightPanel;
    private JSeparator separator;

    Person PlayerOne = new Person("PlayerOne");
    Person PlayerTwo = new Person("PlayerTwo");

    public Interface() {

        //Basic init
        setTitle("PlayerAction Counter");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);

        //Layout
        mainPanel = new JPanel();
        add(mainPanel);
        mainPanel.setLayout(new BorderLayout());
        mainPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));

        leftPanel = new JPanel();
        rightPanel = new JPanel();

        leftPanel.setLayout(new BoxLayout(leftPanel, BoxLayout.Y_AXIS));
        leftPanel.setBorder(BorderFactory.createEmptyBorder(10,10,10,10));
        mainPanel.add(leftPanel, BorderLayout.WEST);


        separator = new JSeparator(SwingConstants.VERTICAL);
        mainPanel.add(separator, BorderLayout.CENTER);

        titleLabel = new JLabel("PlayerAction Counter");
        mainPanel.add(titleLabel, BorderLayout.PAGE_START);

        //Components init
        PlayerTwo.getPersonLabel().setAlignmentX(Component.CENTER_ALIGNMENT);
        leftPanel.add(PlayerTwo.getPersonLabel());
        PlayerTwo.getValueLabel().setAlignmentX(Component.CENTER_ALIGNMENT);
        leftPanel.add(PlayerTwo.getValueLabel());
        PlayerTwo.getValueUpButton().setAlignmentX(Component.CENTER_ALIGNMENT);
        leftPanel.add(PlayerTwo.getValueUpButton());
        PlayerTwo.getValueResetButton().setAlignmentX(Component.CENTER_ALIGNMENT);
        leftPanel.add(PlayerTwo.getValueResetButton());

        rightPanel.setLayout(new BoxLayout(rightPanel, BoxLayout.Y_AXIS));
        rightPanel.setBorder(BorderFactory.createEmptyBorder(10,10,10,10));
        mainPanel.add(rightPanel, BorderLayout.EAST);
        PlayerOne.getPersonLabel().setAlignmentX(Component.CENTER_ALIGNMENT);
        rightPanel.add(PlayerOne.getPersonLabel());
        PlayerOne.getValueLabel().setAlignmentX(Component.CENTER_ALIGNMENT);
        rightPanel.add(PlayerOne.getValueLabel());
        PlayerOne.getValueUpButton().setAlignmentX(Component.CENTER_ALIGNMENT);
        rightPanel.add(PlayerOne.getValueUpButton());
        PlayerOne.getValueResetButton().setAlignmentX(Component.CENTER_ALIGNMENT);
        rightPanel.add(PlayerOne.getValueResetButton());
        pack();
    }
}

Person.java

import java.awt.Component;

import javax.swing.JButton;
import javax.swing.JLabel;

public class Person {

    private JLabel personLabel;
    private JLabel valueLabel;
    private JButton valueUpButton;
    private JButton valueResetButton;
    private int actionValue = 0;

    public Person(String s) {

        personLabel = new JLabel(s);
        setComponents();
    }

    private void setComponents() {

        valueUpButton = new JButton("+1");
        valueResetButton = new JButton("Reset");
        valueLabel = new JLabel(""+actionValue);

        EventHandling eventHand = new EventHandling(valueUpButton, valueResetButton);
        valueResetButton.addActionListener(eventHand);
        valueUpButton.addActionListener(eventHand);
    }

    public void setValueLabel() {

        actionValue++;
        valueLabel.setText("" +actionValue);
    }


    public JLabel getPersonLabel() {

        return personLabel;
    }

    public JLabel getValueLabel() {

        return valueLabel;
    }

    public JButton getValueUpButton() {

        return valueUpButton;
    }

    public JButton getValueResetButton() {

        return valueResetButton;
    }
}

EventHandling.java

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JLabel;

public class EventHandling implements ActionListener {

    private JButton valueUpButton;
    private JButton valueResetButton;

    public EventHandling(JButton valueUpButton, JButton valueResetButton) {

        this.valueUpButton = valueUpButton;
        this.valueResetButton = valueResetButton;
    }

    @Override
    public void actionPerformed(ActionEvent event) {
        if (event.getSource() == valueUpButton) {
            //no idea how to launch Person.setValueLabel(); 
            //creating new Person object throws StackOverFlow error and I doubt that's the way

        }

        else if (event.getSource() == valueResetButton) {

        }
    }   
}

我希望我的问题是可以理解的。问题是:应该怎么做? 请记住,我是一个完整的新手,并尝试学习OOP,但我很困惑。请在思考和代码中指出我的错误。 任何反馈都将被大大调整。 谢谢。

0 个答案:

没有答案
相关问题