Обратите внимание, что этот ответ не отвечает на ваш прямой вопрос о том, почему ваш опубликованный код не работает, потому что, хотя у вашего кода есть проблемы, он все равно должен отображать квадрат.Но, сказав это, этот пост призван предложить несколько советов по «лучшим» практикам:
- Избегайте магических значений и магических чисел
- Используйте
@Override
аннотации для любого метода, который вы думаю, является переопределением - Метод paintComponent защищен, а не общедоступен
- Вызовите метод super в вашем переопределении
- Лучше переопределить getPreferredSize из JPanelесли вам нужно исправить его размер
- Запустите графический интерфейс Swing в потоке событий Swing для обеспечения безопасности потоков
- Избегайте жесткого кодирования позиций графического чертежа, особенно если вы думаете о его анимациипозже
Это лучшее представление вашего кода:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.*;
public class Test2 extends JPanel {
private static final int PREF_W = 500;
private static final int PREF_H = PREF_W;
private static final Color RECT_COLOR = Color.ORANGE;
private static final int RECT_WIDTH = 100;
private static final int INIT_X = 20;
private static final int INIT_Y = 50;
private int rectX = INIT_X;
private int rectY = INIT_Y;
public Test2() {
// TODO any initialization code goes here
}
// override annotation
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
// avoid magic values and numbers
g.setColor(RECT_COLOR);
g.fillRect(rectX, rectY, RECT_WIDTH, RECT_WIDTH);
}
// best way to set size safely
@Override
public Dimension getPreferredSize() {
if (isPreferredSizeSet()) {
return super.getPreferredSize();
}
return new Dimension(PREF_W, PREF_H);
}
private static void createAndShowGui() {
Test2 mainPanel = new Test2();
JFrame frame = new JFrame("Test2");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
// be sure to start the GUI on the event thread
SwingUtilities.invokeLater(() -> createAndShowGui());
}
}