在jframe中创建java的正方形,矩形,三角形

时间:2017-01-30 17:26:32

标签: java swing graphics geometry custom-painting

我有一个Java的问题我理解不是来Java中的Draw Geometric数字,代码和以下你可以帮助我吗?

这是代码:

public class Gioco {


    public static void main (String args [])
    {
        PaintRect();

    }

    public static void PaintRect() {

        g.drawRect(100,100,300,300);
        g.drawLine(100,100,100,100);
        g.setBackground(Color.BLACK);
        System.out.println("Trasut");
        credits.setText("Kitebbiv");
        credits.setBackground(null);
        credits.setEditable(false);
        credits.setFocusable(false);
        credits.setBounds(0,0,100,100);
        credits.setForeground(Color.BLACK);
        panel.add(credits);
        g.getPaint();
    }

如何创建JFrame三角形,正方形和矩形?更正我的代码谢谢

1 个答案:

答案 0 :(得分:2)

在我开始撰写答案之前,我需要鼓励您仔细阅读:如何创建有效的Minimal, Complete and Verifiable ExampleShort, Self Contained, Correct Example

  1. 从您(现已删除)的代码中,我发现您还没有通过Swing Tutorial on Custom Painting,或者您甚至没有注意它,这条线路会给您带来问题

    static Graphics2D g = new Graphics2D() 
    
  2. 过度使用static修饰符会对您造成伤害,static不是跨方法魔术词,使您的变量可以在程序中的任何位置访问,您应该创建你的程序的一个实例并从那里调用方法(它们不是静态的),请参阅Why are static variables considered evil?,你应该回过头来learn the essentials,然后再使用GUI为你的学习增加更多的复杂性,甚至更多用Swing自定义绘画。

  3. 您正在使用setBounds()方法,建议(我可以在您删除的代码中确认)您使用的是null-layout

    panel.setLayout(null);
    

    您应该考虑查看layout managers

  4. 您正在使用已弃用的方法JFrame#show(),而应使用JFrame#setVisible()方法。

  5. 您需要手动设置JFrame的大小,您应该使用布局管理器并调用方法JFrame#pack(),这将计算{{1}的首选大小或覆盖您的组件JFrame

  6. 在您删除的代码中,getPreferredSize()附加了MouseListener,而您需要使用JButton,请参阅How to use Actions了解相关信息。

  7. 您没有将您的程序放在Event Dispatch Thread (EDT)上,这会使您的程序冻结,因为Swing不是Thread安全的。您可以通过编写ActionListener方法来更正此问题:

    main
  8. 你应该更礼貌:"更正我的代码谢谢" 听起来像订单,我会说像你可以帮我吗? / em>这听起来像是某人要求你帮忙的请求/请愿书,因为他们可以,而不是因为他们必须帮助你,所有上述要点都会纠正你的代码。

  9. 在完成上述所有内容之后(您应该仔细阅读)我们可以继续编写代码:

    为了绘制一个矩形,我们需要了解一个矩形:

    • 矩形的宽度和高度都不同
    • 在Swing中绘制矩形的方法是使用public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { //Your constructor here } }); } 方法的 drawRect(x, y, width, height) draw(Shape)Graphics2D将是Shape的实例{3}}

    要画一个正方形,我们需要知道:

    你必须说... "但是你用来绘制正方形的方法与矩形相同!" ,嗯......是的,我们是,区别在于我们将为方形和不同大小的矩形传递widthheight相同的大小。

    要绘制三角形,您需要知道:

    • 三角形有3个边,可以是相同或不同的尺寸
    • 我们在Swing中没有drawTriangle的方法,但是Graphics2D方法的 draw(Shape) Rectangle2D,它会绘制一个多边形nPoints(本例中为3),取xPoints X坐标的每个数组元素的坐标和yPoints坐标Y的坐标Shape将是drawPolygon(xPoints, yPoints, nPoints)
    • 的一个实例

    现在,把所有这些放在一起,我们应该将所有代码放在我们的JPanel被覆盖的draw(Shape)方法中,如教程所示(参见第1点)。它应该是这样的:

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g); //ALWAYS call this method first!
        g.drawRect(10, 10, 50, 50); //Draws square
        g.drawRect(10, 75, 100, 50); //Draws rectangle
        g.drawPolygon(new int[] {35, 10, 60}, new int[] {150, 200, 200}, 3); //Draws triangle
    }
    

    但我们还需要覆盖JPanel上的另一个方法Polygon,(参见:paintComponent()普遍共识是肯定的),否则我们的JFrame将小于我们想要什么,所以看起来应该是这样的:

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

    请勿忘记在这些方法中致电@Override

    只有那些方法,我们已经完成了我们的程序来绘制形状,但我知道如果我不发布整个代码,你最终会在一个赢得&#39的地方写上面的方法。 ; t工作或导致编译错误,所以产生以下输出的整个代码(实际上是MCVE或SSCCE(参见本答案中的第一段,看看每个意思)):

    getPreferredSize()

    import java.awt.Dimension;
    import java.awt.Graphics;
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    
    public class ShapesDrawing {
    
        private JFrame frame;
        private JPanel pane;
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    new ShapesDrawing().createAndShowGui();
                }
            });
        }
    
        public void createAndShowGui() {
            frame = new JFrame(getClass().getSimpleName());
            pane = new JPanel() {
                @Override
                protected void paintComponent(Graphics g) {
                    super.paintComponent(g); //ALWAYS call this method first!
                    g.drawRect(10, 10, 50, 50); //Draws square
                    g.drawRect(10, 75, 100, 50); //Draws rectangle
                    g.drawPolygon(new int[] {35, 10, 60}, new int[] {150, 200, 200}, 3); //Draws triangle
                    g.dispose();
                }
    
                @Override
                public Dimension getPreferredSize() {
                    return new Dimension(300, 300);
                }
            };
    
            frame.add(pane);
            frame.pack();
            frame.setVisible(true);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
    }
    

    我真的希望你阅读我在这里发布的所有链接,因为它值得它

    如果您需要填写形状,请拨打fillRectfillPolygon,而不是drawRectdrawPolygon

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g); //ALWAYS call this method first!
        g.drawRect(10, 10, 50, 50); //Draws square
        g.fillRect(150, 10, 50, 50); //Fills a square
        g.drawRect(10, 75, 100, 50); //Draws rectangle
        g.fillRect(150, 70, 100, 50); //Fills a square
        g.drawPolygon(new int[] {35, 10, 60}, new int[] {150, 200, 200}, 3); //Draws triangle
        g.fillPolygon(new int[] {185, 150, 215}, new int[] {150, 200, 200}, 3); //Fills triangle
        g.dispose();
    }
    

    Should I avoid the use of setPreferred|Maximum|MinimumSize in Swing?

    修改

    根据@MadProgrammer的评论:

      

    我们是否可以避免使用draw/fillPolygon来支持使用更新的Shapes API ...提供更多功能并且通常更易于使用:P

    以下是使用Shapes API更新的paintComponent方法:

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g); //ALWAYS call this method first!
    
        Graphics2D g2d = (Graphics2D) g;
        g2d.draw(new Rectangle2D.Double(10, 10, 50, 50));
        g2d.fill(new Rectangle2D.Double(150, 10, 50, 50));
    
        g2d.draw(new Rectangle2D.Double(10, 75, 100, 50));
        g2d.fill(new Rectangle2D.Double(150, 75, 100, 50));
    
        g2d.draw(new Polygon(new int[] {35, 10, 60}, new int[] {150, 200, 200}, 3));
        g2d.fill(new Polygon(new int[] {185, 150, 215}, new int[] {150, 200, 200}, 3));
    
        g2d.dispose();
        g.dispose();
    }
    

    产生以下输出:

    enter image description here