JFrame 菜单被绘制,图形在 JFrame 调整大小时消失

Posted

技术标签:

【中文标题】JFrame 菜单被绘制,图形在 JFrame 调整大小时消失【英文标题】:JFrame Menu's being drawn over and Graphics disappearing upon JFrame Resize 【发布时间】:2011-09-08 14:45:15 【问题描述】:

我是一名高中生,我正在为我的计算机科学课程做最后一个项目。我的任务是制作一个简单的油漆应用程序,但是我遇到了一些问题。其中包括:当窗口调整大小时,绘制的图像会被擦除,并且我可以在窗口中的菜单上进行绘制。

我相信我正在绘制菜单,因为我使用的是 JFrame 本身的图形对象。但是我找不到任何替代方案。我尝试制作单独的组件来绘制,甚至使用 BufferedImage,但我的尝试都没有成功。

这是我的代码:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

import javax.swing.*;

public class Paint implements MouseMotionListener

private JFrame window;
private drawingComponent pComp;
private int xPos; //xPos of mouse;
private int yPos; //yPos of mouse;
private Color color; // new color
private JTextArea sizeBox;

private int brushShape = 0;

public static void main(String[] args) 
    Paint paint = new Paint();
    paint.ImplementGUI();


public Paint() 
    this.pComp = new drawingComponent();
    this.window = new JFrame("JPaint");
    this.window.setSize(500, 500);
    this.window.setVisible(true);
    this.window.addMouseMotionListener(this);
    this.window.add(this.pComp);


public void ImplementGUI() 
    JMenuBar menu = new JMenuBar();
    JMenu brush = new JMenu("Brush Settings");
    JMenu brushShape = new JMenu("Shape");
    brush.setSize(100,100);
    brush.add(brushShape);
    menu.add(brush);
    menu.setSize(window.getWidth(), 20);
    menu.setVisible(true);

    this.sizeBox = new JTextArea("Brush Size:");
    this.sizeBox.setText("20");
    brush.add(this.sizeBox);

    this.window.setJMenuBar(menu);


public void mouseDragged(MouseEvent pMouse) 
    if (pMouse.isShiftDown() == true) 
        this.pComp.paint(this.window.getGraphics(), pMouse.getX(), pMouse.getY(),
                         window.getBackground(), Integer.parseInt(sizeBox.getText()));
    
    else 
        this.pComp.paint(this.window.getGraphics(), pMouse.getX(), pMouse.getY(),
                         color, Integer.parseInt(sizeBox.getText()));
    


public void mouseMoved(MouseEvent pMouse) 




class drawingComponent extends JComponent 
    public void paint(Graphics g, int x, int y, Color color, int size) 
        g.setColor(color);
        g.fillOval(x-(size/2), y-(size/2), size, size); // 10 is subtracted from
        // coordinates so the mouse pointer is at the exact middle of the brush.
    

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

切勿使用 getGraphics() 方法进行绘画。如您所见,这种影响只是暂时的。

自定义绘画是通过覆盖paintComponent()方法而不是paint()方法来完成的。

有关如何在面板上绘制多个对象的几个示例,请参阅 Custom Painting Approaches。

【讨论】:

【参考方案2】:

camickr 是对的。当您调整窗口大小时,ImplementGUI 组件被重新绘制,因此将调用 ImplementGUI.paintComponent() 来重新绘制组件的整个表面,并且您在 mouseDragged() 中绘制的内容将丢失。

【讨论】:

以上是关于JFrame 菜单被绘制,图形在 JFrame 调整大小时消失的主要内容,如果未能解决你的问题,请参考以下文章

全屏Java中的JFrame

用java编写一个颜色为红色,粗线型的笑脸和哭脸,需要继承JFrame类,用java中的绘制图形做

在 JFrame 中将图像绘制到 JPanel

在 JFrame 中添加来自同一类的两个组件

菜单栏出现在 JFrame 的左侧。如何让它出现在JFrame的顶部?

如何在不覆盖JFrame的情况下将JPanel图形添加到JFrame