2015-04-11 2 views
1

В настоящее время я пытаюсь создать игру с графическим интерфейсом, который должен нарисовать новые вещи на экране при нажатии кнопки. Например:Перекрашивание рамки с помощью мыши?

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 *****, который будет рисовать на новых дополнения к раме (в моем случае это круги, которые представляют собой фигуру на доске), но я не уверен, как для этого нажмите кнопку. Как я могу перекрасить кадр при каждом щелчке мыши, чтобы я мог изменить свою игровую панель?

---- EDIT ----

Вот мой 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); 
    } 
+1

Вы пытались вызвать 'repaint()' при получении щелчка мыши? – John

ответ

2

Просто создать слушателя мыши:

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().

+1

Спасибо за эту идею, я не думал использовать прослушиватель мыши в своем классе, где происходит картина. Я считаю, что это сработает, хотя я столкнулся с одной проблемой. Моя доска, безусловно, перекрашивает сейчас, но метод добавления частей не называется. Я добавил код в свой ответ, чтобы показать, что я имею в виду. – AlecR

0

Добавить действие Слушатель событий на кнопку.

Oracle Docs Action Event Listener

В методе actionPerformed добавить все, что должно быть добавлено затем вызвать

перекрасить();

+1

OP упомянул щелчок на кнопке ** **. Лучший слушатель кнопки - это «ActionListener», так как он будет реагировать на вход мыши * и клавиатуры *. –

+0

@AndrewThompson Да, я пропустил это, я думал, что он сказал, просто нажав кнопку. Хороший улов, я прав. –

0

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

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

Смежные вопросы