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()方法编写代码。