Java Swing-在循环绘制的组件之间绘制线

Java Swing-在循环绘制的组件之间绘制线,java,swing,arraylist,graphics,Java,Swing,Arraylist,Graphics,我正在做一项作业,我几乎完成了,但是,有一个项目符号告诉我在相邻的组件之间画一条线,以近似它们之间的距离。我到处寻找答案,但没有一个奏效。 这是代码,我删掉了不重要的东西,提前谢谢 //IMPORTS public class AssignLIRRBranches implements Runnable { static final String title = "LIRR Map"; static final String RK = "Ronkonkom

我正在做一项作业,我几乎完成了,但是,有一个项目符号告诉我在相邻的组件之间画一条线,以近似它们之间的距离。我到处寻找答案,但没有一个奏效。 这是代码,我删掉了不重要的东西,提前谢谢

//IMPORTS
    public class AssignLIRRBranches implements Runnable
    {
      static final String title = "LIRR Map";
      static final String RK = "Ronkonkoma";
      static final String MONTAUK = "Montauk";
      static final String PJ = "Port_Jefferson";
      static int width = 1200;
      static int height = 600;
      static int mapwidth = width-100;
      static int mapheight = height-50;
      double scalingFactorx;
      double scalingFactory;
      double scalingFactor;
      double drawingX; 
      double drawingY; 
      double drawingY2;
      MapPanel mapPanel = new MapPanel(new Font("Arial", Font.ITALIC, 12), false, Color.black, "kek", 12, 12, 12, 12);
      JFrame application;
      BoxLayout boxLayout;
      Station station;
      List<Station> stations = new ArrayList<Station>();
      String[] larray;
      JComboBox jbc;
    public void run()
    {
      /* build the GUI */
        application = new JFrame();
        jbc = new JComboBox();
        jbc.addItem(RK);
        jbc.addItem(MONTAUK);
        jbc.addItem(PJ);
        boxLayout = new BoxLayout(application.getContentPane(), BoxLayout.Y_AXIS);
        jbc.setMaximumSize(new Dimension(150, 15));
        application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        application.setTitle(title);
        application.setSize(width, height);
        application.setLayout(boxLayout);
        mapPanel.setPreferredSize(new Dimension(mapwidth, mapheight));
        application.add(mapPanel);
        application.add(jbc);
        application.setMinimumSize(application.getSize());
        application.pack();
        application.setMinimumSize(null);
        application.setVisible(true);




    }
      void readStations(String path) throws FileNotFoundException, IOException {

      /* read all stations */
        try{ BufferedReader br = new BufferedReader(new FileReader(path));
         String l;
         while((l = br.readLine()) != null) {
            larray = l.split(" ");
            if(larray[2].equals(RK) || larray[2].equals(MONTAUK) || larray[2].equals(PJ)) {
            /* construct and save Station instances */            
            station = new Station(Integer.parseInt(larray[0]), larray[1], larray[2], Double.parseDouble(larray[4]), Double.parseDouble(larray[5]));
            stations.add(station);
            }


         }
        } catch(NumberFormatException exc) {
            System.out.println(exc);
       }



      }
      public static void main(String[] args) throws FileNotFoundException, IOException {
        String path = "lirr_sta_alpha.txt";
        AssignLIRRBranches ars = new AssignLIRRBranches();
        ars.readStations(path);
        SwingUtilities.invokeLater(ars);
      }
      class Station {
        int id = 0;
        String NAME = " ";
        String BRANCH = " ";
        double latitude;
        double longitude;
        Station(int id, String NAME, String BRANCH, double longitude, double latitude) {
          this.longitude = longitude;
          this.latitude = latitude;
          this.NAME = NAME;
          this.BRANCH = BRANCH;
          this.id = id;
        }
       //GETTERS AND SETTERS

      }
      class MapPanel extends JPanel implements ComponentListener {
        Font mapFont;
        boolean resized = false;
        Color mapColor = Color.black;
        String currentBranch;
        double minLong, minLat, maxLong, maxLat;
        MapPanel(Font mapFont, boolean resized, Color mapColor, String currentBranch, double minLong, double minLat, double maxLong, double maxLat) {
          /* construct the MapPanel */
          this.mapFont = mapFont;
          this.resized = resized;
          this.mapColor = mapColor;
          this.currentBranch = currentBranch;
          this.minLong = minLong;
          this.minLat = minLat;
          this.maxLong = maxLong;
          this.maxLat = maxLat;

        }
     void extents() {
     minLong = Double.MAX_VALUE;
     minLat = Double.MAX_VALUE;
     maxLong = -Double.MIN_VALUE;
     maxLat = -Double.MIN_VALUE;

    for(Station station : stations){
     /* calculate minimum and maximum longitude and latitude for staions of the current branch */
      if(station.getBranch().equals(jbc.getSelectedItem())) {
        if(station.getLatitude()>maxLat){
            maxLat = station.getLatitude();
            maxLong = station.getLongitude();
        }
        if(station.getLatitude()<minLat){
            minLat = station.getLatitude();
            minLong = station.getLongitude();
        }

    }
    }

    }
        public void paint(Graphics gr) {
          Graphics2D g2 = (Graphics2D)gr;
          if (null == mapFont) {
          }
            /* get the desired font and calulate margin values */
          else
            /* set the current font */
          if (resized) {
            /* rescale, taking into account margins */
          }

          /* set the color */
          gr.setColor(mapColor);
          /* iterate through the stations */
                for (int i = 0; i < stations.size(); i++) {
                    if(stations.get(i).getBranch().equals(jbc.getSelectedItem())) {
                        //System.out.println(jbc.getSelectedItem());
               /* calculate the corrdinates and draw the station name */

        extents();
        scalingFactorx = mapwidth/(maxLat - minLat);
        scalingFactory = mapheight/(maxLong - minLong);
        scalingFactor = Math.min(scalingFactorx, scalingFactory);

        drawingX = (stations.get(i).getLatitude() - minLat)   * scalingFactorx/1.1;
        drawingY = (stations.get(i).getLongitude() - minLong)  * scalingFactory/1.1;
        drawingY2 = mapheight - drawingY;
        gr.drawString(stations.get(i).getName(), (int)drawingX, (int)drawingY2-25);
//THIS IS WHERE I WANT TO DRAW A LINE
//gr.drawLine(I already tried using a ListIterator, it didn't work, tried getting the next element and it's values, didn't work, what can I do?);



          }
       }

       mapPanel.addComponentListener(new ComponentAdapter() {
        public void componentResized(ComponentEvent e) {
            mapwidth = application.getWidth()-150;
            mapheight = application.getHeight()-75;
            application.repaint();
        }

       });

        jbc.addActionListener (new ActionListener () {
        public void actionPerformed(ActionEvent e) {
        application.repaint();
        }
    }); 
        }




      }
    }
//导入
公共类AssignLirrBranchs实现Runnable
{
静态最终字符串title=“LIRR映射”;
静态最终字符串RK=“Ronkonkoma”;
静态最终字符串MONTAUK=“MONTAUK”;
静态最终字符串PJ=“Port_Jefferson”;
静态整数宽度=1200;
静态内部高度=600;
静态int mapwidth=width-100;
静态int MAPHEIGH=高度-50;
双比例因子;
双规模工厂;
双比例因子;
双牵引;
双牵引;
双抽2;
MapPanel MapPanel=新的MapPanel(新字体(“Arial”,Font.ITALIC,12),false,Color.black,“kek”,12,12,12,12);
JFrame应用程序;
盒子布局盒子布局;
车站;
列表站=新的ArrayList();
字符串[]larray;
jComboxJBC;
公开募捐
{
/*构建GUI*/
application=newjframe();
jbc=newjcombobox();
jbc.addItem(RK);
jbc.addItem(蒙托克);
jbc.附加条款(PJ);
boxLayout=新的boxLayout(application.getContentPane(),boxLayout.Y_轴);
jbc.setMaximumSize(新尺寸(150,15));
application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
应用程序。设置标题(标题);
应用。设置尺寸(宽度、高度);
应用程序.setLayout(boxLayout);
setPreferredSize(新维度(mapwidth、mapheight));
application.add(地图面板);
应用程序.add(jbc);
application.setMinimumSize(application.getSize());
application.pack();
application.setMinimumSize(null);
application.setVisible(true);
}
无效读站(字符串路径)引发FileNotFoundException、IOException{
/*读取所有电台*/
尝试{BufferedReader br=new BufferedReader(new FileReader(path));
字符串l;
而((l=br.readLine())!=null){
拉雷=l.分裂(“”);
如果(larray[2]。等于(RK)| larray[2]。等于(MONTAUK)| larray[2]。等于(PJ)){
/*构造并保存桩号实例*/
station=new station(Integer.parseInt(larray[0])、larray[1]、larray[2]、Double.parseDouble(larray[4])、Double.parseDouble(larray[5]);
车站。添加(车站);
}
}
}捕获(NumberFormatException){
系统输出打印项次(exc);
}
}
公共静态void main(字符串[]args)抛出FileNotFoundException、IOException{
String path=“lirr_sta_alpha.txt”;
AssignLirrBranchs=新的AssignLirrBranchs();
自动导航站(路径);
调用器(ars);
}
班级站{
int id=0;
字符串名称=”;
字符串分支=”;
双纬度;
双经度;
站点(int id、字符串名称、字符串分支、双经度、双纬度){
这个经度=经度;
这个。纬度=纬度;
this.NAME=名称;
this.BRANCH=分支;
this.id=id;
}
//接球手和接球手
}
类MapPanel扩展JPanel实现ComponentListener{
字体映射字体;
布尔重定大小=假;
颜色映射颜色=Color.black;
串电流支路;
双minLong、minLat、maxLong、maxLat;
MapPanel(字体mapFont、布尔大小、颜色mapColor、字符串currentBranch、双minLong、双minLat、双maxLong、双maxLat){
/*构建地图面板*/
this.mapFont=mapFont;
this.resized=已调整大小;
this.mapColor=mapColor;
this.currentBranch=currentBranch;
this.minLong=minLong;
this.minLat=minLat;
this.maxLong=maxLong;
this.maxLat=maxLat;
}
无效范围(){
minLong=Double.MAX_值;
minLat=双最大值;
maxLong=-Double.MIN_值;
maxLat=-Double.MIN_值;
用于(车站:车站){
/*计算当前分支楼梯的最小和最大经度和纬度*/
if(station.getBranch().equals(jbc.getSelectedItem())){
if(station.getLatitude()>maxLat){
maxLat=station.getLatitude();
maxLong=station.getLongitude();
}

if(station.getLatitude()“Swing程序应该重写
paintComponent()
而不是重写
paint()
”)。可能的重复。是的,我知道在Swing中,我应该重写paintComponent(),但我得到了一个模板,我必须用paint()方法编写代码。