簡體   English   中英

沒有JLabel不能調用JPane“ paintComponent”

[英]JPane “paintComponent” can't be called without JLabel

我遇到的問題是,在這段代碼中,如果我擺脫了JLabel,這條線根本不會畫。 我對其進行了測試,並且其中沒有JLabel內容,paintComponent(Graphics g)根本無法運行。 我想知道為什么會這樣,為什么JLabel會像這樣影響JPanel。

我已經在線閱讀了一些信息,如果paintComponent(Graphics g)處於無限循環中,則有時可能無法運行,但我仍然不了解JLabel將如何影響此特性。

我猜想它可能必須對布局做些什么,但我不太了解布局如何影響這樣的事情

MouseAction類

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



public class MouseAction extends JFrame{
    private JPanel mousePanel;
    private JLabel statusBar;
    private GraphicsPanel g;
    private int xS;
    private int yS;

    public MouseAction (){
        super("Mouse example");
        mousePanel = new JPanel();
        statusBar = new JLabel("Deafault");

        g = new GraphicsPanel(0,0,0,0);


        add(mousePanel, BorderLayout.CENTER);

        add(statusBar, BorderLayout.SOUTH);

        MouseExploits handler = new MouseExploits();

        mousePanel.addMouseListener(handler);
        mousePanel.addMouseMotionListener(handler);



    }

    private class MouseExploits extends MouseAdapter{
        public void mousePressed(MouseEvent mouse){
            if(mouse.isMetaDown()){
                xS= mouse.getX();
                yS= mouse.getY();
            }
        }
        public void mouseDragged(MouseEvent mouse){
            if(!(mouse.isMetaDown() || mouse.isAltDown())){

                g.updateCoordinates(mouse.getX(),mouse.getY(), xS,yS);
                add(g);
                System.out.printf("%d,%d\n",mouse.getX(),mouse.getY());
                statusBar.setText(String.format("%d,%d",mouse.getX(),mouse.getY()));
            }
        }
    }
}

GraphicsPanel類

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


public class GraphicsPanel extends JPanel{
    private int x;
    private int y;
    private int xS;
    private int yS;
    private Graphics dB;
    private Image dBImage;

    public graphics(int mouseX, int mouseY, int xSm, int ySm){
        x = mouseX;
        y = mouseY;
        xS=xSm;
        yS=ySm;
        //System.out.println("Breaks2");

    }

    public void updateCoordinates(int mouseX, int mouseY, int xSm, int ySm){
        x = mouseX;
        y = mouseY;
        xS=xSm;
        yS=ySm;
        //repaint();
    }

    public void paint(Graphics g){
        dBImage = createImage(getWidth(),getHeight());
        dB = dBImage.getGraphics();
        paintComponent(dB);
        g.drawImage(dBImage,0,0,this);
    }

    public void paintComponent(Graphics g){
        //super.paintComponent(g);
        System.out.println("Breaks3");
        g.drawLine(xS,yS,x,y);
        repaint();
    }
}

MainProg類

import javax.swing.JFrame;

public class MainProg {
    public static void main(String args[]){
        MouseAction frameObj= new MouseAction ();
        frameObj.setSize(300,230);

        frameObj.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frameObj.setVisible(true);
    }
}

編輯:代碼現在包含雙緩沖並已進行了修改,因此GraphicsPanel不會實例化多個時間,但是在不中斷程序的情況下無法刪除JLabel的問題仍在繼續。

編輯2:刪除JLabel后,在與窗口弄亂后,似乎只在我在屏幕上拖動,調整窗口大小然后再次在屏幕上拖動時才起作用。 因此,似乎存在一些jpanel布局錯誤,並且該錯誤由jlabel在那里得到解決。

代碼的第一個問題是在每個mouseDragged事件中實例化graphics 這很奇怪也很糟糕。 您只必須處理每個mouseDragged ,存儲坐標並在創建並在開始時添加到接口的單個graphics實例上調用repaint 這將導致刷新。

其次, paintComponent應該只是繪制圖形,所以您必須使用某種(1)雙重緩沖(創建離線BufferedImage及其相關的Graphics ,將其繪制並刷新使用),(2) Point集合陷入mouseDragged並用它們來drawPolylinepaintComponent方法。


第三,不要在paintComponent內調用repaint() 這將以一種paintComponent無休止的循環不必要地觸發對paintComponent調用。

第四,不要在每次調用paint創建一個雙緩沖區。 每次刷新時,您都會創建一個新的Image 創建一次,在mouseDragged方法中繪制它,並從中觸發一個repaint() ,然后在paintComponent創建一個drawImage

暫無
暫無

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

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