![](/img/trans.png)
[英]Why JLabel isn't refreshing when setText() method is called within jpanel.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
並用它們來drawPolyline
中paintComponent
方法。
第三,不要在paintComponent
內調用repaint()
。 這將以一種paintComponent
無休止的循環不必要地觸發對paintComponent
調用。
第四,不要在每次調用paint
創建一個雙緩沖區。 每次刷新時,您都會創建一個新的Image
。 創建一次,在mouseDragged
方法中繪制它,並從中觸發一個repaint()
,然后在paintComponent
創建一個drawImage
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.