Живопись 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
, на котором вы размещаете свои собственные компоненты.
Лучшее решение в вашем случае, вероятно, использовать ваш 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
кроме проблем с пользовательской окраской, вы не добавляете какие-либо функциональные возможности в класс и блокируете себя в одном случае использования (было бы трудно повторно использовать класс снова)