2010-08-22 23 views
2

当我使用Eclipse和Run-> cmd来运行程序时,我从来没有将“绘图”写入我的命令行窗口。如果我在另一个程序中从paintComponent运行System.out.print(),它工作正常。有人可以帮忙吗?从Eclipse运行应用程序时未调用repaint()?

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(); 
    } 
} 
+0

我不知道你想做什么。我不知道问题是什么。但是它不可能在命令行上绘制。它仅适用于字符(文本)。 – 2010-08-22 18:06:12

+0

你可以减少你的程序到最小的程序,但仍然显示出问题吗?这将帮助我们在StackOverflow上,甚至可能帮助您找到问题。 – 2010-08-22 18:07:45

回答

3

组件必须添加到一个可见的窗口/框架/组件为paintComponent被调用。
GUI仅作为KeyListener添加,但既未添加到JFrame中,也未添加到上述代码中的任何其他可见组件。由于没有显示组件,因此没有理由调用paintComponent

+0

感谢您的帮助,我应该知道,Ty。 – demon 2010-08-23 13:31:55

0

你可能错过 “的System.out.println(” 涂料 “)的输出;” ?

Windows下的GUI-Apps无法写入控制台(它们没有控制台,因为如果每个GUI应用程序也会打开黑色窗口,它会吸引人)。

windows下有两个java解释器:“javaw.exe”,它是一个GUI应用程序,并默默丢弃任何System.out的写入。和“java.exe”这是一个控制台应用程序,并允许写入控制台。尝试启动“java.exe的”程序

+0

我使用eclipse和Run-> cmd来运行程序。它可以在其他程序中从paintComponent运行System.out.print()。 – demon 2010-08-22 18:59:27

2

有许多的问题与您的代码:

  1. 你的GUI面板不在帧(应该不是添加的,而不是泛? )
  2. 字符串s是未初始化的,这会导致一个NullPointerException
  3. 涂料应覆盖代替paintComponents
  4. 涂料不应改变该部件的状态下,由于它可以被称为的任何时间。
  5. 等...
+0

paintComponent()是覆盖自定义绘画的正确方法。请参阅自定义绘画的Swing教程:http://download.oracle.com/javase/tutorial/uiswing/painting/index.html – camickr 2010-08-22 19:04:56

+0

camickr是正确的:请忽略第3点。 – 2010-08-22 20:22:55

-1

我用这个与AWT(不是100%肯定它是否的工作在Swing太...)

Graphics g = _yourcomponent_.getGraphics(); 
if (g != null) { 
    _yourcomponent_.paint(g); 
    // below the estimated code for Swing: 
    _yourcomponent_.paintComponent(g); 
} 
+0

您不应该使用getGraphics()方法做绘画。请参阅我对Maurice的评论以获取关于自定义绘画教程的链接。 – camickr 2010-08-22 19:06:06

+0

是的,我知道这不是重绘组件的官方方式,但是(据我所知)这是唯一的**工作方式,并且不会崩溃。 – elslooo 2010-08-22 19:26:00

相关问题