1

我必须编写一个小棋盘游戏,为此我决定使用 GridBagLayout。这是我现在的样子:(请点击链接)

https://imageshack.com/i/2oe6upp

我希望箭头指示小盘子应该移动到哪里。

这是代码:

public class PlatteView extends JPanel implements IPlattenListener {

private Platte platteModel;
private HashMap<JRadioButton, Dimension> felder;
private HashMap<Dimension, JRadioButton> felderInverted;
private GridBagConstraints c;
private IPlatteViewToSpielfeldView iPlatteViewToSpielfeldView;

public PlatteView(Platte platteModel, IPlatteViewToSpielfeldView iPlatteViewToSpielfeldView) {
    this.iPlatteViewToSpielfeldView = iPlatteViewToSpielfeldView;
    this.platteModel = platteModel;
    felder = new HashMap<JRadioButton, Dimension>();
    felderInverted = new HashMap<Dimension, JRadioButton>();
    c = new GridBagConstraints();
    platteModel.registratePlattenListener(this);
    init();
}

//überhaupt notwendig
public void setPlatteModel(Platte platteModel) {
    this.platteModel = platteModel;
}

private void init() {
    this.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1));
    this.setLayout(new GridBagLayout());
    initFelder();
}

private void initFelder() {

    for (Map.Entry<Dimension, Feld> feld : platteModel.getPlattenBelegung().entrySet()) {
        JRadioButton murmelView = erzeugeJRadioButton(feld);
        addJRadioButtonToPanel(feld.getKey(), murmelView);
    }
}

private JRadioButton erzeugeJRadioButton(Map.Entry<Dimension, Feld> feld) {
    final JRadioButton murmelView = new JRadioButton();
    murmelView.setBackground(new Color(244,164,96));
    felder.put(murmelView, feld.getKey());  //Key kopieren???
    felderInverted.put(feld.getKey(), murmelView);

    //hier kann noch ein Zug ausgeführt werden
    if (feld.getValue() == null) {
        murmelView.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                setzeGewuenschtenSpielzug(murmelView);
            }
        });
        return murmelView;
    } else {
        murmelView.setEnabled(false);
        if(feld.getValue().getFarbe() == Farbe.SCHWARZ)
            murmelView.setIcon(new MurmelIcon(12, Color.black));
        else
            murmelView.setIcon(new MurmelIcon(12, Color.red));
        return murmelView;
    }
}

private void addJRadioButtonToPanel(Dimension koordiante, JRadioButton murmelView) {
    c.fill = GridBagConstraints.BOTH;
    c.gridx = (int) koordiante.getWidth();
    c.gridy = (int) koordiante.getHeight();
    this.add(murmelView, c);
}

//ist eine Benutzereingabe
void setzeGewuenschtenSpielzug(JRadioButton radioButton) {
    Dimension feldKoordinaten = felder.get(radioButton);
    //Umrechnen auf Zugkoordinaten mit Hilfe der Ursprungskoordinaten
    int x_zug = platteModel.getXKoordinate() + feldKoordinaten.width;
    int y_zug = platteModel.getYKoordinate() + feldKoordinaten.height;

    iPlatteViewToSpielfeldView.setzeGewuenschtenSpielzug(new Dimension(x_zug, y_zug));
    //nach Zug alles auf setEnabled false?
}

@Override
public void setzeZug(Zug zug) {
    //Koordinate ist bereits umgerechnet
    if (felderInverted.containsKey(zug.getZugKoordinaten())) {
        JRadioButton murmelView = felderInverted.get(zug.getZugKoordinaten());
        murmelView.setIcon(new MurmelIcon(12, zug.getFarbe() == Farbe.ROT ? Color.red : Color.black));
        murmelView.setEnabled(false);
    }

    /*Dimension treffer = new Dimension(zug.getZugKoordinaten().width - platteModel.getXKoordinate(), zug.getZugKoordinaten().height - platteModel.getYKoordinate());
    if (felderInverted.containsKey(treffer)) {
        JRadioButton murmelView = felderInverted.get(treffer);
        murmelView.setIcon(new MurmelIcon(12, zug.getFarbe() == Farbe.ROT ? Color.red : Color.black));
        murmelView.setEnabled(false);
    }*/
}

public int getGridWidth() {
    switch (platteModel.getOrientierung()) {
        case VERTIKAL:
            if(platteModel.getPlattenArt() == PlattenArt.ZWEIER)
                return 1;
            if(platteModel.getPlattenArt() == PlattenArt.DREIER)
                return 1;
            if(platteModel.getPlattenArt() == PlattenArt.SECHSER)
                return 2;
            if(platteModel.getPlattenArt() == PlattenArt.VIERER)
                return 2;
            break;
        case HORIZONTAL:
            if(platteModel.getPlattenArt() == PlattenArt.ZWEIER)
                return 2;
            if(platteModel.getPlattenArt() == PlattenArt.DREIER)
                return 3;
            if(platteModel.getPlattenArt() == PlattenArt.SECHSER)
                return 3;
            if(platteModel.getPlattenArt() == PlattenArt.VIERER)
                return 2;
            break;
    }
    return 30;
}

public int getGridHeigth() {
    switch (platteModel.getOrientierung()) {
        case VERTIKAL:
            if(platteModel.getPlattenArt() == PlattenArt.ZWEIER)
                return 2;
            if(platteModel.getPlattenArt() == PlattenArt.DREIER)
                return 3;
            if(platteModel.getPlattenArt() == PlattenArt.SECHSER)
                return 3;
            if(platteModel.getPlattenArt() == PlattenArt.VIERER)
                return 2;
            break;
        case HORIZONTAL:
            if(platteModel.getPlattenArt() == PlattenArt.ZWEIER)
                return 1;
            if(platteModel.getPlattenArt() == PlattenArt.DREIER)
                return 1;
            if(platteModel.getPlattenArt() == PlattenArt.SECHSER)
                return 2;
            if(platteModel.getPlattenArt() == PlattenArt.VIERER)
                return 2;
            break;
    }
    return 30;
}

}

和其他需要的类:

public class SpielfeldView extends JPanel implements IPlatteViewToSpielfeldView{

private Spielfeld spielfeld;
private GridBagConstraints c;
private ArrayList<PlatteView> platteViews;

public SpielfeldView(Spielfeld spielfeld) {
    this.spielfeld = spielfeld;
    platteViews = new ArrayList<PlatteView>();
    c = new GridBagConstraints();
    init();
    this.setBackground(Color.BLUE);
    this.setSize(100,100);
}

private void init() {
    GridBagLayout gbl = new GridBagLayout();
    this.setLayout(gbl);
    c.fill = GridBagConstraints.NONE;

    for (Platte platte : spielfeld.getPlatten()) {
        PlatteView platteView = new PlatteView(platte, this);
        platteViews.add(platteView);

        int x_platte = platte.getXKoordinate();
        int y_platte = platte.getYKoordinate();
        c.gridx = x_platte;
        c.gridy = y_platte;
        c.gridwidth = platteView.getGridWidth();
        c.gridheight = platteView.getGridHeigth();

        //4 Quadranten
        if (x_platte < 4 && y_platte < 4)
            c.anchor = GridBagConstraints.LAST_LINE_END;
        if (x_platte >= 4 && y_platte < 4)
            c.anchor = GridBagConstraints.LAST_LINE_START;
        if (x_platte < 4 && y_platte >= 4)
            c.anchor = GridBagConstraints.FIRST_LINE_END;
        if (x_platte >= 4 && y_platte >= 4)
            c.anchor = GridBagConstraints.FIRST_LINE_START;

        this.add(platteView, c);
    }
}

@Override
public void setzeGewuenschtenSpielzug(Dimension zugKoordinaten) {
    //weitergeben; muss an ServerGameController gelangen, zu Server
}

//später Methode, die es ermöglicht alles auf setEnabled(false) zu setzen

}

(不要对评论感到困惑)。

我真的尝试了几乎所有东西。它的工作原理一点也不差,但指示的盘子没有按我的意愿定位。位置大致是这样的:每个盘子的左上角都有一个坐标。该坐标用于设置 GridBagConstrains .gridx 和 .gridy。板的大小用于设置.gridwith 和.gridheight。而且我还将面板分为四块(评论:4 Quadranten)以指定 - 在我看来 - 将板集中在面板中间的正确 .anchor (=德语中的 Platte)。

欢迎任何建议。也许有人知道如何将盘子移到正确的位置?

问候,水仙花

4

0 回答 0