2D массив сетки - размещение персонажа в середине каждой ячейки - PullRequest
0 голосов
/ 03 декабря 2018

с двумерным массивом символов, который должен представлять карту

char test[][]={{'A','B','C'},{'D','E','F'},{'G','H','I'};

как бы мне создать сетку 3x3, используя библиотеку java.awt, в которой каждый символ находится в центре каждой ячейки?

Приведенный ниже код дает мне сетку, но я все еще не уверен, как поместить каждый символ в центр каждой ячейки.

int sideLength=115;
int distance=sideLength*3;
int i=0;
int j=0;

for ( int x=90; x<=distance; x+=sideLength )
{
    for( int y=30; y<=distance; y+=sideLength )
    {

       g.drawRect(x,y,sideLength, sideLength);
       g.drawString(Character.toString(test[i][j]), sideLength/2, sideLength/2);

    }  
    i++;
    j++;
}          

Этот код дает мне этот вывод

enter image description here

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Ты близко, но я бы немного поменял твои петли.Вместо итерации по расстоянию, итерируйте по индексу в массиве.Используйте индекс массива, чтобы затем получить позиции.

char[][] test = {{'A','B','C'}, {'D','E','F'}, {'G','H','I'}};

int sideLength=115;

for (int i = 0; i < test.length; i++) {
    int x = 90 + sideLength * i;
    for (int j = 0; j < test[j].length; j++) {
        int y = 30 + sideLength * j;

        g.drawRect(x, y, sideLength, sideLength);
        g.drawString(
            Character.toString(test[i][j]), 
            x + sideLength / 2, 
            y + sideLength / 2);

    }  
}       
0 голосов
/ 03 декабря 2018

Ничего, кроме дыма и зеркал ...

Хорошо, JLabel с и Border с

Labels and borders

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.Border;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;
import javax.swing.border.MatteBorder;

public class Test {

  public static void main(String[] args) {
    new Test();
  }

  public Test() {
    EventQueue.invokeLater(new Runnable() {
      @Override
      public void run() {
        JFrame frame = new JFrame();
        frame.add(new TestPane());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
      }
    });
  }

  public class TestPane extends JPanel {

    public TestPane() {
      setBorder(new EmptyBorder(10, 10, 10, 10));
      setLayout(new GridLayout(0, 3));
      String test[][]={{"A","B","C"},{"D","E","F"},{"G","H","I"}};
      Border paddingBorder = new EmptyBorder(50, 50, 50, 50);
      for (int row = 0; row < 3; row++) {
        for (int col = 0; col < 3; col++) {
          JLabel label = new JLabel(test[row][col]);
          label.setVerticalAlignment(JLabel.CENTER);
          label.setHorizontalAlignment(JLabel.CENTER);

          Border edgeBorder = new MatteBorder(
                  1, 
                  1, 
                  row == 2 ? 1 : 0, 
                  col == 2 ? 1 : 0, 
                  Color.BLACK);
          label.setBorder(new CompoundBorder(edgeBorder, paddingBorder));

          add(label);
        }
      }
    }

  }

}

Существует множество вариаций на эту тему, но он представляет собой самый простой подход

Пользовательский маршрут рисования ...

Если вы хотите следовать пользовательскому маршруту рисования, значит, вы собираетесьчтобы лучше понять, как на самом деле работают шрифты.

Я бы порекомендовал начать с Работа с текстовыми API , чтобы получить базовые знания.

Далее выправильно увеличивайте свойства i и j.j необходимо сбросить перед рендерингом каждого столбца и увеличивать для каждой строки.

Лично я бы сделал это наоборот, где вы использовали индекс для каждой строки / столбца, чтобы получитьзначение из массива, а затем рассчитать положение х / у на основе текущего индекса строки / столбца, но это только я.

Custom rendering

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FontMetrics;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Test {

  public static void main(String[] args) {
    new Test();
  }

  public Test() {
    EventQueue.invokeLater(new Runnable() {
      @Override
      public void run() {
        JFrame frame = new JFrame();
        frame.add(new TestPane());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
      }
    });
  }

  public class TestPane extends JPanel {

    String test[][] = {{"A", "B", "C"}, {"D", "E", "F"}, {"G", "H", "I"}};

    public TestPane() {
    }

    @Override
    public Dimension getPreferredSize() {
      return new Dimension(90 + (115 * 4), 30 + (115 * 4));
    }

    @Override
    protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      int sideLength = 115;
      int distance = sideLength * 3;
      int i = 0;

      for (int x = 90; x <= distance; x += sideLength) {
        int j = 0;
        for (int y = 30; y <= distance; y += sideLength) {

          g.drawRect(x, y, sideLength, sideLength);

          FontMetrics fm = g.getFontMetrics();
          int yPos = y + ((sideLength - fm.getHeight()) / 2) + fm.getAscent();
          int xPos = x + ((sideLength - fm.stringWidth(test[i][j])) / 2);

          g.drawString(test[i][j], xPos, yPos);
          j++;
        }
        i++;
      }
    }

  }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...