steve_bagnall
asked on
Panel contents not showing until clicked on
Hi,
An easy one for somebody, this must be a common problem. What am I doing wrong if the contents of my JPanels within a JFrame do not show up unless you click on where they should be, or cover them up and then reveal them? Must be something to do with the OS calling paint, but I can't figure it out. Can post parts of my code if required, but it is quite large and sprawling.
Cheers, Steve
An easy one for somebody, this must be a common problem. What am I doing wrong if the contents of my JPanels within a JFrame do not show up unless you click on where they should be, or cover them up and then reveal them? Must be something to do with the OS calling paint, but I can't figure it out. Can post parts of my code if required, but it is quite large and sprawling.
Cheers, Steve
It suggests that part of your program is blocking the event dispatch thread
Or what I often use:
JPanel mainPanel = JPanel();
... // Add whatever you need to add to mainPanel
getContentPane().add(mainP anel);
mainPanel.revalidate();
mainPanel.repaint();
JPanel mainPanel = JPanel();
... // Add whatever you need to add to mainPanel
getContentPane().add(mainP
mainPanel.revalidate();
mainPanel.repaint();
>> part of your program is blocking the event dispatch thread
and de-blocking when the mouse is pressed?
and de-blocking when the mouse is pressed?
Also, as a rough rule, if you are using anything other than a JFrame, you should be overriding paintComponent, not paint
ASKER
Maybe not as simple as I though then. The SOUTH panel shows up, but the WEST and CENTER one don't. One of them displays a treeNode, and the other inherits from JPanel and uses Graphics2D to render some drawings if that helps.
ASKER
Sorry that last message coresponds to the first response only .. I will check out the others
>>and the other inherits from JPanel
Are you overriding paintComponent, not paint?
Are you overriding paintComponent, not paint?
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
zzynx,
Your mainPanel suggestion doesn't seem to solve my problem.
Some further information: Although the SOUTH JPanel is visible if you cover it up with another window, when you reveal it again is is not visible.
Also, when I said that the contents of the JPanels appeared if you covered them up and revealed them I think that must be either very intermitent, or not the case as they stay hidden when revealed now.
The only way to get them to display is to expand a node in the tree in the WEST panel, or select some text in the SOUTH panel.
I will look at the other suggestions
Your mainPanel suggestion doesn't seem to solve my problem.
Some further information: Although the SOUTH JPanel is visible if you cover it up with another window, when you reveal it again is is not visible.
Also, when I said that the contents of the JPanels appeared if you covered them up and revealed them I think that must be either very intermitent, or not the case as they stay hidden when revealed now.
The only way to get them to display is to expand a node in the tree in the WEST panel, or select some text in the SOUTH panel.
I will look at the other suggestions
ASKER
CEHJ, Yes I am overriding the paintComponent() method.
Also, please post the overridden method where you use Graphics2D
ASKER
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(Render ingHints.K EY_ANTIALI ASING, RenderingHints.VALUE_ANTIA LIAS_ON);
drawImage(g2);
} // end of constructor
{
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(Render
drawImage(g2);
} // end of constructor
ASKER
ignore reference to constructor ;)
>> protected void paintComponent(Graphics g)
should be
public void paintComponent(Graphics g)
should be
public void paintComponent(Graphics g)
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Changing to public hasn't worked .. here's the drawImage(g2) method, along with pickFont method which it calls:
protected FontMetrics pickFont(Graphics2D g2,
String longString,
int xSpace) {
boolean fontFits = false;
Font font = g2.getFont();
FontMetrics fontMetrics = g2.getFontMetrics();
int size = font.getSize();
String name = font.getName();
int style = font.getStyle();
while ( !fontFits ) {
if ( (fontMetrics.getHeight() <= maxCharHeight)
&& (fontMetrics.stringWidth(l ongString) <= xSpace) ) {
fontFits = true;
}
else {
if ( size <= minFontSize ) {
fontFits = true;
}
else {
g2.setFont(font = new Font(name,
style,
--size));
fontMetrics = g2.getFontMetrics();
}
}
}
return fontMetrics;
} // end of pickFont()
private void drawImage(Graphics2D g2) {
int gridWidth = d.width / 6;
int gridHeight = d.height / 2;
fontMetrics = pickFont(g2, "Filled and Stroked GeneralPath",
gridWidth);
Color fg3D = Color.lightGray;
g2.setPaint(fg3D);
g2.draw3DRect(0, 0, d.width - 1, d.height - 1, true);
g2.draw3DRect(3, 3, d.width - 7, d.height - 7, false);
g2.setPaint(fg);
int x = 5;
int y = 7;
int rectWidth = gridWidth - 2*x;
int stringY = gridHeight - 3 - fontMetrics.getDescent();
int rectHeight = stringY - fontMetrics.getMaxAscent() - y - 2;
// draw Line2D.Double
g2.draw(new Line2D.Double(x, y+rectHeight-1, x + rectWidth, y));
g2.drawString("Line2D", x, stringY);
x += gridWidth;
// draw Rectangle2D.Double
g2.setStroke(stroke);
g2.draw(new Rectangle2D.Double(x, y, rectWidth, rectHeight));
g2.drawString("Rectangle2D ", x, stringY);
x += gridWidth;
// draw RoundRectangle2D.Double
g2.setStroke(dashed);
g2.draw(new RoundRectangle2D.Double(x, y, rectWidth,
rectHeight, 10, 10));
g2.drawString("RoundRectan gle2D", x, stringY);
x += gridWidth;
// draw Arc2D.Double
g2.setStroke(wideStroke);
g2.draw(new Arc2D.Double(x, y, rectWidth, rectHeight, 90,
135, Arc2D.OPEN));
g2.drawString("Arc2D", x, stringY);
x += gridWidth;
// draw Ellipse2D.Double
g2.setStroke(stroke);
g2.draw(new Ellipse2D.Double(x, y, rectWidth, rectHeight));
g2.drawString("Ellipse2D", x, stringY);
x += gridWidth;
// draw GeneralPath (polygon)
int x1Points[] = {x, x+rectWidth, x, x+rectWidth};
int y1Points[] = {y, y+rectHeight, y+rectHeight, y};
GeneralPath polygon = new GeneralPath(GeneralPath.WI ND_EVEN_OD D,
x1Points.length);
polygon.moveTo(x1Points[0] , y1Points[0]);
for ( int index = 1; index < x1Points.length; index++ ) {
polygon.lineTo(x1Points[in dex], y1Points[index]);
};
polygon.closePath();
g2.draw(polygon);
g2.drawString("GeneralPath ", x, stringY);
// NEW ROW
x = 5;
y += gridHeight;
stringY += gridHeight;
// draw GeneralPath (polyline)
int x2Points[] = {x, x+rectWidth, x, x+rectWidth};
int y2Points[] = {y, y+rectHeight, y+rectHeight, y};
GeneralPath polyline = new GeneralPath(GeneralPath.WI ND_EVEN_OD D,
x2Points.length);
polyline.moveTo (x2Points[0], y2Points[0]);
for ( int index = 1; index < x2Points.length; index++ ) {
polyline.lineTo(x2Points[i ndex], y2Points[index]);
};
g2.draw(polyline);
g2.drawString("GeneralPath (open)", x, stringY);
x += gridWidth;
// fill Rectangle2D.Double (red)
g2.setPaint(red);
g2.fill(new Rectangle2D.Double(x, y, rectWidth, rectHeight));
g2.setPaint(fg);
g2.drawString("Filled Rectangle2D", x, stringY);
x += gridWidth;
// fill RoundRectangle2D.Double
GradientPaint redtowhite = new GradientPaint(x,y,red,x+re ctWidth, y,white);
g2.setPaint(redtowhite);
g2.fill(new RoundRectangle2D.Double(x, y, rectWidth,
rectHeight, 10, 10));
g2.setPaint(fg);
g2.drawString("Filled RoundRectangle2D", x, stringY);
x += gridWidth;
// fill Arc2D
g2.setPaint(red);
g2.fill(new Arc2D.Double(x, y, rectWidth, rectHeight, 90,
135, Arc2D.OPEN));
g2.setPaint(fg);
g2.drawString("Filled Arc2D", x, stringY);
x += gridWidth;
// fill Ellipse2D.Double
redtowhite = new GradientPaint(x,y,red,x+re ctWidth, y,white);
g2.setPaint(redtowhite);
g2.fill (new Ellipse2D.Double(x, y, rectWidth, rectHeight));
g2.setPaint(fg);
g2.drawString("Filled Ellipse2D", x, stringY);
x += gridWidth;
// fill and stroke GeneralPath
int x3Points[] = {x, x+rectWidth, x, x+rectWidth};
int y3Points[] = {y, y+rectHeight, y+rectHeight, y};
GeneralPath filledPolygon = new GeneralPath(GeneralPath.WI ND_EVEN_OD D,
x3Points.length);
filledPolygon.moveTo(x3Poi nts[0], y3Points[0]);
for ( int index = 1; index < x3Points.length; index++ ) {
filledPolygon.lineTo(x3Poi nts[index] , y3Points[index]);
};
filledPolygon.closePath();
g2.setPaint(red);
g2.fill(filledPolygon);
g2.setPaint(fg);
g2.draw(filledPolygon);
g2.drawString("Filled and Stroked GeneralPath", x, stringY);
} // end of drawImage
protected FontMetrics pickFont(Graphics2D g2,
String longString,
int xSpace) {
boolean fontFits = false;
Font font = g2.getFont();
FontMetrics fontMetrics = g2.getFontMetrics();
int size = font.getSize();
String name = font.getName();
int style = font.getStyle();
while ( !fontFits ) {
if ( (fontMetrics.getHeight() <= maxCharHeight)
&& (fontMetrics.stringWidth(l
fontFits = true;
}
else {
if ( size <= minFontSize ) {
fontFits = true;
}
else {
g2.setFont(font = new Font(name,
style,
--size));
fontMetrics = g2.getFontMetrics();
}
}
}
return fontMetrics;
} // end of pickFont()
private void drawImage(Graphics2D g2) {
int gridWidth = d.width / 6;
int gridHeight = d.height / 2;
fontMetrics = pickFont(g2, "Filled and Stroked GeneralPath",
gridWidth);
Color fg3D = Color.lightGray;
g2.setPaint(fg3D);
g2.draw3DRect(0, 0, d.width - 1, d.height - 1, true);
g2.draw3DRect(3, 3, d.width - 7, d.height - 7, false);
g2.setPaint(fg);
int x = 5;
int y = 7;
int rectWidth = gridWidth - 2*x;
int stringY = gridHeight - 3 - fontMetrics.getDescent();
int rectHeight = stringY - fontMetrics.getMaxAscent()
// draw Line2D.Double
g2.draw(new Line2D.Double(x, y+rectHeight-1, x + rectWidth, y));
g2.drawString("Line2D", x, stringY);
x += gridWidth;
// draw Rectangle2D.Double
g2.setStroke(stroke);
g2.draw(new Rectangle2D.Double(x, y, rectWidth, rectHeight));
g2.drawString("Rectangle2D
x += gridWidth;
// draw RoundRectangle2D.Double
g2.setStroke(dashed);
g2.draw(new RoundRectangle2D.Double(x,
rectHeight, 10, 10));
g2.drawString("RoundRectan
x += gridWidth;
// draw Arc2D.Double
g2.setStroke(wideStroke);
g2.draw(new Arc2D.Double(x, y, rectWidth, rectHeight, 90,
135, Arc2D.OPEN));
g2.drawString("Arc2D", x, stringY);
x += gridWidth;
// draw Ellipse2D.Double
g2.setStroke(stroke);
g2.draw(new Ellipse2D.Double(x, y, rectWidth, rectHeight));
g2.drawString("Ellipse2D",
x += gridWidth;
// draw GeneralPath (polygon)
int x1Points[] = {x, x+rectWidth, x, x+rectWidth};
int y1Points[] = {y, y+rectHeight, y+rectHeight, y};
GeneralPath polygon = new GeneralPath(GeneralPath.WI
x1Points.length);
polygon.moveTo(x1Points[0]
for ( int index = 1; index < x1Points.length; index++ ) {
polygon.lineTo(x1Points[in
};
polygon.closePath();
g2.draw(polygon);
g2.drawString("GeneralPath
// NEW ROW
x = 5;
y += gridHeight;
stringY += gridHeight;
// draw GeneralPath (polyline)
int x2Points[] = {x, x+rectWidth, x, x+rectWidth};
int y2Points[] = {y, y+rectHeight, y+rectHeight, y};
GeneralPath polyline = new GeneralPath(GeneralPath.WI
x2Points.length);
polyline.moveTo (x2Points[0], y2Points[0]);
for ( int index = 1; index < x2Points.length; index++ ) {
polyline.lineTo(x2Points[i
};
g2.draw(polyline);
g2.drawString("GeneralPath
x += gridWidth;
// fill Rectangle2D.Double (red)
g2.setPaint(red);
g2.fill(new Rectangle2D.Double(x, y, rectWidth, rectHeight));
g2.setPaint(fg);
g2.drawString("Filled Rectangle2D", x, stringY);
x += gridWidth;
// fill RoundRectangle2D.Double
GradientPaint redtowhite = new GradientPaint(x,y,red,x+re
g2.setPaint(redtowhite);
g2.fill(new RoundRectangle2D.Double(x,
rectHeight, 10, 10));
g2.setPaint(fg);
g2.drawString("Filled RoundRectangle2D", x, stringY);
x += gridWidth;
// fill Arc2D
g2.setPaint(red);
g2.fill(new Arc2D.Double(x, y, rectWidth, rectHeight, 90,
135, Arc2D.OPEN));
g2.setPaint(fg);
g2.drawString("Filled Arc2D", x, stringY);
x += gridWidth;
// fill Ellipse2D.Double
redtowhite = new GradientPaint(x,y,red,x+re
g2.setPaint(redtowhite);
g2.fill (new Ellipse2D.Double(x, y, rectWidth, rectHeight));
g2.setPaint(fg);
g2.drawString("Filled Ellipse2D", x, stringY);
x += gridWidth;
// fill and stroke GeneralPath
int x3Points[] = {x, x+rectWidth, x, x+rectWidth};
int y3Points[] = {y, y+rectHeight, y+rectHeight, y};
GeneralPath filledPolygon = new GeneralPath(GeneralPath.WI
x3Points.length);
filledPolygon.moveTo(x3Poi
for ( int index = 1; index < x3Points.length; index++ ) {
filledPolygon.lineTo(x3Poi
};
filledPolygon.closePath();
g2.setPaint(red);
g2.fill(filledPolygon);
g2.setPaint(fg);
g2.draw(filledPolygon);
g2.drawString("Filled and Stroked GeneralPath", x, stringY);
} // end of drawImage
>> >> protected void paintComponent(Graphics g)
>> should be
>> public void paintComponent(Graphics g)
Why is that, CEHJ?
>> should be
>> public void paintComponent(Graphics g)
Why is that, CEHJ?
ASKER
I'm glad I'm not within punching range of you 2 ... I'd overidden the paint() method in the JFrame with no implementation! Sorry :)
Why did you close this?
Have you found it?
Have you found it?
>> I'd overidden the paint() method in the JFrame with no implementation! Sorry :)
I see
It happens to the best ;°)
I see
It happens to the best ;°)
:-)
>>Why is that, CEHJ?
Ignore that - i thought that method was public. Of course if it had been, it wouldn't have compiled anyway ;-)
>>Why is that, CEHJ?
Ignore that - i thought that method was public. Of course if it had been, it wouldn't have compiled anyway ;-)
I think a
yourFrame.getContentPane()
should help