Java 为什么赢了';fillRect命令没有出现在我的JFrame上吗?

Java 为什么赢了';fillRect命令没有出现在我的JFrame上吗?,java,swing,jpanel,Java,Swing,Jpanel,因此,我试图在单击鼠标时通过创建一个对象并将其添加到JFrame来绘制一个矩形。但一旦命令运行,它就不会显示。你知道为什么吗 import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Gui3 extends JFrame { private JPanel mousepanel; private JLabel statusbar; public Gui3(){

因此,我试图在单击鼠标时通过创建一个对象并将其添加到JFrame来绘制一个矩形。但一旦命令运行,它就不会显示。你知道为什么吗

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Gui3 extends JFrame {
    private JPanel mousepanel;
    private JLabel statusbar;

    public Gui3(){
        super("The title");

        mousepanel = new JPanel();
        mousepanel.setBackground(Color.WHITE);
        add(mousepanel, BorderLayout.CENTER);

        statusbar = new JLabel("Default");
        add(statusbar, BorderLayout.SOUTH);

        HandlerClass handler = new HandlerClass();
        mousepanel.addMouseListener(handler);
        mousepanel.addMouseMotionListener(handler);
    }   
    private class HandlerClass implements MouseListener, MouseMotionListener
        {
这就是问题所在。这个程序和它的所有方法都能工作,问题在于它只是画了一个矩形。下面是绘制形状的对象

public void mouseClicked(MouseEvent event) {
        statusbar.setText(String.format("Clicked at %d,%d",event.getX(),event.getY()));
                DrawShapes shapes = new DrawShapes();
                add(shapes);
            }
            public void mousePressed(MouseEvent event){
                statusbar.setText("You pressed down the mouse");
            }
            public void mouseReleased(MouseEvent event){
                statusbar.setText("You released the button");
            }
            public void mouseEntered(MouseEvent event){
                statusbar.setText("You entered the area");
                mousepanel.setBackground(Color.RED);
            }
            public void mouseExited(MouseEvent event){
                statusbar.setText("The mouse has left the window");
                mousepanel.setBackground(Color.WHITE);
            }
            //These are mouse motion events
            public void mouseDragged(MouseEvent event){
                statusbar.setText("You are dragging the mouse");
            }
            public void mouseMoved(MouseEvent event){
                statusbar.setText("You are moving the mouse");
            }
        }
    }
这是绘制矩形的对象

import java.awt.*;
import javax.swing.*;
public class DrawShapes extends JPanel {
    public void PaintComponent(Graphics g){
        g.setColor(Color.BLUE);
        g.fillRect(0,0,30,30);
    }
}
关于

public void PaintComponent(Graphics g){
    g.setColor(Color.BLUE);
    g.fillRect(0,0,30,30);
}
明白吗

PaintComponent != paintComponent
请务必使用
@Override
注释,让您知道何时正在重写或不正在重写您认为是的方法

正确的方法如下所示:

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);  // don't forget this!
    g.setColor(Color.BLUE);
    g.fillRect(0, 0, 30, 30);
}
另外,如果您想替换原来的JPanel,那么可以使用a来帮助您轻松地做到这一点。否则,在交换容器中的组件后,必须确保自己调用
revalidate()
repaint()

e、 g

关于

public void PaintComponent(Graphics g){
    g.setColor(Color.BLUE);
    g.fillRect(0,0,30,30);
}
明白吗

PaintComponent != paintComponent
请务必使用
@Override
注释,让您知道何时正在重写或不正在重写您认为是的方法

正确的方法如下所示:

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);  // don't forget this!
    g.setColor(Color.BLUE);
    g.fillRect(0, 0, 30, 30);
}
另外,如果您想替换原来的JPanel,那么可以使用a来帮助您轻松地做到这一点。否则,在交换容器中的组件后,必须确保自己调用
revalidate()
repaint()

e、 g


(1+)此外,您还应该重写类的
getPreferredSize()
方法,以便其他布局管理器可以使用此组件。请阅读上Swing教程中的部分,以获得一个工作示例,该示例确切地说明了如何实现这一点。保留一个指向教程的链接,因为它有关于所有Swing基础知识的信息。@camickr:谢谢。很抱歉偏离主题,但你有什么想法吗?你不同意它需要一个MCVE吗?我认为每个问题都应该有一个MCVE。每当我看到一个有20多条评论的问题时,我总是回避这个问题,因为OP根本没有花时间去听别人的建议。我们都知道1)DocumentFilter不应用于自定义文档,2)问题在于未发布的代码。(1+)还应覆盖类的
getPreferredSize()
方法,以便其他布局管理器可以使用此组件。请阅读上Swing教程中的部分,以获得一个工作示例,该示例确切地说明了如何实现这一点。保留一个指向教程的链接,因为它有关于所有Swing基础知识的信息。@camickr:谢谢。很抱歉偏离主题,但你有什么想法吗?你不同意它需要一个MCVE吗?我认为每个问题都应该有一个MCVE。每当我看到一个有20多条评论的问题时,我总是回避这个问题,因为OP根本没有花时间去听别人的建议。我们都知道1)应该使用DocumentFilter,而不是自定义文档;2)问题在于未发布的代码。