Josef Shahho
Josef Shahho

Reputation: 1

Java Graphics issue

When I try to use the drawLine() function to make "Tracks" for my TrainSimGUI project, the size becomes unprecitable and changes. Its better if you look at the images and checking the comments in the files.

The issue that Im facing

The outcome of this is what I want

I have tried almost everything that I can think of for hours. The I have copied the relvent code of this project, please write if you need more. Made a quick UML-Diagram so you understand the code below:

SimGUI - - > PaintGUI - - > Station & Track

SimGUI:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class SimGUI extends JFrame implements ActionListener {

    PaintGUI GUI = new PaintGUI();
    JPanel inputPanel = new JPanel();
    String[] stationAmounts = { "2", "3", "4", "5" };
    JComboBox<String> stationAmountComboBox = new JComboBox<>(stationAmounts);
    JButton confirmButton = new JButton("Confirm");

    SimGUI() {
        Font mainFont = new Font("SansSerif", Font.BOLD, 30);

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setResizable(false);
        this.setLayout(new BorderLayout());

        stationAmountComboBox.setFont(mainFont);
        confirmButton.setFont(mainFont);
        confirmButton.addActionListener(this);

        inputPanel.setLayout(new GridLayout(1, 2));
        inputPanel.add(stationAmountComboBox);
        inputPanel.add(confirmButton);

        this.add(GUI, BorderLayout.CENTER);
        this.add(inputPanel, BorderLayout.SOUTH);

        this.pack();
        this.setLocationRelativeTo(null);
        this.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == confirmButton) {
            int selectedStations = Integer.parseInt((String) stationAmountComboBox.getSelectedItem());

            GUI.updateState(selectedStations);
        }
    }
}

PaintGUI:

import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
import java.util.List;

public class PaintGUI extends JPanel {

    int windowX = 850;
    int windowY = 850;

    int tracksPerStation = 2;

    int roundaboutAmount = 2;
    int stationAmount = roundaboutAmount;

    int mainroundaboutSize = 75;
    int roundaboutSize = 75;
    int stationSize = 50;

    int roundaboutAngleInterval = 360 / roundaboutAmount;
    int stationAngleInterval = 360 / stationAmount;

    int constructionCircle = 265;
    int subConstructionCircle = 125;

    List<Station> stations = new ArrayList<>();
    List<Track> tracks = new ArrayList<>();
    String[] stationNames = {
            "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
            "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y"
    };

    PaintGUI() {
        this.setPreferredSize(new Dimension(windowX, windowY));
    }

    public void updateState(int _roundaboutAmount) {
        this.roundaboutAmount = _roundaboutAmount;
        this.stationAmount = _roundaboutAmount;
        roundaboutAngleInterval = 360 / _roundaboutAmount;
        stationAngleInterval = 360 / _roundaboutAmount;

        stations.clear();
        tracks.clear();

        repaint();
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        this.setBackground(Color.GRAY);

        System.out.println(tracks.size());

        stations.clear();
        tracks.clear();

        Graphics2D g2D = (Graphics2D) g;
        setCenteredCoordinate(g2D);

        g2D.setStroke(new BasicStroke(7));
        g2D.setPaint(Color.WHITE);

        int letterIretor = 0;

        for (int i = 0; i < roundaboutAmount; i++) {
            double radians = Math.toRadians(roundaboutAngleInterval * i);
            int x = (int) (constructionCircle * Math.cos(radians));
            int y = (int) (constructionCircle * Math.sin(radians));

            // g2D.drawOval(x - roundaboutSize / 2, y - roundaboutSize / 2,
            // roundaboutSize,roundaboutSize);

            for (int j = 0; j < tracksPerStation; j++) {
                tracks.add(new Track(0, 0, x, y));
            }

            for (Track t : tracks) {
                t.draw(g2D);
            }

            Graphics2D g2Dsub = (Graphics2D) g2D.create();
            g2Dsub.translate(x, y);

            if (roundaboutAmount % 2 == 0) {
                g2Dsub.rotate(Math.toRadians(stationAngleInterval / 2));
            }

            for (int j = 0; j < stationAmount; j++) {
                double subRadians = Math.toRadians(stationAngleInterval * j);
                int xSub = (int) (subConstructionCircle * Math.cos(subRadians));
                int ySub = (int) (subConstructionCircle * Math.sin(subRadians));

                // I expect the out come of this line:
                g2Dsub.drawLine(0, 0, xSub, ySub);

                // But using these lines instead
                tracks.add(new Track(0, 0, xSub, ySub));
                for (Track t : tracks) {
                    t.draw(g2Dsub);
                }

                stations.add(new Station(xSub, ySub, stationSize, stationNames[letterIretor]));
                letterIretor++;

                for (Station s : stations) {
                    s.draw(g2Dsub);
                }

            }
            g2Dsub.dispose();
        }

        System.out.println(tracks.size());

    }

    private void setCenteredCoordinate(Graphics2D g2D) {
        int width = getWidth();
        int height = getHeight();
        g2D.translate(width / 2, height / 2);
        g2D.scale(1, 1);
    }
}

Station:

import java.awt.*;
import javax.swing.*;

public class Station extends JComponent {

    int x;
    int y;
    int size;
    String stationName;

    Station(int _x, int _y, int _size, String _stationName) {
        this.x = _x;
        this.y = _y;
        this.size = _size;
        this.stationName = _stationName;
    }

    public void draw(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2D = (Graphics2D) g;

        g2D.setStroke(new BasicStroke(7));
        g2D.setPaint(Color.WHITE);

        g2D.drawOval(x - size / 2, y - size / 2,
                size, size);
        g2D.fillOval(x - size / 2, y - size / 2,
                size, size);

        g2D.setFont(new Font("Arial", Font.BOLD, 20));
        g2D.setPaint(Color.BLACK);

        // Draw the station name at the center of the station
        FontMetrics fm = g2D.getFontMetrics();
        int textWidth = fm.stringWidth(stationName);
        int textHeight = fm.getAscent();
        g2D.drawString(stationName, x - textWidth / 2, y + textHeight / 4);

        g2D.setPaint(Color.WHITE);
    }
}

Track:

import javax.swing.*;
import java.awt.*;

public class Track extends JComponent {

    int startX;
    int startY;
    int endX;
    int endY;
    boolean isEmpty = true;

    Track(int _startX, int _startY, int _endX, int _endY) {
        this.startX = _startX;
        this.startY = _startY;
        this.endX = _endX;
        this.endY = _endY;
    }

    public void draw(Graphics g) {
        Graphics2D g2D = (Graphics2D) g;

        g2D.setStroke(new BasicStroke(7));
        g2D.setPaint(Color.WHITE);
        g2D.drawLine(startX, startY, endX, endY);

    }
}

Upvotes: -5

Views: 91

Answers (0)

Related Questions