Java JFrame не рисует линии в окне - PullRequest
0 голосов
/ 20 мая 2018
package Main;

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;

public class Main extends JFrame{

    public static void main(String[] args) {

        int width = 800;
        int height = 600;
        String title = "Test";

        JFrame display = new JFrame();
        display.setTitle(title);
        display.setSize(width, height);
        display.setVisible(true);
        display.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public void paint(Graphics g) {

        g.setColor(Color.white);
        g.drawLine(0, 100, 800, 300);

        getContentPane().setBackground(Color.black);
    }

}

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

Когда я устанавливаю цвет фона в основной части, он работает, немного окрашен, кажется, ничего не делает и оставляет его пустым.

Это белая линия на черном фонефон, так что я легко смогу увидеть его.

Ответы [ 2 ]

0 голосов
/ 20 мая 2018

Вы создаете экземпляр JFrame с

JFrame display = new JFrame();

Но у класса JFrame нет логики рисовать белую линию на черном фоне.Эта логика в вашем пользовательском классе Main.Таким образом, вместо этого вы должны создать экземпляр Main:

JFrame display = new Main();

Однако это изменение по-прежнему не решит проблему, потому что вы устанавливаете цвет фона «панели содержимого», но пытаетесьрисовать непосредственно на JFrame.Предпочтительным решением здесь является расширение JPanel вместо JFrame и переопределение его paintComponent() метода.Затем создайте экземпляр вашего нового класса для использования в качестве боли содержимого:

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class MainPanel extends JPanel{

    public static void main(String[] args) {

        int width = 800;
        int height = 600;
        String title = "Test";

        JFrame display = new JFrame();
        display.setTitle(title);
        display.setSize(width, height);
        display.setVisible(true);
        display.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        display.setContentPane(new MainPanel());
    }

    public MainPanel() {
        setBackground(Color.black);
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.white);
        g.drawLine(0, 100, 800, 300);
    }
}

Примечания:

  1. Я вызываю setBackground() в конструкторе, потому что он неположитесь на экземпляр Graphics, переданный paintComponent().Это также позволяет избежать затрат на вызов другой функции для каждого рендера.

  2. В paintComponent() я вызываю super.panitComponent().Это позволяет JPanel очистить область для рисования и любую другую необходимую инициализацию.

0 голосов
/ 20 мая 2018

Правда, я мало что знаю о Swing (я предпочитаю JavaFX).Однако ясно, что ваш основной класс является JFrame, поэтому вы не должны создавать новый класс внутри него.Все эти методы, которые вы вызываете на display, встроены в ваш текущий класс.По сути, в вашем JFrame вы создали новый JFrame.Тем не менее, ваш paint метод вызывался в родительском JFrame, который вы никогда не делали видимым.Это решит вашу проблему (вам может потребоваться полноэкранное окно):

import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JFrame;

public class Main extends JFrame{

    public static void main(String[] args) {
        new Main();
    }

    public Main() {
        int width = 800;
        int height = 600;
        String title = "Test";

        setTitle(title);
        setSize(width, height);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public void paint(Graphics g) {
        super.paint(g);
        g.setColor(Color.WHITE);
        g.drawLine(100, 100, 800, 300);

        getContentPane().setBackground(Color.black);
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...