2013-04-11 3 views
0

Приветствую всех, это мой первый вопрос, поэтому я надеюсь, что он хороший. Я изучал API-интерфейс swing, и я столкнулся с вопросом, который появился у меня в голове. Я в основном спросил мой сам, если бы я мог создать программу, которая может использовать while() петлю и отображения нескольких JTextArea, как вы могли бы в консоли, как это:Java: Я не могу запустить JTextArea несколько раз?

while(x<100){ 
    System.out.println("This is the number: " + x) 
    x++; 
} 

Я хочу, чтобы напечатать в JFrame ввести код здесь, но я похоже, не может понять. Я пытаюсь использовать JTextArea, но я действительно не думаю, что это правильный подход к нему. Я пробовал ярлыки, но это не сработало. Вот исходный код.

import javax.swing.*; 
import java.awt.BorderLayout; 
import java.awt.Container; 

public class MainFrame extends JFrame{ 

    public static int x=0; 
    public static int y = 0; 
    MainFrame(String title){ 
     super(title); 
     // Set Layout 
     setLayout(new BorderLayout()); 

     while(x<100){ 
      y++; 
      x++; 
      System.out.println(x); 
      Container pane= getContentPane(); 
      JTextArea x = new TextArea("Wateva" + y); 
      JButton button= new JButton("Wateva man"); 
      pane.add(button, BorderLayout.SOUTH); 
      pane.add(x); 
     } 
    } 
} 

В консоли x отображается каждый раз приращением на 1, что означает, что цикл работает правильно. Единственное объяснение, которое я могу сделать в качестве программиста для начинающих, состоит в том, что он создает JTextArea, но затем он понимает, что x был обновлен и поэтому он переопределяет старый JTextArea с новым, и он делает это для каждого числа, пока не достигнет 100 Я думаю, что я использую неправильный тип JComponent, но именно поэтому я здесь. Поэтому, если кто-нибудь может дать мне советы или решение о том, как исправить, это было бы очень признательно.

+3

Ваш код не относится к JTextArea вообще ... –

+0

Вы добавляете все компоненты в одно и то же место ... Может быть, они накладываются друг на друга? – HectorLector

+0

Мой плохой ... Я скопировал и вставил код, с которым я экспериментировал. Я обновил его, теперь должен быть JTextArea. –

ответ

2

Добро пожаловать в блокировку Диспетчерской темы событий.

EDT несет ответственность за, помимо прочего, обработку запросов на перерисовку. Вы никогда не должны выполнять любые операции, которые блокируют EDT, вместо этого, вы должны использовать что-то как SwingWorker

Посмотрите на Concurrency in Swing для получения более подробной информации

Обновленные с примером

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.util.List; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.SwingWorker; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class TestTextArea03 { 

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

    public TestTextArea03() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Test"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 

     }); 
    } 

    public class TestPane extends JPanel { 

     private JTextArea textArea; 

     private TestPane() { 
      setLayout(new BorderLayout()); 
      textArea = new JTextArea(10, 10); 
      add(new JScrollPane(textArea)); 

      new TextWorker().execute(); 
     } 

     public class TextWorker extends SwingWorker<Void, String> { 

      @Override 
      protected void process(List<String> chunks) { 
       for (String text : chunks) { 
        textArea.append(text + "\n"); 
       } 
      } 

      @Override 
      protected Void doInBackground() throws Exception { 
       Thread.sleep(1000); 
       for (int x = 0; x < 10; x++) { 
        publish(String.valueOf(x)); 
        Thread.sleep(250); 
       } 
       return null; 
      } 

     } 

    } 

} 

Или a Качающийся таймер

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.List; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.SwingWorker; 
import javax.swing.Timer; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class TestTextArea03 { 

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

    public TestTextArea03() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Test"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 

     }); 
    } 

    public class TestPane extends JPanel { 

     private JTextArea textArea; 
     private int x; 

     private TestPane() { 
      setLayout(new BorderLayout()); 
      textArea = new JTextArea(10, 10); 
      add(new JScrollPane(textArea)); 

      Timer timer = new Timer(250, new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        x++; 
        textArea.append(String.valueOf(x) + "\n"); 
       } 
      }); 
      timer.setRepeats(true); 
      timer.setCoalesce(true); 
      timer.start(); 
     }   
    }  
} 
+1

Или 'javax.swing.Timer', для [пример] (http://stackoverflow.com/a/5529043/230513). – trashgod

+0

@Lonenebula Честно говоря, кто знает, но концепция/требования будут одинаковыми: P – MadProgrammer

+0

Благодарим за быстрый ответ. Я узнал об EDT, когда смотрел на потоки в качелях. Я узнал, что вы не должны преподносить слишком сложные действия. Какая часть моего кода точно «заблокировала» EDT. И что именно вы подразумеваете под «блокировкой»? –

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