JPanel中的Java代码绘制

时间:2016-04-16 05:47:21

标签: java swing jpanel paint

我刚开始学习Java,现在最近在控制台之外学习新东西。我复制了教授董事会的代码,但似乎无法让它发挥作用。现在假设绘制圆形和矩形,但是当我尝试绘制时,我只是得到一个空白窗口。我想我可能错过了一行代码或其他东西。我在Mac上使用Eclipse。

我知道可能有很多方法可以做到这一点,但我希望能够保持代码的确切方式,以及你认为可以使其工作的任何修复。非常感谢。

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

public class Bunny {
    public static void main(String [] args)
    {
        MyFrame f = new MyFrame();
    f.setSize(500,400);
    f.setVisible(true);
    f.setLocation(50,100);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    }






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

public class MyFrame extends JFrame
    {
        public MyFrame()
        {   
        }
    }



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


public class MyPanel extends JPanel
{
public void paintComponent(Graphics g)
{Graphics2D g2 = (Graphics2D) g;


Ellipse2D.Double Circle = new Ellipse2D.Double(100,50,75,75);

g2.setColor(Color.RED);
g2.fill(Circle);

Rectangle box = new Rectangle(200,100,150,150);
g2.setColor(Color.RED);
g2.fill(box);

Color myColor = new Color(255,0,0);
}
}

1 个答案:

答案 0 :(得分:3)

我非常想告诉你的教授,他们需要回到学校学习如何正确使用Swing

您应首先查看Painting in AWT and SwingPerforming Custom Painting,了解有关绘画如何在Swing中工作的详细信息

Example

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.geom.Ellipse2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(400, 400);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D) g.create();
            Ellipse2D.Double Circle = new Ellipse2D.Double(100, 50, 75, 75);

            g2.setColor(Color.RED);
            g2.fill(Circle);

            Rectangle box = new Rectangle(200, 100, 150, 150);
            g2.setColor(Color.RED);
            g2.fill(box);
            g2.dispose();
        }

    }

}

代码审查......

public class Bunny {

    public static void main(String[] args) {
        MyFrame f = new MyFrame();
        f.setSize(500, 400);
        f.setVisible(true);
        f.setLocation(50, 100);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

错误:从事件调度线程的上下文外部与UI交互。有关详细信息,请参阅Initial Threads

public class MyFrame extends JFrame {

    public MyFrame() {
    }
}

错误:从顶级容器延伸(如JFrame)通常是不鼓励的,您不会在课程中添加任何新功能,这是大多数问题发生的区域之一。你可能想对“继承的构成”进行一些研究。

您实际上也没有向框架添加任何内容,因此它将显示为空白。

public class MyPanel extends JPanel {

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

        Ellipse2D.Double Circle = new Ellipse2D.Double(100, 50, 75, 75);

        g2.setColor(Color.RED);
        g2.fill(Circle);

        Rectangle box = new Rectangle(200, 100, 150, 150);
        g2.setColor(Color.RED);
        g2.fill(box);

        Color myColor = new Color(255, 0, 0);
    }
}

错误:paintComponent永远不应该是public,没有理由任何其他类应该调用此方法。不调用super.paintComponent将导致图形故障和问题无法结束,您应该首先调用super.paintComponent。只有当你知道自己在做什么并且你有一个非常好的理由不...时,这种情况只有<1%。