Переопределить рисование компонента работает только для первой кнопки GridLayout - PullRequest
1 голос
/ 27 марта 2020

Привет, я только начал программировать небольшую игру и использовать java JButtons, я создал наследуемый класс JButton с переопределенным компонентом рисования, каждая из этих кнопок помещена в JPanel с разметкой сетки, а внешний вид кнопок по умолчанию, за исключением первой кнопки (в верхнем левом углу), как заставить каждую кнопку рисовать, как я определил ее в моем методе paintcomponent? На данный момент я использую два класса:

package main;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class World {

private Square[][] map;

public World() {

    // Panels settings

    JPanel mapHUD = new JPanel();
    mapHUD.setPreferredSize(new Dimension(400, 400));
    mapHUD.setLayout(new GridLayout(8, 8));

    JPanel blueTeamHUD = new JPanel();
    blueTeamHUD.setPreferredSize(new Dimension(100, 400));

    JPanel redTeamHUD = new JPanel();
    redTeamHUD.setPreferredSize(new Dimension(100, 400));

    JPanel spellsHUD = new JPanel();
    spellsHUD.setPreferredSize(new Dimension(600, 200));

    // Map settings

    map = new Square[8][8];
    for (int j = 0; j < 8; j++)
        for (int i = 0; i < 8; i++) {
            map[i][j] = new Square(i, j, i + "" + j);
            mapHUD.add(map[i][j]);
        }

    // Frame settings

    JFrame frame = new JFrame();
    frame.setTitle("Koko");
    frame.setSize(600, 600);
    frame.setResizable(false);
    frame.setLocationRelativeTo(null);

    frame.setLayout(new BorderLayout());
    frame.getContentPane().add(mapHUD, BorderLayout.CENTER);
    frame.getContentPane().add(blueTeamHUD, BorderLayout.WEST);
    frame.getContentPane().add(redTeamHUD, BorderLayout.EAST);
    frame.getContentPane().add(spellsHUD, BorderLayout.SOUTH);

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);

}
}

package main;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JButton;

public class Square extends JButton implements MouseListener {

private static final long serialVersionUID = 1L;

private int x;
private int y;

public Square(int x, int y, String name) {
    super(name);
    this.addMouseListener(this);
    this.x = x;
    this.y = y;
}

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;
    g2.setPaint(Color.BLACK);
    g2.fillRect((int) this.getLocation().getX(), (int) this.getLocation().getY(), this.getWidth(),             
this.getHeight());
}

// MouseListener methods

@Override
public void mouseClicked(MouseEvent arg0) {
    // TODO Auto-generated method stub

}

@Override
public void mouseEntered(MouseEvent arg0) {
    // TODO Auto-generated method stub
    this.setBackground(Color.BLACK);
}

@Override
public void mouseExited(MouseEvent arg0) {
    // TODO Auto-generated method stub
    this.setBackground(Color.RED);
}

@Override
public void mousePressed(MouseEvent arg0) {
    // TODO Auto-generated method stub

}

@Override
public void mouseReleased(MouseEvent arg0) {
    // TODO Auto-generated method stub

}

}

1 Ответ

1 голос
/ 27 марта 2020

Это очень неправильно:

g2.fillRect((int) this.getLocation().getX(), int) this.getLocation().getY(), 
    this.getWidth(), this.getHeight());

Полученное местоположение - это расположение компонента (кнопки) относительно его контейнера, это JPanel. Вам нужно рисовать относительно самого компонента, начиная с 0, 0, и так:

g2.fillRect(0, 0, this.getWidth(), this.getHeight());

- это то, что вам нужно

Именно поэтому работает только рисование первой кнопки: для первая кнопка, местоположение равно в 0, 0 относительно JPanel.

...