java - 在 JFrame 中绘制矩形不起作用

标签 java swing jframe

我有一段代码应该在 JFrame 上绘制一个矩形,但是当我在 Eclipse 上运行该程序时,它只是打开框架,而不是在其上绘制圆圈。

代码如下:

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

public class Infout {
    Infout(){
        JFrame frame = new JFrame();

        frame.setSize(300, 400);
        frame.setTitle("An Empty Frame");
        frame.setDefaultCloseOperation(3);

        frame.setVisible(true);
    }

    public static void main(String[] args) {
         // TODO Auto-generated method stub
         Infout m = new Infout();
         m.paint(null); 
    }

    public void paint(Graphics g) 
    {
         g.drawRect(5, 5, 105, 105);
    }
}

有人可以告诉我为什么它不能正常工作吗?

最佳答案

我相信您要做的是调用 frame.repaint();。但是,这仍然不能解决您的问题,因为您的 paint() 方法实际上并未覆盖 JFramepaint() 方法因为您的类没有扩展 JFrame,它只是在构造函数中创建一个 JFrame

因此,您可以要么做最后一分钟的重写并将您的绘画方法移到其中(根据 polypiel 的回答),或者(我个人认为更有说服力)您可以让您的类扩展 JFrame,像这样;

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

public class Infout extends JFrame{
    Infout(){
        setSize(300, 400);
        setTitle("An Empty Frame");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

    public static void main(String[] args) {
         Infout m = new Infout();
         m.repaint(); 
    }

    @Override
    public void paint(Graphics g) 
    {
         g.drawRect(5, 5, 105, 105);
    }

}

正如其他人指出的那样,paintComponent() 是更好的覆盖选择,您应该记住在开始时对 super() 进行适当的调用新的覆盖方法。然后,您必须创建一个新的 JPanel 以放入您的 JFrame,因为 JFrame 没有 paintComponent() 要覆盖的方法。

为此,您可以从您的类中完全删除您的 paint() 方法,并将以下最后一分钟的覆盖添加到您的构造函数中:

    setLayout(new BorderLayout());
    add(new JPanel(){
        @Override
        public void paintComponent(Graphics g){
            super.paintComponent(g);
            g.drawRect(5, 5, 105, 105);
        }
    }, BorderLayout.CENTER);

然而,为了可扩展性和良好的面向对象设计,从长远来看,您最好定义自己的 JPanel 子类并覆盖那里的 paintComponent(Graphics) 方法。对不起,我胡说八道,希望这对您有所帮助。

关于java - 在 JFrame 中绘制矩形不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22402131/

相关文章:

java - SWIG 在为 Java 包装 C++ 时显示错误

java - 如何让 JPanel 垂直对齐?

java - GridLayout 中的组件无法正确显示

java - 如何读取文件文本到 JList

java - 在服务器上使用 Ant 实现自动化

java - 如何为 setAsciiStream 方法提供正确的参数?

java - 文档似乎为空,但我可以获取第一个元素

java - 图片之间切换(JFrame、JButton)

java - 为什么 Java 按钮使用字符串命令而不是枚举?

java - 如何制作带有图像填充的 JLabel BorderLayout.CENTER