マップエディタを作成しようとしていますが、Graphics2dで描画したグリッドの位置を取得したいと考えています。しかし、私は解決策を見つけることができませんでしたので、各矩形の内側にMouseListenersで目に見えないJLabelを描画するというアイデアを思いつきました。しかし、私はJLabelsを描画された長方形に合わせることはできません。Javaはスイングコンポーネントとグラフィックス描画を結合します
私は描画する複数のコンポーネントがあり、それらを重ね合わせて重ねる必要があるので、これをやっています。したがって、一度に1つの画像しか保持できないため、コンポーネントを使用することはできません。
public class MainGui extends JFrame {
public MainGui(int width, int height) {
this.setTitle("Map Editor");
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
GuiGridPanel guiGridPanel = new GuiGridPanel(width, height);
add(guiGridPanel.buildGuiGrid(), BorderLayout.CENTER);
setSize(new Dimension(780,480));
setLocationRelativeTo(null);
setVisible(true);
}
}
public class GuiGridPanel extends JPanel {
private Graphics2D render;
private int width;
private int height;
private JPanel gridPanel;
private final int gridSize = 32;
public GuiGridPanel(int width, int height){
this.width = (width);
this.height = (height);
gridPanel = new JPanel(new GridLayout(height, width));
buildLabels();
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
render = (Graphics2D) g;
drawMap();
}
public JScrollPane buildGuiGrid() {
add(gridPanel);
JScrollPane jScrollPane = new JScrollPane(this);
jScrollPane.getVerticalScrollBar().setUnitIncrement(16);
return jScrollPane;
}
private void buildLabels() {
for(int x = 0; x < height; x++) {
for (int y = 0; y < width; y++) {
JLabel label = new JLabel("HERE");
label.setBounds(x*gridSize, y*gridSize, gridSize, gridSize);
gridPanel.add(label);
}
}
}
private void drawMap() {
for(int x = 0; x < height; x++) {
for(int y = 0; y < width; y++) {
render.drawRect(x*gridSize, y*gridSize, gridSize, gridSize);
}
}
}
}
テスト目的のために:ここで
は、現在私が使用している最低限の実施例です。私はJLabelsの名前として "Here"を入れて、各矩形の内側に入っていることを確認します。しかし、現在彼らはそれをやっていません。私はJLabelの境界を修正しようとしましたが、レイアウトマネージャをnullに設定して自由に配置できるようにしましたが、動作させることができませんでした。
おかげ
「私はグリッドの位置を取得したい」 - あなたが何を意味するかわからない。パネルに幅100ピクセル、グリッド10個のパネルがある場合は、マウスポイントを特定のグリッドに簡単に変換できます。つまり、マウスポイントのx値を10で割り、整数値をとって "X"グリッドを与えます。 "Y"グリッドについても同じ操作を行います。 – camickr