簡體   English   中英

JFrame repaint()問題 - Java

[英]JFrame repaint() issues - Java

我希望能夠在JFrame上使用Java的paint()進行繪制。 當我單擊JFrame(現在任何地方)時,我希望用點擊的坐標重新繪制JFrame - 類似於這個Java小程序http://www.realapplets.com/tutorial/MouseClickExample.html

正在工作:

  • 最初繪制所有內容並正確顯示JFrame

不工作:

  • 即使聲明了repaint(),JFrame也不會重新繪制和更新

這是我的代碼 - 請盡可能嚴格 - 我希望改進我的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個AreaForText實例,這不是您想要做的。 一個添加到JFrame,一個添加到偵聽器。 因此實際獲取鼠標事件並且正在調用重繪的那個與正在顯示的對象不同。

你的一些代碼組織並不是最好的。 你有一個JPanel子類,它構建自己的JFrame並將自己放入面板中。 如果你真的需要它,你應該傳入JFrame。 我在下面做了一些改動。

編輯 我修復了一些鼠標監聽器的東西,你得到了錯誤的X / Y坐標,而且,你應該直接將監聽器添加到面板而不是JFrame,這樣你就不必翻譯坐標。

編輯我將paint方法更改為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);
            }
        });
    }

}

你沒有調用JFrames repaint()你正在調用JPanel重繪方法(你所在的類)

嘗試:

myJFrame.repaint();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM