Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Java绘制散点图_Java_Graphics - Fatal编程技术网

用Java绘制散点图

用Java绘制散点图,java,graphics,Java,Graphics,我遇到了这段代码,我一直在玩它,但是我试图绘制的点似乎在错误的地方。我希望能够像图形一样绘制,所以原点(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 {

我遇到了这段代码,我一直在玩它,但是我试图绘制的点似乎在错误的地方。我希望能够像图形一样绘制,所以原点(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                   
}
包装图测试;
导入javax.swing.*;
导入java.awt.geom.*;
导入java.awt.Graphics;
导入java.util.*;
公共类散点图扩展了javax.swing.JFrame{
私有列表点=新的ArrayList();
公共散点图(){
超级(“散点图”);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
添加(新的Point2D.Float(1,4));
添加(新的Point2D.Float(2,10));
添加(新的Point2D.Float(3,12));
//添加(新的Point2D.Float(3,10));
//添加(新的Point2D.Float(4,12));
JPanel panel=newjpanel(){
公共组件(图形g){
//g、 翻译(0,0);
for(迭代器i=points.Iterator();i.hasNext();){
Point2D.Float pt=(Point2D.Float)i.next();
g、 抽绳(“.”,(int)pt.x,(int)pt.y);
}
}
};
设置内容窗格(面板);
立根(10,10,200,200);
setVisible(真);
}
公共静态void main(字符串[]args){
新散点图();
}
//                           
私有组件(){
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
javax.swing.GroupLayout=newjavax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(布局);
layout.setHorizontalGroup(
createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0,400,短。最大值)
);
layout.setVerticalGroup(
createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0,300,短。最大值)
);
包装();
}//                         
//变量声明-不修改
//变量结束声明
}

您遇到的最大问题(除了不理解代码试图做什么之外)是

  • 在进行任何自定义绘制之前,不要先调用
    super.paintComponent
  • 使用
    抽绳
  • 使用
    drawString
    绘制
    字符意味着点将显示在指定的
    y
    位置下方,因为字符必须考虑构成字体的所有字符的总高度。字体也呈现在上升线附近,这也会使
    y
    位置关闭

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

    这个示例基本上使用了一个
    椭圆E2D
    来绘制点,我已经设置好了它,这样它可以在指定的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();
                }
            });
        }
    }
    

    查看更多详细信息

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