2015-10-29 52 views
1

我希望我的java程序在輸入方法參數發生變化時繪製字符串「hello」,而不會丟失之前的圖形。換句話說,框架必須依次繪製很多「Hello」字符串,直到程序被迫停止。目前它只顯示「hello」的一個詞,它的新y位置已更改。Java-如何在不丟失現有圖形的情況下在JFrame上繪圖

如何更改下面的程序來繪製很多帶有新y位置的「hello」字樣?非常感謝您的幫助。

感謝

import java.awt.*; 


import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 

import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.swing.*; 


public class test6 extends JPanel { 
     int x=100; 
    int y=30; 



String text = null; 



    public static void main (String args[]){ 

      JFrame frame = new JFrame("Test Game"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     test6 gamePanel = new test6(); 
     frame.add(gamePanel); 
     frame.setSize(400,400); 
     frame.setVisible(true); 

     } 


     @Override 
     public void paintComponent(Graphics g){ 


     super.paintComponent(g); 


input(); 


    g.drawString("hello", x, y); 

     } 



    void input(){ 


    try { 
       System.out.println("input your command?"); 
       BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 

       text = in.readLine(); 

     y=y+50; 


      } catch (IOException ex) { 
       Logger.getLogger(test6.class.getName()).log(Level.SEVERE, null, ex); 
      } 


repaint(); 


} 

} 
+0

你想讓它們一次全部打印,還是隻是一段時間打印? – MadProgrammer

+0

'框架必須依次繪製許多字符串「你好」,直到程序被迫停止。 - 不要做自定義繪畫。相反,只需將文本添加到JTextArea。有關詳細信息,請閱讀[使用文本組件](http://docs.oracle.com/javase/tutorial/uiswing/components/text.html)上的Swing教程。 – camickr

+0

@camickr你應該做出這樣的答案,然後OP似乎試圖做的事實際上是可行的:P – MadProgrammer

回答

2

通過您實現paintComponent(),其中每個點是一個字符串的leading baseline一個List<Point>迭代。從這個example開始,下面的迭代方案產生一個類似於下圖所示的圖像。

for (Bauble b : queue) { 
     g2d.setColor(b.c); 
     //g2d.fillOval(b.x, b.y, b.d, b.d); 
     g2d.drawString("Hello", b.x, b.y); 
    } 

image

1

如果你想保留你畫什麼,你可以使用一個新的緩衝圖像。當你想更新圖像只畫它

public void paintComponent(Graphics g){ 
    super.paintComponent(g); 
    g.drawImage(drawing, 0, 0, this); 
} 

然後:創建一個字段:

Image drawing = new BufferedImage(600, 600, BufferedImage.TYPE_INT_ARGB); 
在您的油漆成分

然後。

public void addText(String s){ 
    Graphics2D g = drawing.createGraphics(); 
    g.setColor(Color.WHITE); 
    g.drawString(s, x, y); 
    g.dispose(); 
    repaint(); 
} 

然後BufferedImage會累積所有繪製的字符串。

+0

非常感謝。我想我設法使用緩衝的圖像來做這個程序。 – user5505248

+0

我真正的問題有點複雜。基於用戶輸入的繪圖。我想重複發送輸入流到paintComponent(Graphics g)方法。這可能嗎?所以根據輸入圖紙的變化。我的程序有一個狀態對象,每次繪製輸入時都會改變圖形的x,y位置。我認爲問題是repaint()。它重置我的狀態對象(不應該是這種情況)System.out.println(「輸入你的命令?」); BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); text = in.readLine(); – user5505248

+0

按照我設置的方式,你永遠不會修改你的paintComponents方法。你只需要修改圖像的方法,然後重畫。 – matt

相關問題