【问题标题】:Drawing a scatterplot in Java在 Java 中绘制散点图
【发布时间】:2014-05-17 18:03:58
【问题描述】:

我遇到了这段代码,我一直在玩它,但是我试图绘制的点似乎在不正确的地方。我希望能够像图表一样绘制,所以原点 (0,0) 应该在左下角,并且点应该相对于它绘制,可以帮助我吗?

package graphtest;
import javax.swing.*;
import java.awt.geom.*;
import java.awt.Graphics;
import java.util.*;

public class Scatterplot extends javax.swing.JFrame {
    private List points = new ArrayList();

    public Scatterplot() {
        super("Scatterplot");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        points.add(new Point2D.Float(1, 4));
        points.add(new Point2D.Float(2, 10));
        points.add(new Point2D.Float(3, 12));
        //points.add(new Point2D.Float(3, 10));
       // points.add(new Point2D.Float(4, 12));

        JPanel panel = new JPanel() {  
            public void paintComponent(Graphics g) {
                //g.translate(0, 0);
                for(Iterator i=points.iterator(); i.hasNext(); ) {
                    Point2D.Float pt = (Point2D.Float)i.next();
                    g.drawString(".", (int)pt.x, (int)pt.y);
                }

            }
        };

        setContentPane(panel);
        setBounds(10, 10, 200, 200);

        setVisible(true);       
    }
    public static void main(String[] args) {
        new Scatterplot();
    }
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 400, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 300, Short.MAX_VALUE)
        );

        pack();
    }// </editor-fold>                        

    // Variables declaration - do not modify                     
    // End of variables declaration                   
}

【问题讨论】:

  • 在进行任何绘图之前,请确保您致电super.paintComponent。坐标将相对于它们被绘制的组件,而不是框架......

标签: java graphics


【解决方案1】:

您遇到的最大问题(除了不明白代码试图做什么)是......

  1. 在进行任何自定义绘画之前,不要先调用 super.paintComponent
  2. 使用drawString...

使用drawString 绘制. 字符意味着该点将出现在您指定的y 位置下方,因为该字符必须考虑构成字体的所有字符的总高度.字体也在上升线附近呈现,这也可以将y 位置关闭。

相反,您应该更好地利用Graphics2D API 并实际绘制点,例如...

这个例子基本上使用Ellipse2D 来绘制点,我已经将它设置为在指定的 x/y 坐标处绘制点的中心。

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Point2D;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Scatterplot extends javax.swing.JFrame {

    private List points = new ArrayList();

    public Scatterplot() {
        super("Scatterplot");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        points.add(new Point2D.Float(1, 4));
        points.add(new Point2D.Float(2, 10));
        points.add(new Point2D.Float(3, 12));
        //points.add(new Point2D.Float(3, 10));
        // points.add(new Point2D.Float(4, 12));

        JPanel panel = new JPanel() {
            @Override
            public void paintComponent(Graphics g) {
                //g.translate(0, 0);
                super.paintComponent(g);
                Graphics2D g2d = (Graphics2D) g.create();
//                g.setColor(Color.RED);
//                g.drawRect(0, 0, getWidth() - 1, getHeight() - 1);
                g.setColor(Color.BLACK);
                for (Iterator i = points.iterator(); i.hasNext();) {
                    Point2D.Float pt = (Point2D.Float) i.next();
                    Ellipse2D dot = new Ellipse2D.Float(pt.x - 1, pt.y - 1, 2, 2);
                    g2d.fill(dot);
                }
                g2d.dispose();
            }
        };

        setContentPane(panel);
        setBounds(10, 10, 200, 200);

        setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                new Scatterplot();
            }
        });
    }
}

查看2D Graphics了解更多详情

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-03
    • 2017-04-29
    • 2016-03-19
    • 2023-03-15
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 2022-07-28
    相关资源
    最近更新 更多