Загрузка данных


import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import java.awt.*;

public class Main {

    // Цвета интерфейса
    static final Color BLACK = new Color(5, 5, 8);
    static final Color DARK = new Color(10, 10, 15);
    static final Color PANEL = new Color(14, 14, 20);
    static final Color BORDER = new Color(35, 40, 50);
    static final Color WHITE = new Color(245, 245, 250);
    static final Color GRAY = new Color(150, 155, 165);
    static final Color BLUE = new Color(70, 150, 255);

    public static void main(String[] args) {

        SwingUtilities.invokeLater(() -> {

            JFrame frame = new JFrame("Dota 2 Stats");

            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(1400, 850);
            frame.setLocationRelativeTo(null);
            frame.getContentPane().setBackground(BLACK);

            JPanel mainPanel = new JPanel();
            mainPanel.setLayout(new BorderLayout(0, 15));
            mainPanel.setBackground(BLACK);
            mainPanel.setBorder(BorderFactory.createEmptyBorder(25, 30, 25, 30));

            // =========================
            // ЗАГОЛОВОК
            // =========================

            JLabel title = new JLabel("DOTA 2 STATS");
            title.setForeground(WHITE);
            title.setFont(new Font("Segoe UI", Font.BOLD, 32));

            JPanel titlePanel = new JPanel(new BorderLayout());
            titlePanel.setBackground(BLACK);
            titlePanel.add(title, BorderLayout.WEST);

            mainPanel.add(titlePanel, BorderLayout.NORTH);

            // =========================
            // ЦЕНТР
            // =========================

            JPanel teamsPanel = new JPanel();
            teamsPanel.setLayout(new BoxLayout(teamsPanel, BoxLayout.Y_AXIS));
            teamsPanel.setBackground(BLACK);

            teamsPanel.add(createTeamPanel(
                    "THE RADIANT",
                    new String[]{
                            "Player One",
                            "Player Two",
                            "Player Three",
                            "Player Four",
                            "Player Five"
                    },
                    new String[]{
                            "Immortal",
                            "Divine V",
                            "Ancient III",
                            "Legend II",
                            "Ancient V"
                    },
                    new String[]{
                            "W W L W W W L W",
                            "W L W W L W W L",
                            "L W W W L W L W",
                            "W W L W W L W W",
                            "W L W L W W W L"
                    },
                    new String[]{"52%", "61%", "48%", "55%", "59%"}
            ));

            teamsPanel.add(Box.createVerticalStrut(15));

            teamsPanel.add(createTeamPanel(
                    "THE DIRE",
                    new String[]{
                            "Player Six",
                            "Player Seven",
                            "Player Eight",
                            "Player Nine",
                            "Player Ten"
                    },
                    new String[]{
                            "Divine II",
                            "Legend I",
                            "Immortal",
                            "Legend III",
                            "Ancient IV"
                    },
                    new String[]{
                            "W L W W L W W L",
                            "W W L W W L W W",
                            "L W W L W W L W",
                            "W L W W W L W L",
                            "W L W W L W L W"
                    },
                    new String[]{"50%", "51%", "60%", "51%", "48%"}
            ));

            JScrollPane scrollPane = new JScrollPane(teamsPanel);
            scrollPane.setBorder(BorderFactory.createEmptyBorder());
            scrollPane.setBackground(BLACK);
            scrollPane.getViewport().setBackground(BLACK);

            mainPanel.add(scrollPane, BorderLayout.CENTER);

            frame.setContentPane(mainPanel);
            frame.setVisible(true);
        });
    }

    // =========================================================
    // СОЗДАНИЕ КОМАНДЫ
    // =========================================================

    static JPanel createTeamPanel(
            String teamName,
            String[] players,
            String[] ranks,
            String[] recentMatches,
            String[] winrates
    ) {

        JPanel panel = new JPanel(new BorderLayout());
        panel.setBackground(PANEL);
        panel.setBorder(BorderFactory.createLineBorder(BORDER, 1));
        panel.setMaximumSize(new Dimension(Integer.MAX_VALUE, 360));

        // Название команды
        JLabel teamLabel = new JLabel("  " + teamName);
        teamLabel.setForeground(WHITE);
        teamLabel.setFont(new Font("Segoe UI", Font.BOLD, 20));
        teamLabel.setBorder(
                BorderFactory.createEmptyBorder(12, 5, 12, 5)
        );

        panel.add(teamLabel, BorderLayout.NORTH);

        // Таблица
        String[] columns = {
                "#",
                "ИГРОК",
                "РАНГ",
                "ПОСЛЕДНИЕ МАТЧИ",
                "МАТЧЕЙ",
                "WINRATE"
        };

        Object[][] data = new Object[5][6];

        for (int i = 0; i < 5; i++) {

            data[i][0] = i + 1;
            data[i][1] = players[i];
            data[i][2] = ranks[i];
            data[i][3] = recentMatches[i];
            data[i][4] = 100 + i * 147;
            data[i][5] = winrates[i];
        }

        DefaultTableModel model = new DefaultTableModel(data, columns) {

            @Override
            public boolean isCellEditable(int row, int column) {
                return false;
            }
        };

        JTable table = new JTable(model);

        table.setBackground(PANEL);
        table.setForeground(WHITE);

        table.setFont(new Font("Segoe UI", Font.PLAIN, 15));
        table.setRowHeight(52);

        table.setGridColor(BORDER);
        table.setShowVerticalLines(true);
        table.setShowHorizontalLines(true);

        table.setSelectionBackground(new Color(25, 35, 50));
        table.setSelectionForeground(WHITE);

        // Заголовок таблицы
        table.getTableHeader().setBackground(DARK);
        table.getTableHeader().setForeground(GRAY);
        table.getTableHeader().setFont(
                new Font("Segoe UI", Font.BOLD, 13)
        );

        table.getTableHeader().setPreferredSize(
                new Dimension(0, 40)
        );

        // Выравнивание
        DefaultTableCellRenderer centerRenderer =
                new DefaultTableCellRenderer();

        centerRenderer.setHorizontalAlignment(
                SwingConstants.CENTER
        );

        centerRenderer.setForeground(WHITE);
        centerRenderer.setBackground(PANEL);

        for (int i = 0; i < table.getColumnCount(); i++) {
            table.getColumnModel()
                    .getColumn(i)
                    .setCellRenderer(centerRenderer);
        }

        // Игроки — слева
        DefaultTableCellRenderer leftRenderer =
                new DefaultTableCellRenderer();

        leftRenderer.setHorizontalAlignment(
                SwingConstants.LEFT
        );

        leftRenderer.setForeground(WHITE);
        leftRenderer.setBackground(PANEL);

        table.getColumnModel()
                .getColumn(1)
                .setCellRenderer(leftRenderer);

        // Ширина колонок
        table.getColumnModel().getColumn(0).setPreferredWidth(45);
        table.getColumnModel().getColumn(1).setPreferredWidth(220);
        table.getColumnModel().getColumn(2).setPreferredWidth(150);
        table.getColumnModel().getColumn(3).setPreferredWidth(330);
        table.getColumnModel().getColumn(4).setPreferredWidth(100);
        table.getColumnModel().getColumn(5).setPreferredWidth(110);

        panel.add(table, BorderLayout.CENTER);

        return panel;
    }
}