ちょっとしたボード ゲームをプログラミングする必要があり、そのために GridBagLayout を使用することにしました。これが今の様子です:(リンクをたどってください)
矢印が小さなプレートを移動する場所を示していることを願っています。
コードは次のとおりです。
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 つの部分 (コメント: 4 Quadranten) に分割して、私の見解では、パネルの中央にプレート (=ドイツ語で Platte) を集中させるための正しい .anchor を指定しました。
どんな提案でも大歓迎です。プレートを正しい位置に移動する方法を知っている誰かがそこにいるのではないでしょうか?
ごきげんよう、daflodedeing