Java图形将不显示

Java图形将不显示,java,swing,graphics,paintcomponent,Java,Swing,Graphics,Paintcomponent,这是我的密码: package survival; import javax.swing.*; import java.awt.*; public class Survival extends JFrame { private static int applicationWidth = 1400; private static int applicationHeight = 900; public Survival() { setTitle("S

这是我的密码:

package survival;
import javax.swing.*;
import java.awt.*;

public class Survival extends JFrame { 
    private static int applicationWidth = 1400;
    private static int applicationHeight = 900;  

    public Survival() {
        setTitle("Survival");
        setResizable(false);
        setSize(applicationWidth, applicationHeight);
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    public void paint(Graphics g) {
        g.drawString("Test", 0, 0);
    }

    public static void main(String[] args) {
        new Survival();
    }
}

为什么没有显示“测试”?

不要覆盖
绘制
。无论何时自定义组件,都要覆盖
paintComponent

示例-

@Override
protected final void paintComponent(final Graphics g){
    super.paintComponent(g);
    final Graphics gCopy = g.create(); // Prevents clobbering
    gCopy.drawString("Test", 0, 0);
    gCopy.dispose();
}
您需要调用超类的paint()方法。(第条-)

重写JPanel的paintComponent

 public Survival() {
        setTitle("Survival");
        setResizable(false);
        setSize(applicationWidth, applicationHeight);
        setVisible(true);
        add(new DrawPanel());
        setDefaultCloseOperation(EXIT_ON_CLOSE);
     }

   class DrawPanel extends JPanel
   {
    @Override
    protected  void paintComponent( Graphics g){
       g.drawString("Test", 220,220);
      }
   }

我通常将
Graphics
对象强制转换为
Graphics2D
。不确定这是否是问题所在。1)在Swing顶级容器中重写
paint()
,通常是愚蠢的。相反,在
JComponent
JPanel
中重写
paintComponent()
,然后将其添加到TLC中。2) 然后设置自定义组件的
preferredSize()
,将其添加到框架中并调用
pack()
。这将确保渲染区域为1400x900。3) 应在EDT上创建和更新Swing GUI。4) 在坐标0x0处,
字符串
将基本不可见。5) 只是一个旁注,但是如果你可以让一个GUI在400x300时失败,就不需要将它设置为1400x900@AVD,为什么?你想对此发表评论吗?我有两个意见:你应该按照建议调用
super.paintComponent()
,我看不到克隆图形上下文的理由。@trashgod,在这种情况下,确实没有理由克隆图形对象,但我试图强化良好的做法。至于调用
super.paintComponent
,您完全正确。这是漫长的一天。。。“良好做法”取决于背景及其相互竞争的制约因素;-)克隆图形的力量是将其返回到与您获得图形相同的状态。更普遍的力量(对于代码健全性)是不让任何代码被不必要的行弄乱。因此,如果第一个不存在(微不足道,因为没有任何变化),第二个可以充分繁荣。换言之:你将有一个艰巨的任务通过我的审查:-)@ConnerRuhl-在JFrame上绘图是非常棘手的。您必须使用JPanel并重写paintComponet方法。
 public Survival() {
        setTitle("Survival");
        setResizable(false);
        setSize(applicationWidth, applicationHeight);
        setVisible(true);
        add(new DrawPanel());
        setDefaultCloseOperation(EXIT_ON_CLOSE);
     }

   class DrawPanel extends JPanel
   {
    @Override
    protected  void paintComponent( Graphics g){
       g.drawString("Test", 220,220);
      }
   }