| Цитата | фрейм всё равно виснет.
|
И будет виснуть, если использовать бесконечный цикл. Вы этим циклом останавливаете процесс отрисовки навсегда. В правильно построенном Swing-приложении отрисовка компонет и обработка событий выполняются в едином потоке, называемом EDT. Если вы хотите что-то выполнять параллельно (например генерировать новые графические примитивы и добавлять их на компонет) - нужно организовать отдельный поток. Удобно использовать для этой цели таймеры:
| Код | public class ThirdFrame extends JFrame {
Image img; Timer timer = new Timer(1000, new ActionListener() { Random rm = new Random(); @Override public void actionPerformed(ActionEvent e) { if(img==null){ img = createImage(300,400); } Graphics g = img.getGraphics(); g.setColor(new Color(rm.nextInt(256),rm.nextInt(256),rm.nextInt(256))); g.fillRect(rm.nextInt(300), rm.nextInt(400), 10, 10);
ThirdFrame.this.getContentPane().repaint(); } }); public ThirdFrame() { //setSize(400, 300); getContentPane().setLayout(new FlowLayout()); MyComponent component = new MyComponent(); component.setPreferredSize(new Dimension(300,400)); add(component); JButton btn = new JButton("Старт"); btn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { timer.start(); } }); JButton stop = new JButton("Стоп"); stop.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { timer.stop(); } }); add(btn); add(stop); setSize(600,400); } private class MyComponent extends JComponent { @Override public void paintComponent(Graphics g) { g.drawImage(img,0,0,null); } }
|
|