Рисовать в JPanel с Java-графикой - PullRequest
0 голосов
/ 29 ноября 2018

Это мой первый Java-проект, и я пытаюсь нарисовать простой прямоугольник на моей JPanel внутри моего JFrame.Я пытался решить эту проблему с помощью тех же тем, что и над stackoverflow, но все еще безуспешно.Исключением, которое я получаю при запуске программы, является java.lang.NullPointerException.Из моего понимания я не могу опираться на саму JPanel?который создается в mainWindow.

Main:

public class Main {
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                GameBoard game = new GameBoard();
                mainWindow view = new mainWindow(game);
                mainModel model = new mainModel();
                mainController cont = new mainController(model, view, game);

                cont.controllerInit();

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}
}

Просмотр:

public class mainWindow{
public JFrame frame;
public JPanel panel;

    GameBoard game = new GameBoard();
    frame = new JFrame();
    frame.getContentPane().setBackground(SystemColor.control);
    frame.setBounds(100, 100, 728, 435);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.add(game);
    frame.getContentPane().setLayout(null);

    panel = new JPanel();                           
    FlowLayout flowLayout = (FlowLayout) panel.getLayout();
    panel.setBounds(166, 44, 550, 349); 
    frame.getContentPane().add(panel);

    frame.setVisible(true);
}

Игра:

public class GameBoard extends JPanel{

@Override
public void paintComponent(Graphics g) 
{
    super.paintComponent(g);
        g.setColor(Color.BLUE);
        g.drawRect(200, 200, 200, 200);
}

}

1 Ответ

0 голосов
/ 30 ноября 2018

Никогда, никогда не звоните paintComponent напрямую, ни у какого внешнего источника нет причин для этого.Кроме того, что бы вы сделали, если бы вы передали его null?

Начните с изучения Выполнение пользовательской живописи и Рисование в AWT и Swing чтобы лучше понять, как работает рисование в Swing.

API Swing в основном использует модель делегата, где система делегирует ответственность за рисование каждого компонента компоненту.Это достигается за счет того, что система вызывает метод paint компонентов, который, в свою очередь, вызывает (среди нескольких других) paintComponent.

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

Чтобы компонент был окрашен, его сначала нужно добавить в контейнер, который реализован на экране (имеет собственный узел), в большинстве случаев это означает, чтоиерархия компонентов должна быть преобразована в некоторый оконный класс, такой как JFrame.

Итак, ответ на ваш вопрос:

  • Прочитайте приведенную выше документацию (и получителучшее понимание того, как работает API)
  • Добавьте ваш GameBoard в контейнер, который может быть преобразован в оконный класс
  • Никогда не вызывайте paint или paintComponent напрямую

Отражение ....

private mainWindow view;
private mainModel model;
public GameBoard(mainModel m, mainWindow v)
{
    view = v;
    model = m;
}

Для меня это не имеет смысла.Нет никаких разумных причин, по которым GameBoard нужна ссылка на mainWindow.GameBoard сам по себе является «представлением».Во всяком случае, единственное, что вы «должны» передать GameBoard (при условии, что вы пытаетесь использовать MVC), это контроллер

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