Проблемы с JFrame repaint () - Java - PullRequest
7 голосов
/ 20 июня 2011

Я хочу иметь возможность рисовать с помощью Java paint () на JFrame.Когда я щелкаю JFrame (пока что где угодно), я хочу, чтобы JFrame перекрашивался с помощью координат щелчка - аналогично этому Java-апплету http://www.realapplets.com/tutorial/MouseClickExample.html

В настоящее время работает:

  • Сначала все отрисовывается, и JFrame отображается правильно

Не работает:

  • JFrame не перерисовывается и не обновляется, даже когда объявлен repaint ()

Вот мой код - пожалуйста, будьте максимально строги с ним - я хотел бы улучшить свою технику программирования на Java, чтобы (если у вас было время) указать на каждый аспект, который я мог бы улучшить.

Любая помощь будет принята с благодарностью.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class AreaForText extends JPanel implements MouseListener {

int xpos; 
int ypos;

JFrame myJFrame = new JFrame();

public void setJFrame() {

    myJFrame.setSize(300, 150);
    myJFrame.setTitle("Bigger Text!");
    myJFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    myJFrame.setVisible(true);
    myJFrame.getContentPane().add(new AreaForText());
    myJFrame.addMouseListener(new AreaForText());

}

public void mouseClicked(MouseEvent me) {
    //Save the coordinates of the click lke this. 
    xpos = MouseInfo.getPointerInfo().getLocation().x; 
    ypos = MouseInfo.getPointerInfo().getLocation().y;
    System.out.print("Click" + "  x: " + xpos + "  y: " + ypos);
    myJFrame.invalidate();
    repaint();
    revalidate();
}


public void mouseEntered(MouseEvent e){
}

public void mouseReleased(MouseEvent e) { 
}

public void mousePressed(MouseEvent e) {
}

public void mouseExited(MouseEvent e) { 
}

public void paint(Graphics g) {

    System.out.print("hello");
    g.drawString("Hello World", 30, 80);
    g.fillRect(20,20,20,20);        
    g.drawString("("+xpos+","+ypos+")",xpos,ypos);

    }
}

class EnlargeText {

    public static void main(String args[]) {

       AreaForText test = new AreaForText();

       test.setJFrame();

    }

 } 

Ответы [ 2 ]

7 голосов
/ 20 июня 2011

Вы создаете 2 экземпляра AreaForText, а это не то, что вы хотите сделать.Один добавляется в JFrame, а другой - в прослушиватель.Таким образом, тот, который фактически получает события мыши и вызывает перерисовку, - это не тот объект, который отображается.

Некоторая часть вашей организации кода не самая лучшая.У вас есть подкласс JPanel, который создает собственный JFrame и помещает себя в панель.Вы должны просто передать JFrame, если вам это действительно нужно.Я сделал несколько изменений ниже.

РЕДАКТИРОВАТЬ .Я исправил некоторые вещи со слушателем мыши, вы получили неправильные координаты X / Y, а также вы должны просто добавить слушателя непосредственно на панель, а не JFrame, чтобы вам не приходилось переводитькоординаты.

РЕДАКТИРОВАНИЕ Я изменил метод рисования на paintComponent, который является предпочтительным методом для переопределения здесь.Для получения дополнительной информации ознакомьтесь с Swing Paint Tutorial .

import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.MouseInfo;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

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

class AreaForText extends JPanel implements MouseListener {

    private int xpos;
    private int ypos;


    public AreaForText() {
        super();
        this.addMouseListener(this);
    }

    public void mouseClicked(MouseEvent me) {
        // Save the coordinates of the click lke this.
        xpos = me.getX();
        ypos = me.getY();
        System.out.print("Click" + "  x: " + xpos + "  y: " + ypos);
        repaint();
    }

    public void mouseEntered(MouseEvent e) {
    }

    public void mouseReleased(MouseEvent e) {
    }

    public void mousePressed(MouseEvent e) {
    }

    public void mouseExited(MouseEvent e) {
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        System.out.print("hello");
        g.drawString("Hello World", 30, 80);
        g.fillRect(20, 20, 20, 20);
        g.drawString("(" + xpos + "," + ypos + ")", xpos, ypos);

    }
}

class EnlargeText {

    public static void main(String args[]) {

        EventQueue.invokeLater(new Runnable() {
            public void run() {
                JFrame myJFrame = new JFrame("Bigger Text!");
                myJFrame.setSize(300, 150);
                myJFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                myJFrame.getContentPane().add(new AreaForText());
                myJFrame.setVisible(true);
            }
        });
    }

}
0 голосов
/ 20 июня 2011

Вы не вызываете JFrames repaint() Вы вызываете JPanel метод перерисовки (класс, в котором вы находитесь)

Попробуйте:

myJFrame.repaint();
...