I have this simple code: the JFrame
adds custom Jpanel
MyPanel which overrides paintComponent
method to draw the rectangle. However nothing shows up on the window:
import javax.swing.*; import java.awt.*; import javax.swing.JFrame; import javax.swing.JPanel; public class TestGui extends JFrame { public TestGui() { setLayout(new FlowLayout()); JPanel panel = new JPanel(); panel.add(new JLabel("H E L L O")); getContentPane().add(panel); getContentPane().add(new MyPanel()); setSize(100, 100); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); repaint(); revalidate(); setVisible(true); } class MyPanel extends JPanel { private int squareX = 50; private int squareY = 50; private int squareW = 20; private int squareH = 20; protected void paintComponent(Graphics g) { super.paintComponent(g); g.setColor(Color.RED); g.fillRect(squareX,squareY,squareW,squareH); } } public static void main(String[] args) { TestGui gui = new TestGui(); } }
Advertisement
Answer
By default, an empty JPanel
has a size of 0x0
, so when you add it to your UI, the layout manager (in this case) honours it’s request and makes it 0x0
Start by adding …
@Override public Dimension getPreferredSize() { return new Dimension(100, 100); }
to MyPanel
Also, the repaint
and revalidate
calls aren’t going to do anything, as the window isn’t yet attached to native peer (rendering surface)