Java Swing不在Mac上绘图

Java Swing不在Mac上绘图,java,eclipse,macos,swing,paintcomponent,Java,Eclipse,Macos,Swing,Paintcomponent,我试图在Java中使用swing绘制一个难以置信的基本形状,但是由于某些原因,它似乎不起作用。这是我从我的讲师那里下载的代码,他在一次演讲中向我们展示了这段代码,但是当我运行它时,窗口打开了,但什么也没有画出来,我不知道为什么 package graphicsEx; import java.awt.*; import java.awt.geom.*; import javax.swing.*; public class Lecture1Example extends JPanel{

我试图在Java中使用swing绘制一个难以置信的基本形状,但是由于某些原因,它似乎不起作用。这是我从我的讲师那里下载的代码,他在一次演讲中向我们展示了这段代码,但是当我运行它时,窗口打开了,但什么也没有画出来,我不知道为什么

package graphicsEx;

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

public class Lecture1Example extends JPanel{
    // This is where the JPanel gets (re-)painted when the screen is refreshed.
    public void paintComponent(Graphics g) {
        // Cast to Graphics2D for more features.        
        Graphics2D g2D = (Graphics2D) g;

        Rectangle2D rect = new Rectangle2D.Double(20,30,40,50);
        g2D.setColor(Color.red);
        g2D.draw(rect);
        g2D.fill(rect); 
    }

    public static void main(String args[]) {
        JFrame frame = new JFrame("Playing with Graphics");
        frame.setSize(500, 400);
        frame.setVisible(true);
        frame.setContentPane(new Lecture1Example());        
    }
}

我正在使用EclipseIDE

尊敬的用户1821475的讲师:

  • Swing GUI对象应仅在上构造和操作

  • “具有UI委托的Swing组件的子类(与
    JComponent
    的直接子类相比)应在其
    paintComponent
    覆盖中调用

  • “为方便起见,
    add
    及其变体,
    remove
    setLayout
    已根据需要覆盖到
    contentPane
    。”

  • 只有在调用
    pack()
    和其他影响几何体的方法之后,最外层的
    容器
    才应该是
    setVisible()


    • 尊敬的用户1821475的讲师:

      • Swing GUI对象应仅在上构造和操作

      • “具有UI委托的Swing组件的子类(与
        JComponent
        的直接子类相比)应在其
        paintComponent
        覆盖中调用

      • “为方便起见,
        add
        及其变体,
        remove
        setLayout
        已根据需要覆盖到
        contentPane
        。”

      • 只有在调用
        pack()
        和其他影响几何体的方法之后,最外层的
        容器
        才应该是
        setVisible()


      试着调用super.paintComponent(g)Make
      frame.setVisible(true)
      last.@MadProgrammer,真不敢相信事情会这么简单,非常感谢你的评论;另外,您可能希望将面板添加到内容窗格中,而不是替换内容窗格。+1疯狂和垃圾神。也不要在
      JFrame
      上调用
      setSize
      ,而要覆盖
      JPanel
      getPreferredSize()
      ,返回符合图纸的尺寸,并在
      JFrame
      上调用
      pack()
      ,然后将其设置为可见。还可以通过
      SwingUtilities.invokeXXX
      block创建和操作Swing组件。尝试调用super.paintComponent(g)Make
      frame.setVisible(true)
      last.@MadProgrammer,真不敢相信这么简单,非常感谢你的评论;另外,您可能希望将面板添加到内容窗格中,而不是替换内容窗格。+1疯狂和垃圾神。也不要在
      JFrame
      上调用
      setSize
      ,而要覆盖
      JPanel
      getPreferredSize()
      ,返回符合图纸的尺寸,并在
      JFrame
      上调用
      pack()
      ,然后将其设置为可见。还可用于通过
      SwingUtilities.invokeXXX
      block创建和操作Swing组件。