Живопись Java не работает

Итак, у меня есть этот код:

package tictactoe;

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

public class TicTacToe extends JFrame {

public static void main(String[] args) {
    JFrame masterFrame = new JFrame("TicTacToe");
    JPanel drawingPanel = new JPanel();
    GameBoard theGame = new GameBoard();

    masterFrame.add(drawingPanel);
    masterFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    masterFrame.setSize(504, 504);
    masterFrame.setResizable(false);
    masterFrame.setLocationRelativeTo(null);
    masterFrame.setVisible(true);
} //End of Main method


@Override
public void paint (Graphics g) {
    Graphics2D g2 = (Graphics2D) g;
    //Drawing the GridLines
    g2.drawLine(168, 0, 168, 500);
    g2.drawLine(336, 0, 336, 500);
    g2.drawLine(0, 168, 500, 168);
    g2.drawLine(0, 336, 500, 336);
} //End of Paint Method
} //End of TicTacToe Class    

Я хотел бы нарисовать 4 линии на моем JFrame способом TicTacToe, но JFrame остается пустым. Почему это? Что не так с моим кодом и как мне это исправить?

1 ответ

Если бы вы на самом деле создали экземпляр TicTacToe, вместо JFrame, ваш DrawingPane вероятно, будет рисовать поверх / покрывать то, что когда-либо ваша рамка рисует через это paint метод.

// Create an instance of TicTacToe instead of JFrame...
//JFrame masterFrame = new JFrame("TicTacToe");
TicTacToe masterFrame = new TicTacToe();

Дочерний компонент может быть нарисован, не уведомляя и не требуя, чтобы его родительский контейнер был нарисован, означая, что дочерние компоненты фактически покрывают то, что было ранее нарисовано рамкой, это может привести к некоторым очень странным результатам, поскольку различные части обновляются

JFrame содержит ряд дочерних компонентов, в том числе JRootPane и contentPane, на котором вы размещаете свои собственные компоненты.

RootPane

Лучшее решение в вашем случае, вероятно, использовать ваш DrawingPane и настроить это paintComponent визуализировать сетку

См. Живопись в AWT и Свинг и Выполнение Пользовательской Живописи для получения дополнительной информации.

Например...

Крестики-нолики

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TicTacToe {

    public static void main(String[] args) {
        new TicTacToe();
    } //End of Main method

    public TicTacToe() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Tic Tac Toe");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TicTacToePane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TicTacToePane extends JPanel {

        public TicTacToePane() {
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(500, 500);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            //Drawing the GridLines
            g2d.drawLine(168, 0, 168, 500);
            g2d.drawLine(336, 0, 336, 500);
            g2d.drawLine(0, 168, 500, 168);
            g2d.drawLine(0, 336, 500, 336);
            g2d.dispose();
        }

    }

} //End of TicTacToe Class    

Как правило, рекомендуется не распространяться непосредственно с JFrameкроме проблем с пользовательской окраской, вы не добавляете какие-либо функциональные возможности в класс и блокируете себя в одном случае использования (было бы трудно повторно использовать класс снова)

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