【问题标题】:Why is Component not drawing anything?为什么组件不绘制任何东西?
【发布时间】:2016-06-05 17:49:34
【问题描述】:

抱歉,这可能是一个非常基本的问题,但我有一个名为蝴蝶的类,其中包含用于绘制蝴蝶对象的代码,如下所示:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.BasicStroke;

public class butterfly extends JPanel {
public butterfly() {
}
     public void draw(Graphics2D g2){
    //the width of the oval. A petal is an oval.

    //TODO: Your code goes IN HERE (not in main), ALL OF IT. Replace the code below.

    //draw one oval of length 300pixels from center to edge
    g2.setColor(Color.blue);
    g2.fillOval(500,55, 70, 70);
    g2.fillOval(450, 40, 70, 70);
    g2.fillOval(460,100, 40, 40);
    g2.fillOval(495, 110, 40, 40);


    g2.setColor(Color.black);
    g2.setStroke(new BasicStroke(13));

    g2.drawLine(520, 50, 490, 150);

 }

}

然后我试着把它放在这个组件中,这样我就可以用它放更多的对象,但它甚至不会画蝴蝶?

import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class RippingOffofAmy extends JComponent
{

    private butterfly yay;

    public RippingOffofAmy()
    {
        yay = new butterfly();
    }

    public void paintComponent(Graphics g)
    {
        Graphics2D g2 = (Graphics2D) g;

       //checks to see if rectangle has moves 100 places yet
       //if has, then adds new obstacle and resets count
       yay.draw(g2);

        //draws obstacle and avatar
    }

}

为什么? (忽略我使用的一些朋友代码的类名和 cmets)如果我遗漏了什么,有人可以具体说明要添加的内容,因为我在 java 方面很糟糕,谢谢!

【问题讨论】:

  • 这不是如何进行 Swing 绘图,看起来你正在疯狂猜测如何做到这一点,不要。你看过教程了吗?这就是我要开始的地方:Lesson: Performing Custom Painting
  • 如果您在查看教程后仍然卡住,然后考虑创建并发布一个 sscceminimal example program/mcve 将您的代码压缩成仍然可以编译和运行的最小位,没有外部依赖项(例如需要链接到数据库或图像),没有与您的问题无关的额外代码,但仍能证明您的问题。
  • 1) 蝴蝶不一定是面板 2) 显示 GUI 的主要方法在哪里?
  • @user2130108 那就学习吧。说你很烂而不主动尝试提高你的知识是不好的。
  • 发布您的minimal reproducible example,让我们看看到底发生了什么。据我们所知,您的 RippingOffofAmy 类的大小为 0 x 0。此外,您应该在覆盖中调用 super 的 paintComponent 方法。

标签: java swing graphics


【解决方案1】:

您应该阅读一些教程,但这是您尝试做的。

这是我要做的:

package de;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.*;

@SuppressWarnings("serial")
public class Butterfly extends JPanel {
@Override
public void paint(Graphics g){
    super.paint(g);
    Graphics2D g2d = (Graphics2D) g;
    g2d.setColor(Color.blue);
    g2d.fillOval(500,55, 70, 70);
    g2d.fillOval(450, 40, 70, 70);
    g2d.fillOval(460,100, 40, 40);
    g2d.fillOval(495, 110, 40, 40);


    g2d.setColor(Color.black);
    g2d.setStroke(new BasicStroke(13));

    g2d.drawLine(520, 50, 490, 150);
}

}

简要说明: 创建一个 JFrame(它是窗口本身) 覆盖JPanel的pain函数 将蝴蝶的代码输入到疼痛函数中 创建一个“蝴蝶”(扩展 JPanel) 将蝴蝶添加到 JFrame 运行程序:)

【讨论】:

  • 为什么没有构造函数?因为我们扩展了 JPanel,我们要做的就是调用 super,java 会为你做这件事。如果您有其他方法,请告诉我,我渴望了解更多!
  • @user2130108:你应该发布你的minimal reproducible example,而不是借用这个善意但被误导的代码。
  • 老实说,伙计们,谢谢,但没关系,我认为我知道的任何地方都不足以提出问题,很抱歉浪费您的时间,但感谢您的帮助!
  • @HovercraftFullOfEels 哦,是的,我忘了使用 super.paint,你说得对!编辑了我的评论!
猜你喜欢
  • 2015-02-11
  • 1970-01-01
  • 2017-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多