0

所以多亏了这里的好人,我设法得到了一些半可行的东西,仍然有一些错误,但也许你们可以帮助我解决这个问题。到目前为止,所提供的解决方案都不是完全匹配的(这就是我没有投票给他们的原因),但它们确实帮助我以一种新的方式看待事物并使事情向前发展。所以这是当前的问题。

首先是代码,然后是解释

                RaceButtons[RaceCounter] =  new JToggleButton();
                RaceButtons[RaceCounter].setIcon(RCiconSM);
                RaceButtons[RaceCounter].setBorder(BorderFactory.createEmptyBorder());
                RaceButtons[RaceCounter].setContentAreaFilled(false);
                RaceButtons[RaceCounter].setActionCommand(temp_race.getRaceNameString(RaceCounter));
                RaceButtons[RaceCounter].addActionListener(new ActionListener() {
                            public void actionPerformed(ActionEvent ae) {
                                Race race = new Race(1, 1, GenderList[PHYSICAL_SEX]);
                                race.setRaceID(race.getRaceIDFromString(ae.getActionCommand()));
                                //System.out.println(race.getraceID());
                                        if (RaceButtons[race.getraceID()].isSelected()){
                                            RaceButtons[race.getraceID()].setBorderPainted(true);
                                            RaceButtons[race.getraceID()].setBorder(new LineBorder(Color.blue,2));
                                            MyRaceArray.add(new Race(race.getraceID(), 1, GenderList[PHYSICAL_SEX]));
                                        }else{
                                            RaceButtons[race.getraceID()].setBorderPainted(false);
                                        };

所以首先我创建了一个切换按钮数组,当你点击它时,它会绘制边框,然后获取它的信息,我可以将它添加到数组中进行比赛,但这让我遇到了另一个问题,我无法完全弄清楚逻辑。Namly 如果已经选择了按钮,它会向按钮添加另一个实例,它不应该忽略 iexaisting 条目,但这意味着我必须检查 arry 以查找具有相同信息的 Race 类型的匹配对象,对吗?最好的方法是什么?当你取消选择它时,我如何删除同一个对象。

4

3 回答 3

4

这就是你的代码在 Race 类中的样子:

import java.util.ArrayList;
import java.util.List;

public class Race {

    private int raceID;

    private double purity;

    private int strMod;

    private int dexMod;

    private int conMod;

    private int wisMod;

    public int getRaceID() {
        return raceID;
    }

    public void setRaceID(int raceID) {
        this.raceID = raceID;
    }

    public double getPurity() {
        return purity;
    }

    public void setPurity(double d) {
        this.purity = d;
    }

    public int getStrMod() {
        return strMod;
    }

    public void setStrMod(int strMod) {
        this.strMod = strMod;
    }

    public int getDexMod() {
        return dexMod;
    }

    public void setDexMod(int dexMod) {
        this.dexMod = dexMod;
    }

    public int getConMod() {
        return conMod;
    }

    public void setConMod(int conMod) {
        this.conMod = conMod;
    }

    public int getWisMod() {
        return wisMod;
    }

    public void setWisMod(int wisMod) {
        this.wisMod = wisMod;
    }

    @Override
    public String toString() {
        return "Race [raceID=" + raceID + ", purity=" + purity + ", strMod="
                + strMod + ", dexMod=" + dexMod + ", conMod=" + conMod
                + ", wisMod=" + wisMod + "]";
    }

    public static void main(String args[]) {

        //create a list of race objects
        List<Race> raceCollection = new ArrayList<Race>();

        //create a race object
        Race race = new Race();
        race.setRaceID(1);
        race.setPurity(0.75);
        race.setStrMod(5);
        race.setDexMod(7);
        race.setConMod(-2);
        race.setWisMod(3);

        //add race object to collection
        raceCollection.add(race);

        //You can create and add multiple objects of race to the collection


        //Iterate your list and print the objects
        for(Race raceObj:raceCollection) {
            System.out.println(raceObj);
        }


    }

}
于 2013-06-02T05:20:16.307 回答
2

您将能够使用数组的 ArrayList使其工作,但从长远来看,这可能不是最好的方法。处理起来可能非常繁琐且容易出错 - 当您插入新的种族或属性,但忘记在某处更改索引时会发生什么?

Arrays 和 ArrayLists 通常最好保留用于实际拥有序列/列表(通常具有有意义的序列顺序)的情况。

在您的情况下,我更倾向于采用原型模型。通常在 Java 中,您会用一个HashMap(或包含 HashMap 的数据结构)来表示每个种族,该映射表示“属性 ID”和“默认值”之间的关系。

然后,创建一个新精灵只是使用他种族的默认值(或者不同种族的平均值,如果你愿意的话……)初始化精灵属性的一个例子。

有些人可能会建议创建一个包含大量命名字段的 OOP 类。这也可以,但恕我直言,原型模型更好 - 从长远来看,它可以为您提供更大的灵活性。您经常希望以某种方式处理大量属性,如果您必须单独引用每个属性字段,这样做会非常麻烦。

于 2013-06-02T05:17:05.660 回答
0
import java.util.ArrayList;
import java.util.List;

public class Race
{
    private final int raceID;
    private final double purity;
    private final int strMod;
    private final int dexMod;
    private final int conMod;
    private final int wisMod;

    public Race (int raceID, double purity, int strMod, int dexMod, int conMod, int wisMod)
    {
        this.raceID = raceID;
        this.purity = purity;
        this.strMod = strMod;
        this.dexMod = dexMod;
        this.conMod = conMod;
        this.wisMod = wisMod;
    }

    public int getRaceID ()
    {
        return raceID;
    }

    public double getPurity ()
    {
        return purity;
    }

    public int getStrMod ()
    {
        return strMod;
    }

    public int getDexMod ()
    {
        return dexMod;
    }

    public int getConMod ()
    {
        return conMod;
    }

    public int getWisMod ()
    {
        return wisMod;
    }

    @Override public String toString ()
    {
        return "RaceID:" + raceID
            + " purity:" + purity
            + " strMod:" + strMod
            + " dexMod:" + dexMod
            + " conMod:" + conMod
            + " wisMod:" + wisMod;
    }

    @override public int hashCode ()
    {
        return raceID;
    }

    @override public boolean equals (Race r)
    {
        return (r != null && this.raceID == r.getRaceID());
    }

    @override public Object clone ()
    {
        return new Race(this.raceID,this.purity,this.strMod,this.dexMod,this.conMod,this.wisMod);
    }

    public static void main(String args[])
    {

        // simple test
        ArrayList<Race> races = new ArrayList<Race>();

        Race a = new Race(0,0.5,1,2,3,4);

        Race b = new Race(1,0.75,2,3,4,5);

        Race c = new Race(2,0.25,-1,-2,-3,-4);

        races.add(a);
        races.add(b);
        races.add(c);

        for(Race race : races)
        {
            // System.out.println(race.toString());
            System.out.println(race);
        }
    }
}

然后我们有了视觉模型,可以这样处理:

class RacePanel implements ActionListener
{
    private Map<Integer,JToggleButton> r;
    private Map<Integer,Race> f;

    public RacePanel()
    {
        r = new TreeMap<Integer,JToggleButton>();
        f = new TreeMap<Integer,Race>();
    }

    public JToggleButton add (Race a)
    {
        JToggleButton button = new JToggleButton();

        button.setIcon(RCiconSM);
        button.setBorder(BorderFactory.createEmptyBorder());
        button.setContentAreaFilled(false);
        button.setActionCommand(a.getRaceID());
        button.addActionListener(this);

        r.put(a.getRaceID, button);
        f.put(a.getRaceID, a);
    }

    public void remove (int raceID)
    {
        r.remove(a.getRaceID);
        f.remove(a.getRaceID);
    }

    // When a button is clicked
    public void actionPerformed(ActionEvent e)
    {
        // related race
        Race a = f.get(e.getActionCommand());

        // clicked button
        JToggleButton b = r.get(e.getActionCommand());

        // ..
    }

    public ArrayList<JToggleButton> getButtonList ()
    {
        return new ArrayList<Value>(r.values());
    }

    public ArrayList<Race> getRaceList ()
    {
        return new ArrayList<Value>(f.values());
    }

    public Race getRace (int raceID)
    {
        return f.get(raceID);
    }

    public JToggleButton getButton (int raceID)
    {
        return r.get(raceID);
    }

    // ..
}
于 2013-06-02T06:17:42.543 回答