Java 从Eclipse运行应用程序时未调用repaint()?

Java 从Eclipse运行应用程序时未调用repaint()?,java,eclipse,repaint,Java,Eclipse,Repaint,当我使用Eclipse并运行->cmd来运行程序时,我从未将“paint”写入命令行窗口。如果我在另一个程序中从paintComponent运行System.out.print(),效果会很好。能帮忙的人 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class GUI extends JPanel implements KeyListener, ActionListener { priv

当我使用Eclipse并运行->cmd来运行程序时,我从未将“paint”写入命令行窗口。如果我在另一个程序中从paintComponent运行System.out.print(),效果会很好。能帮忙的人

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class GUI extends JPanel implements KeyListener, ActionListener
 {
  private static final long serialVersionUID = 1L;
  JFrame frmMain = new JFrame("Kodning");
  JTextField text = new JTextField();
  JPanel pan = new JPanel();
  static char bokstav;
  static int x=10, y=80;
  boolean convert = false;
  String s;
  Timer t = new Timer(10, this);
  public static void main(String[] args)
   {

    @SuppressWarnings("unused")
    GUI g = new GUI();

   }

  public GUI()
   {
    frmMain.setSize(600, 120);
    frmMain.setLayout(new GridLayout(2, 1));
    frmMain.addWindowListener(hornStang());
    frmMain.add(text);
    frmMain.add(pan);
    frmMain.setFocusable(true);
    frmMain.setVisible(true);
    frmMain.addKeyListener(this);
    text.addKeyListener(this);
    pan.addKeyListener(this);
    t.start();
   }
  private static WindowAdapter hornStang() 
   {
    return new WindowAdapter() 
     {
      public void windowClosing(WindowEvent e) 
       {
        System.exit(0);
       }
     };
   }
  public void keyPressed(KeyEvent e)
   {
    if(e.getKeyCode()== KeyEvent.VK_ENTER)
     {
      System.out.println("dechifrera");
      repaint();
      deshiffrera(text.getText());
     }
   }
  public void keyReleased(KeyEvent arg0){}
  public void keyTyped(KeyEvent arg0){}
  public void deshiffrera(String s) 
   {
    s = this.s;
    repaint();
   }
  @override
  public void paintComponent(Graphics g)
   {
    System.out.println("paint");
    for(int i=0;i<s.length();i++)
     {
      bokstav = s.charAt(i);
      switch (bokstav)
       {
        case 'a':nere(g); hoger(g); prick(g, 0); break;
        //en massa case
        default:break;
       }
      x=x+12;
     }
   }
  @Override
  public void actionPerformed(ActionEvent e)
   {
    repaint();
   }
 }
import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
公共类GUI扩展JPanel实现KeyListener、ActionListener
{
私有静态最终长serialVersionUID=1L;
JFrame frmMain=新JFrame(“Kodning”);
JTextField text=新的JTextField();
JPanel pan=新的JPanel();
静态字符bokstav;
静态整数x=10,y=80;
布尔转换=假;
字符串s;
定时器t=新定时器(10,此);
公共静态void main(字符串[]args)
{
@抑制警告(“未使用”)
GUI g=新GUI();
}
公共图形用户界面()
{
最小设置尺寸(600120);
frmMain.setLayout(新网格布局(2,1));
addWindowListener(hornStang());
frmMain.add(文本);
frmMain.添加(pan);
frmMain.setFocusable(真);
frmMain.setVisible(真);
frmMain.addKeyListener(此);
text.addKeyListener(this);
pan.addKeyListener(这个);
t、 start();
}
专用静态WindowAdapter hornStang()
{
返回新的WindowAdapter()
{
公共无效窗口关闭(WindowEvent e)
{
系统出口(0);
}
};
}
按下公共无效键(按键事件e)
{
如果(例如getKeyCode()==KeyEvent.VK_ENTER)
{
System.out.println(“dechifrera”);
重新油漆();
deshiffrera(text.getText());
}
}
public void keyReleased(KeyEvent arg0){}
public void keyTyped(KeyEvent arg0){}
公共void deshiffrera(字符串s)
{
s=这个.s;
重新油漆();
}
@凌驾
公共组件(图形g)
{
系统输出打印(“油漆”);

对于(inti=0;i您可能会错过“System.out.println(“paint”);”的输出

Windows下的GUI应用程序无法写入控制台(它们没有控制台,因为如果每个GUI应用程序都打开一个黑色窗口,这会很糟糕)


windows下有两个java解释器:“javaw.exe”是一个GUI应用程序,它会自动丢弃任何System.out-writes。而“java.exe”是一个控制台应用程序,它允许写入控制台。请尝试使用“java.exe”启动程序。

您的代码存在许多问题:

  • 您的GUI面板不在框架中(是否应该添加它而不是pan?)
  • 字符串s未初始化,这会导致NullPointerException
  • 应覆盖油漆,而不是油漆组件
  • 绘制不应更改零部件的状态,因为它可以随时调用
  • 等等
  • 我在AWT中使用它(不能100%确定它是否也在Swing中工作…)


    必须将组件添加到可见窗口/框架/组件中,才能调用它的
    paintComponent


    GUI
    仅作为KeyListener添加,但既没有添加到JFrame,也没有添加到上面代码中的任何其他可见组件。没有理由调用
    paintComponent
    ,因为该组件根本没有显示出来。

    我不知道您想做什么。我不知道问题出在哪里。但无法查看命令行上的nt。它仅用于字符(文本)。你能将你的程序缩减到最小的程序来演示这个问题吗?这将帮助我们解决StackOverflow问题,甚至可以帮助你找到问题。我使用eclipse和Run->cmd来运行这个程序。运行System.out.print()可以很好地工作来自其他程序中的paintComponent。paintComponent()是用于覆盖自定义绘制的正确方法。请参阅有关自定义绘制的Swing教程:您不应使用getGraphics()方法进行绘制。有关自定义绘制教程的链接,请参阅我对Maurice的评论。是的,我知道这不是重新绘制组件的官方方法,但(据我所知)这是唯一有效的方法,而且不会崩溃。谢谢你的帮助,我应该知道,Ty。
    Graphics g = _yourcomponent_.getGraphics();
    if (g != null) {
        _yourcomponent_.paint(g);
        // below the estimated code for Swing:
        _yourcomponent_.paintComponent(g);
    }