问题描述
我有两个ArrayList
实例,其中包含一些数据,我希望通过使用Swing将这些数据显示为框或它们的数据。
Map map = new Map(10);
System.out.println(map.calcShortestPath(map.getJunctions().get(4),map.getJunctions().get(0)));
System.out.println("\n Map #2");
ArrayList<Junction> junctions = new ArrayList<Junction>();
junctions.add(new Junction(0,0));
junctions.add(new Junction(0,3));
junctions.add(new Junction(4,0));
ArrayList<Road> roads = new ArrayList<Road>();
roads.add(new Road(junctions.get(0),junctions.get(1)));
roads.add(new Road(junctions.get(1),junctions.get(2)));
roads.add(new Road(junctions.get(2),junctions.get(3)));
roads.add(new Road(junctions.get(3),junctions.get(0)));
roads.add(new Road(junctions.get(0),junctions.get(2)));
map = new Map(junctions,roads);
到目前为止我尝试过的事情:
-
使用
JTable
-似乎不是正确的选择。 -
使用
JList
-似乎没有用,因为我试图查看与此相关的列表之一 代码:JList<Juncion> displayList = new JList<>(junctions.toArray(new String[0])); JScrollPane scrollPane = new JScrollPane(displayList); getContentPane().add(scrollPane); setDefaultCloSEOperation(EXIT_ON_CLOSE); pack(); setVisible(true);
我认为我可以通过使用JList
来解决这个问题,但我认为我没有以正确的方式做到这一点。
解决方法
我认为举一个图形显示示例可能很有趣。
这是我创建的GUI。
路口用正方形表示,道路用线表示。
我做的第一件事是创建一个Graph
类来容纳一个List
的交叉路口和一个List
的道路。我不得不猜测Junction
类的数字代表什么。我以为它们是X和Y坐标。
一旦创建了Graph
类(模型类),就编写了绘图面板,并且paintComponent
方法很简单。
这是代码。您需要对其进行修改以显示多个图形。
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class GraphDisplay implements Runnable {
public static void main(String[] args) {
SwingUtilities.invokeLater(new GraphDisplay());
}
private DrawingPanel drawingPanel;
private Graph graph;
private JFrame frame;
public GraphDisplay() {
this.graph = new Graph();
}
@Override
public void run() {
frame = new JFrame("Graph Display");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
drawingPanel = new DrawingPanel(graph);
frame.add(drawingPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public class DrawingPanel extends JPanel {
private static final long serialVersionUID = 1L;
private Graph graph;
private Tuple xTuple;
private Tuple yTuple;
public DrawingPanel(Graph graph) {
this.graph = graph;
this.xTuple = graph.getXRange();
this.yTuple = graph.getYRange();
this.setBackground(Color.WHITE);
this.setPreferredSize(new Dimension(400,400));
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
int xSpacing = getWidth() / (xTuple.getMaximum() -
xTuple.getMinimum() + 2);
int ySpacing = getHeight() / (yTuple.getMaximum() -
yTuple.getMinimum() + 2);
Graphics2D g2d = (Graphics2D) g;
g2d.setColor(Color.BLACK);
g2d.setStroke(new BasicStroke(5f));
Font font = getFont().deriveFont(16f);
g2d.setFont(font);
List<Junction> junctions = graph.getJunctions();
for (int i = 0; i < junctions.size(); i++) {
Junction junction = junctions.get(i);
int x = (junction.getX() + 1) * xSpacing;
int y = (junction.getY() + 1) * ySpacing;
g.drawRect(x - 16,y - 16,32,32);
}
List<Road> roads = graph.getRoads();
for (int i = 0; i < roads.size(); i++) {
Road road = roads.get(i);
Junction origin = road.getOrigin();
Junction destination = road.getDestination();
int x1 = (origin.getX() + 1) * xSpacing;
int y1 = (origin.getY() + 1) * ySpacing;
int x2 = (destination.getX() + 1) * xSpacing;
int y2 = (destination.getY() + 1) * ySpacing;
g2d.drawLine(x1,y1,x2,y2);
}
}
}
public class Graph {
private final List<Junction> junctions;
private final List<Road> roads;
public Graph() {
junctions = new ArrayList<Junction>();
junctions.add(new Junction(0,0));
junctions.add(new Junction(0,3));
junctions.add(new Junction(4,0));
roads = new ArrayList<Road>();
roads.add(new Road(junctions.get(0),junctions.get(1)));
roads.add(new Road(junctions.get(1),junctions.get(2)));
roads.add(new Road(junctions.get(2),junctions.get(3)));
roads.add(new Road(junctions.get(3),junctions.get(0)));
roads.add(new Road(junctions.get(0),junctions.get(2)));
}
public List<Junction> getJunctions() {
return junctions;
}
public List<Road> getRoads() {
return roads;
}
public Tuple getXRange() {
int minimum = junctions.get(0).getX();
int maximum = minimum;
for (int i = 1; i < junctions.size(); i++) {
int x = junctions.get(i).getX();
minimum = Math.min(minimum,x);
maximum = Math.max(maximum,x);
}
return new Tuple(minimum,maximum);
}
public Tuple getYRange() {
int minimum = junctions.get(0).getY();
int maximum = minimum;
for (int i = 1; i < junctions.size(); i++) {
int y = junctions.get(i).getY();
minimum = Math.min(minimum,y);
maximum = Math.max(maximum,y);
}
return new Tuple(minimum,maximum);
}
}
public class Road {
private final Junction origin;
private final Junction destination;
public Road(Junction origin,Junction destination) {
this.origin = origin;
this.destination = destination;
}
public Junction getOrigin() {
return origin;
}
public Junction getDestination() {
return destination;
}
}
public class Junction {
private final int x;
private final int y;
public Junction(int x,int y) {
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
}
public class Tuple {
private final int minimum;
private final int maximum;
public Tuple(int minimum,int maximum) {
this.minimum = minimum;
this.maximum = maximum;
}
public int getMinimum() {
return minimum;
}
public int getMaximum() {
return maximum;
}
}
}