如何使用Swing显示ArrayList?

问题描述

我有两个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 Display 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;
        }

    }

}