2015-10-29 5 views
1

Я хочу, чтобы моя программа java рисовала строку «hello», поскольку параметр метода ввода изменяется, не теряя при этом предыдущие рисунки. Другими словами, кадр должен рисовать много строк «Hello» один за другим, пока программа не будет остановлена. В настоящее время он показывает только одно слово «привет» с измененной новой позицией y.Java-Как рисовать на JFrame, не теряя существующий чертеж

Как изменить программу ниже, чтобы нарисовать много слов «привет» с новыми позициями y? Ваша помощь очень ценится.

благодаря

коды

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. Прочтите учебник Swing [Использование текстовых компонентов] (http://docs.oracle.com/javase/tutorial/uiswing/components/text.html) для получения дополнительной информации. – camickr

+0

@camickr Вы должны сделать ответ, было бы практично тогда, что OP, похоже, пытается сделать: P – MadProgrammer

ответ

2

Перебрать List<Point> в вашей реализации paintComponent(), где каждая точка является leading baseline строки. Начиная с этого 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

Если вы хотите сохранить то, что вы нарисовали, вы можете использовать новое буферизованное изображение. Создать поле:

Image drawing = new BufferedImage(600, 600, BufferedImage.TYPE_INT_ARGB); 

Затем в компонентах краски:

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

Затем, когда вы хотите, чтобы обновить изображение просто привлечь к нему.

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 позиции чертежа каждый раз, когда вводится вход. Я думаю, проблема заключается в перерисовке(). Он сбрасывает мой stateobject (это не должно быть так) System.out.println («введите команду?»); BufferedReader in = new BufferedReader (новый InputStreamReader (System.in)); текст = in.readLine(); – user5505248

+0

Как я его настроил, вы никогда не изменяете свой метод paintComponents. У вас просто есть методы, которые изменяют изображение, а затем вы перерисовываете. – matt

 Смежные вопросы

  • Нет связанных вопросов^_^