我必须编写一个小棋盘游戏,为此我决定使用 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 Quadranten)以指定 - 在我看来 - 将板集中在面板中间的正确 .anchor (=德语中的 Platte)。
欢迎任何建议。也许有人知道如何将盘子移到正确的位置?
问候,水仙花