当前位置: 首页 > 知识库问答 >
问题:

在不扩展JFrame的情况下使用getGraphics()绘制对象

钱星华
2023-03-14

如何在没有类(扩展JFrame)的情况下绘制对象?我找到了getgraphics方法,但它不能绘制对象。

import javax.swing.*;
import java.awt.*;
public class Main {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        frame.setSize(600, 400);

        JPanel panel = new JPanel();
        frame.add(panel);

        Graphics g = panel.getGraphics();
        g.setColor(Color.BLUE);
        g.fillRect(0, 0, 100, 100);
    }
}

共有1个答案

鲜于德业
2023-03-14

如果希望更改组件的绘制方式(添加矩形),则需要在该组件中重新定义PaintComponent()。在您的代码中,您使用的是getgraphics()

不应该在组件上调用getgraphics()。您所做的任何绘制(对返回的图形)都将是临时的,并且在下一次Swing确定需要重新绘制组件时将丢失。

相反,您应该重写PaintComponent(Graphics)方法(JComponentJPanel),并使用作为参数接收的Graphics对象在此方法中进行绘制。

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

public class Main {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        frame.setSize(600, 400);

        JPanel panel = new JPanel() {
            @Override
            public void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.setColor(Color.BLUE);
                g.fillRect(0, 0, 100, 100);
            }
        };
        frame.add(panel);

        // Graphics g = panel.getGraphics();
        // g.setColor(Color.BLUE);
        // g.fillRect(0, 0, 100, 100);

        frame.validate(); // because you added panel after setVisible was called
        frame.repaint(); // because you added panel after setVisible was called
    }
}

另一个版本做了完全相同的事情,但对你来说可能更清楚:

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

public class Main {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        frame.setSize(600, 400);

        JPanel panel = new MyRectangleJPanel(); // changed this line
        frame.add(panel);

        // Graphics g = panel.getGraphics();
        // g.setColor(Color.BLUE);
        // g.fillRect(0, 0, 100, 100);

        frame.validate(); // because you added panel after setVisible was called
        frame.repaint(); // because you added panel after setVisible was called
    }
}

/* A JPanel that overrides the paintComponent() method and draws a rectangle */
class MyRectangleJPanel extends JPanel {
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.BLUE);
        g.fillRect(0, 0, 100, 100);
    }
}
 类似资料:
  • 问题内容: 如何在没有类的情况下绘制对象(扩展了)?我找到了方法,但它没有绘制对象。 问题答案: 如果要更改组件的绘制方式(添加矩形),则需要在该组件中重新定义。在你的代码中,你正在使用 。 你不应该调用组件。你所做的任何绘画(退还给你的绘画)都是暂时的,并且在Swing下次确定需要重新绘画组件时将丢失。 相反,你应该覆盖或的)方法,并使用接收到的对象作为参数在此方法中进行绘制。 检查此链接以进一

  • 问题内容: 将图片绘制到jframe时出现null异常错误。我调试代码并检查图像和框架是否不为null,但在将图像绘制到框架时仍然抛出NULL异常。 请看一看 : 问题答案: NPE可能来自这里: 根据文档: 为此组件创建图形上下文。如果此组件当前不可显示,则此方法将返回null。 1)不要将其用作坏习惯/不能持久使用,除非组件可见,否则它将返回。 2)相反,使用和覆盖不要忘记在覆盖中作为第一个呼

  • 我可以使用此命令添加Jfram对象 然而,当我在一个单独的方法中编写这个时,我无法添加,因为“this”方法位于该对象内。 如何选择jframe而不是“this” 我不想创建新的jframe,因为已经有了

  • 我想创建一个项目列表使用回收人员视图,并想展开特定项目时点击(如在电话呼叫列表)。我想实现这一点,而不使用任何库。有人能帮忙吗?

  • 是否有可能在matplotlib中添加一个条目到图例中而不绘制相应的对象? 例如,我在一个图形上绘制了两组三条线。它们成对出现,所以我想用相应的颜色绘制它们,其中一个是虚线,另一个是实线。 但是,与图例中的所有六个项目不同,(纯蓝色1、纯橙色2、纯绿色3、纯蓝色1、纯橙色2、纯绿色3),我希望有三个项目(纯蓝色1、纯橙色2、纯绿色3),然后有两个额外的项目来消除虚线与实线之间的歧义(纯黑色“正片”

  • 问题内容: 我是一个狂热的程序员,但是今天是我的第一堂Java课。 使用上面的代码,我想在窗口上写一个句子,但是它永远不会写。我究竟做错了什么? 编辑:没关系-油漆一定是油漆。我深表歉意。 问题答案: 在给定的代码中,您想要的是 一个工作示例供您参考: