В настоящее время я пытаюсь создать игру с графическим интерфейсом, который должен нарисовать новые вещи на экране при нажатии кнопки. Например:
public class GUI() extends JPanel {
public void paintComponent() {
/*
*Basic initial set up here
*/
// ***** Call method here on mouse click *****
}
public void setUpGUI() {
JFrame mainFrame = new JFrame();
GUI paintGUI = new GUI();
clickDetector click = new clickDetector();
mainFrame.addMouseListener(click);
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainFrame.setSize(500, 500);
mainFrame.getContentPane().add(paintGUI);
mainFrame.setVisible(true);
}
public static void main(String args[]) {
GUI gui = new GUI();
gui.setUpGUI();
}
}
Мне нужно реализовать метод в методе //***** Call method here on mouse click *****
который будет рисовать новые дополнения к кадру (в моем случае это круги, которые представляют части на доске) но я не уверен, как это сделать при нажатии кнопки. Как я могу перекрасить кадр при каждом щелчке мыши, чтобы я мог изменить свою игровую панель?
----РЕДАКТИРОВАТЬ----
Вот мой код paintComponent, а также прослушиватель, используемый для перерисовки.
public void paintComponent(Graphics g) {
super.paintComponent(g);
System.out.println("Method called");
g.setColor(Color.red);
for(int y = 0; y < 6; y++) {
for(int x = 0; x < 7; x++) {
g.fillOval(x*70 + 10, y*70 + 10, 50, 50);
}
}
g.setColor(Color.BLACK);
g.fillRect(0, 430, 500, 50);
g.setColor(Color.white);
g.drawString("CONNECT FOUR", 250, 450);
g.setColor(Color.LIGHT_GRAY);
click.paintPiece(g);
}
public void mouseClicked(MouseEvent e) {
this.repaint();
}
Вот метод, который paintComponent должен вызывать, но не
public void paintPiece(Graphics g) {
int x = getMouseX() + 10;
int y = mover.getRow() + 10;
g.fillOval(x, y, 50, 50);
}
Просто создайте прослушиватель мыши:
MouseListener listen = new MouseListener()
{
void mouseClicked(MouseEvent e){}
void mouseReleased(MouseEvent e){}
void mousePressed(MouseEvent e){paintGUI.repaint();}
void mouseExited(MouseEvent e){}
void mouseEntered(MouseEvent e){}
};
paintGUI.addMouseListener(listen);
Каждый раз, когда вы нажимаете внутри JPanel
, вы должны увидеть его перерисовку. Аналогично, если вы хотите обновить, когда нажата JButton
, просто используйте ActionListener
:
ActionListener listen = new ActionListener()
{
public void actionPerformed(ActionEvent e){paintGUI.repaint();}
}
button.addActionListener(listen);
Это должно быть помещено в ваш setUpGUI()
.
Эти изменения позволят вам рисовать прямоугольник каждый раз, когда вы нажимаете на рамку
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class GUI extends JPanel implements MouseListener{
private Rectangle rect;
private int width = 100;
private int height = 100;
public GUI(int x, int y, int width, int height)
{
rect = new Rectangle(x, y, width, height);
}
public void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D)g;
g2d.draw(rect);
}
public void mouseClicked(MouseEvent e) {
rect = new Rectangle(e.getX(), e.getY(), width, height);
repaint();
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
public void setUpGUI() {
JFrame mainFrame = new JFrame();
mainFrame.addMouseListener(this);
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainFrame.setSize(500, 500);
mainFrame.getContentPane().add(this);
mainFrame.setVisible(true);
}
public static void main(String args[]) {
GUI gui = new GUI(0,0,100,100);
gui.setUpGUI();
}
}
Обратите внимание на MouseListener
был реализован GUI
класса и, когда вы пытаетесь инициализировать MouseListener
для кадра, вы просто положить this
в качестве параметра, который будет относиться к GUI
класса и, следовательно, к вашим JPanel
Добавьте к кнопке прослушиватель событий события.
Слушатель событий событий Oracle Docs
В методе actionPerformed добавьте все, что нужно добавить, затем вызовите
перекрасить();
ActionListener
так как он будет реагировать как на мышь, так и на клавиатуру .
repaint()
при получении щелчка мыши?