【问题标题】:How to display an ArrayList using Swing?如何使用 Swing 显示 ArrayList?
【发布时间】:2020-12-19 08:51:07
【问题描述】:

我有两个包含一些数据的 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, 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 可以更接近这一点,但我认为我这样做的方式不正确。

【问题讨论】:

  • 如需更好的帮助,请edit 添加minimal reproducible exampleShort, Self Contained, Correct Example。向我们展示使用JList 的尝试(尽管我还不确定什么是最好的组件)。您是否有关于 GUI 外观的图像(或绘图)?我特别不清楚“一个路口和道路矩阵”在屏幕上会是什么样子。
  • 嗨,如果我有任何最小的可重现示例,我会分享@AndrewThompson,问题是我自己对 Jswing 不太了解,而且文档根本​​没有更新。我现在尝试做的主要事情是至少能够在框架上看到我的 ArrayList,但我现在唯一能看到的是空白框架。
  • "如果我有任何最小的可重现示例.. 我现在要做的主要事情是至少能够在框架上看到我的 ArrayList,但我现在唯一能看到的是空白框架。” 所以 .. 那。那可能是一个MRE。只需几行代码即可重现效果。我们可以看看它,也许发现问题,如果没有,我们可以编译并运行它以进一步调查。
  • @Puce 它并不是真正的重复,因为它们不是一个明确的答案,也不是那个帖子中的问题。

标签: java swing arraylist jtable jlist


【解决方案1】:

我认为创建一个图表显示示例可能会很有趣。

这是我创建的 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, 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;
        }

    }

}

【讨论】:

  • Windows? Alt+Print Screen 将对当前应用程序进行屏幕截图。仅限。
猜你喜欢
  • 2020-06-02
  • 2018-06-03
  • 2014-03-04
  • 1970-01-01
  • 2015-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多