gpt4 book ai didi

java - JPanel "paintComponent"没有 JLabel 就无法调用

转载 作者:行者123 更新时间:2023-12-01 11:26:15 25 4
gpt4 key购买 nike

我遇到的问题是,在这段代码中,如果我从中删除 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 及其关联的 >图形,绘制到其中并在刷新时使用它),(2)在mouseDragged中捕获Point的集合,并使用它们来drawPolylinepaintComponent 方法中。

<小时/>

第三,不要在 paintComponent 内调用 repaint()。这将不必要地以永无止境的循环方式触发对 paintComponent 的调用。

第四,不要在每次调用paint时创建双缓冲区。每次刷新时,您都会创建一个新的图像。创建一次,在您的 mouseDragged 方法中绘制它并从中触发 repaint(),然后在 paintComponent 中创建一个 drawImage .

关于java - JPanel "paintComponent"没有 JLabel 就无法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30783539/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com