Java JFrame上没有显示任何内容
这就是我正在做的,但在Jframe窗口上什么都没有显示。我并没有扩展类JFrame来完成我的工作,在窗口上显示对象是否需要这样做Java JFrame上没有显示任何内容,java,graphics,jframe,Java,Graphics,Jframe,这就是我正在做的,但在Jframe窗口上什么都没有显示。我并没有扩展类JFrame来完成我的工作,在窗口上显示对象是否需要这样做 public class testGraphics { static JFrame workingFrame = null; public static void main(String args[]) { JFrame workingManager = new JFrame("Hello"); working
public class testGraphics {
static JFrame workingFrame = null;
public static void main(String args[])
{
JFrame workingManager = new JFrame("Hello");
workingManager.setSize(500, 500);
workingManager.setVisible(true);
Graphics g = workingManager.getGraphics();
JPanel jp = (JPanel) workingManager.getContentPane();
workingManager.paintComponents(g);
g.fillOval(0, 0, 30, 30);
g.drawOval(0, 50, 30, 30);
g.setColor(Color.CYAN);
}
}
setSize()
和setVisible()
必须位于方法的底部:
JFrame workingManager = new JFrame("Hello");
Graphics g = workingManager.getGraphics();
JPanel jp = (JPanel) workingManager.getContentPane();
workingManager.paintComponents(g);
g.fillOval(0, 0, 30, 30);
g.drawOval(0, 50, 30, 30);
g.setColor(Color.CYAN);
workingManager.setSize(500, 500);
workingManager.setVisible(true);
不要调用getGraphics()
或显式调用paintXxx()
进行自定义绘制。进行自定义绘制的正确方法是覆盖要绘制的面板的paintComponent
方法。将为您隐式调用重写的方法。然后将该面板添加到框架中。您还应该覆盖面板的getPreferredSize()
,使其具有首选大小,这样您就可以打包框架了
class PaintPanel extends JPanel {
@Override
protected paintComponent(Grapchics g) {
super.paintComponent(g);
g.drawString(....);
}
@Override
public Dimension getPreferredSize() {'
return new Dimension(300, 300);
}
}
然后将其添加到框架中(或者,如果要将其设置为框架的内容窗格,请执行此操作)
更多信息请参见我对您的代码做了一些更改,以使其正常工作
package com.ggl.testing;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class TestGraphics implements Runnable{
private JFrame workingManager;
private JPanel drawingPanel;
@Override
public void run() {
workingManager = new JFrame("Hello");
workingManager.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
drawingPanel = new DrawingPanel();
workingManager.add(drawingPanel, BorderLayout.CENTER);
workingManager.pack();
workingManager.setLocationByPlatform(true);
workingManager.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new TestGraphics());
}
public class DrawingPanel extends JPanel {
private static final long serialVersionUID =
-3701718376300985046L;
public DrawingPanel() {
this.setPreferredSize(new Dimension(500, 500));
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.CYAN);
g.fillOval(0, 0, 30, 30);
g.drawOval(0, 50, 30, 30);
}
}
}
尝试将框架设置为在末尾可见。此外,尝试在Swing事件调度线程上执行所有操作。设置为在末尾可见会使nullPointerException@user3709980这意味着您没有初始化workingManager实例。实际上,我是这方面的新手,我猜workingManager已经初始化,正如您在这里使用
getGraphics()所看到的
在渲染帧之前的帧上(setVisible),将返回一个空的图形
对象。与帧的初始化无关。在任何情况下,getGraphics()
都不是执行自定义绘制的正确方法。首先,您不知道何时需要重新绘制组件,并且内容将在没有知识的情况下过度绘制。另外请注意,非空图形对象仅在渲染组件后可用。即便如此,任何重新绘制都不会持续。所以不要用这种方式画画。你的意思是,重绘是持久的,所以我看不到任何东西。我的意思是图形对象不会持久到任何重绘。
package com.ggl.testing;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class TestGraphics implements Runnable{
private JFrame workingManager;
private JPanel drawingPanel;
@Override
public void run() {
workingManager = new JFrame("Hello");
workingManager.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
drawingPanel = new DrawingPanel();
workingManager.add(drawingPanel, BorderLayout.CENTER);
workingManager.pack();
workingManager.setLocationByPlatform(true);
workingManager.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new TestGraphics());
}
public class DrawingPanel extends JPanel {
private static final long serialVersionUID =
-3701718376300985046L;
public DrawingPanel() {
this.setPreferredSize(new Dimension(500, 500));
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.CYAN);
g.fillOval(0, 0, 30, 30);
g.drawOval(0, 50, 30, 30);
}
}
}