Рисование графики (g) в jpanel

Я пытаюсь нарисовать несколько баров со случайными интергерами в java-апплете ниже, но в переопределениях есть ошибка, я не знаком с java. Я попытался выделить две области в коде, метод рисования находится в самом низу, другая - это вторая область панели. я стремлюсь к

https://stackru.com/images/d576d004586386fa3b7a1459a9008dfe8440f1e5.jpg

размеры х, у не координаты

-общий размер = 200 250

-расположение gui = 200,50

-изображение = 140,150

-precip = 100,20

-temp = 20,100

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import javax.swing.*;
import java.util.*;

public class Final2 extends JFrame
{
    //Panels
    JPanel locationGui = new JPanel ();
    JPanel temp = new JPanel ();
    JPanel percip = new JPanel ();
    JPanel image = new JPanel ();
    //Location gui components
    JButton Enter, Exit;
    JTextField location;
    JLabel city;
    JRadioButton time;
    JComboBox Seasons;
    //bar # genertor
    Random rand = new Random ();
    int P = rand.nextInt (100) + 1; //Random Precipitation
    int H = rand.nextInt (50) + 1; //Random Heat
    public Final2 ()
    {
        init ();

    }


    public void init ()
    {
        Font font = new Font ("impact", Font.PLAIN, 20);
        //________________________________________________new panel____________________
        locationGui.setBackground (Color.RED);
        JLabel guiLabel = new JLabel ("");
        guiLabel.setFont (font);

        Enter = new JButton ("Enter");
        Exit = new JButton ("exit");



        city = new JLabel ("What city?");
        location = new JTextField (20); //location entry field


        Seasons = new JComboBox ();
        Seasons.addItem ("Summer");
        Seasons.addItem ("Fall");
        Seasons.addItem ("Winter");
        Seasons.addItem ("Spring");


        time = new JRadioButton ("check if night?");


        locationGui.add (city);
        locationGui.add (location);
        locationGui.add (Seasons);
        locationGui.add (time);



        locationGui.add (guiLabel);


        //________________________________________________new panel____________________
        temp.setBackground (Color.BLUE);
        temp.setLayout (new GridBagLayout ());
        JLabel tempLabel = new JLabel ("Temp");
        tempLabel.setFont (font);
        temp.add (tempLabel);

        //________________________________________________new panel____________________
        percip.setBackground (Color.GREEN);
        JLabel pLabel = new DrawingPanel (); //where it should be

        percip.add (pLabel);

        //________________________________________________new panel____________________
        image.setBackground (Color.ORANGE);
        image.setLayout (new GridBagLayout ());
        JLabel imageLabel = new JLabel ("Image");
        imageLabel.setFont (font);
        image.add (imageLabel);

        Container contentPane = getContentPane ();

        contentPane.setLayout (new BorderLayout ());
        contentPane.add (locationGui, BorderLayout.NORTH);
        contentPane.add (temp, BorderLayout.EAST);
        contentPane.add (percip, BorderLayout.SOUTH);
        contentPane.add (image, BorderLayout.CENTER);

        setContentPane (contentPane);
        setDefaultCloseOperation (EXIT_ON_CLOSE);
        setSize (400, 400);
        setLocationRelativeTo (null);
        setVisible (true);
    }


    public static void main (String[] args)
    {
        SwingUtilities.invokeLater (new Runnable ()

        {


            public void run ()
            {
                new Final2 ();
            }
        }


        );
    }


    private class DrawingPanel extends javax.swing.JPanel {//area i have issues with atm
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        drawPercip(g);
    }
    @Override 
    public Dimension getPreferredSize() {
        return new Dimension(200, 400);
    }



    }


    public void drawPercip (Graphics g)
    {
        //Precipitation Bar
        g.setColor (Color.black);
        g.drawRect (40, 170, 100, 20); //outline of bar
        g.setColor (Color.blue);
        g.fillRect (40 + 1, 170 + 4, P, 14); //indicator bar (+4 puts space beetween outline bar)
    }


    public void drawTemp (Graphics g)
    {
        //Temparature Bar
        g.setColor (Color.red);
        g.fillRect (170 + 4, 50, 14, 100); //Covers in
        g.setColor (Color.black);
        g.drawRect (170, 50, 20, 100); //outline of bar
        g.setColor (Color.white);
        g.fillRect (170 + 4, 50 + 1, 16, 100 - H); //indicator bar (+4 puts space beetween outline bar)
    }




}

Мои текущие ошибки (4) происходят в этом блоке кода на @override. Единственное сообщение, которое предоставляется, это "незаконный токен" и "неожиданные символы игнорируются". idk, почему он не дает больше информации

 private class DrawingPanel extends javax.swing.JPanel {//area i have issues with atm
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        drawPercip(g);
    }
    @Override 
    public Dimension getPreferredSize() {
        return new Dimension(200, 400);
    }

1 ответ

Сначала я не видел апплет,

Во-вторых, DrawingPanel это не JLabel

JLabel pLabel = new DrawingPanel(); //where it should be

Изменить pLable введите в JComponent или же JPanel или же DrawingPanel в зависимости от того, что вы хотите иметь доступ из каждого класса.

В-третьих, вы не должны полагаться на магические числа

public void drawPercip(Graphics g) {
    //Precipitation Bar
    g.setColor(Color.black);
    g.drawRect(40, 170, 100, 20); //outline of bar
    g.setColor(Color.blue);
    g.fillRect(40 + 1, 170 + 4, P, 14); //indicator bar (+4 puts space beetween outline bar)
}

public void drawTemp(Graphics g) {
    //Temparature Bar
    g.setColor(Color.red);
    g.fillRect(170 + 4, 50, 14, 100); //Covers in
    g.setColor(Color.black);
    g.drawRect(170, 50, 20, 100); //outline of bar
    g.setColor(Color.white);
    g.fillRect(170 + 4, 50 + 1, 16, 100 - H); //indicator bar (+4 puts space beetween outline bar)
}

Нет никаких гарантий, что высота и ширина панели соответствуют вашим ожиданиям. Использовать getWidth а также getHeight методы

В-четвертых, если вы хотите иметь больше DrawingPanel, ты должен сделать

int P = rand.nextInt(100) + 1; //Random Precipitation
int H = rand.nextInt(50) + 1; //Random Heat

Часть DrawingPanel,

Вы также должны уделить время прочтению Условных кодов для языка программирования Java.

Другие вопросы по тегам