Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Торможение при странных обстоятельствах, Помогите разобраться с причинами 
V
    Опции темы
Mirkes
Дата 18.10.2012, 06:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 586
Регистрация: 18.8.2011
Где: Красноярск

Репутация: 2
Всего: 17



Столкнулся со странным эффектом торможения.
Есть простая программка (текст ниже).
В ней есть JTabblePane на три закладки и отдельно лежащая, никак не связанная с JTabblePane, панель.
Переключение между закладками происходит незаметно для глаза.
Если нажать кнопку Labels в первой закладке, то в отдельную панель добаляются 2000  меток со случайным положением и содержанием "L-n", где n это просто номер.
После этого скорость переключения между закладками катастрофически падает - раз в 500-600.
При этом это никак не может быть связано с отрисовкой - в момент отрисовки панели в правую протокольную область выводится "Draw".
Итак точная формулировка вопросаю
Каким образом (почему, за счет какого механизма) скорость переключения между закладками в JTabbedPane заисит от количества компонентов, вставленных в некую чуждую этому JTabbedPane панель? Подозреваю, что зависеть будет от числа компонентов, вставленных в RootPane.
Демонстрация торможения
Код

Draw        -отрисовка панели
2895718  - переключения без добавления компонентов.
2995002
1731726
2512840
2370769
1436613
Buffered Labels 2000  - добавлили 2000 меток в буферизованную панель, не вставленную в какой-либо контейнер
Draw
Buffered Labels 2000 - добавлили 2000 меток в буферизованную панель, не вставленную в какой-либо контейнер
Draw
2093758 - переключения по кнопкам next Время не изменилось
1971435
2152452
1650543
2126122
1883670
1489822
2153001
1842530
Labels 2000 - добавлили 2000 меток непосредственно в панель, вставленную в апплет
Draw
1371259059 - переключения по кнопкам Next. Время серьезно увеличилось.
1367083608
1363996453
1371507544
1370675416
1368663390


Пример, демонстрирующий проблему 
Код

package tpt;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;

import java.util.Random;

import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;


public class Applet1 extends JApplet {
    @SuppressWarnings("compatibility:-7644383762981381622")
    private static final long serialVersionUID = 1L;
    private JTabbedPane jTabbedPane1 = new JTabbedPane();
    private JPanel jPanel1 = new JPanel();
    private JPanel jPanel2 = new JPanel();
    private JPanel jPanel3 = new JPanel();
    private JButton jButton1 = new JButton();
    private JTextArea jTextArea1 = new JTextArea();
    private JButton jButton2 = new JButton();
    private JButton jButton3 = new JButton();
    private JButton jButton4 = new JButton();

    // Addition part
    private MyPanel jPanel4 = new MyPanel();
    private BufferedImage img = null;
    private JPanel buffPanel = new JPanel();
    private JButton jButton5 = new JButton();
    private Random rnd = new Random();

    public Applet1() {
    }

    private void jbInit() throws Exception {
        this.getContentPane().setLayout(null);
        this.setBounds(new Rectangle(10, 10, 500, 500));
        jTabbedPane1.setBounds(new Rectangle(0, 5, 400, 100));
        jButton1.setText("JLabels");
        jButton1.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                jButton1_mouseClicked(e);
            }
        });
        jPanel4.setBounds(new Rectangle(0, 105, 365, 395));
        buffPanel.setBounds(new Rectangle(0, 105, 365, 395)); //Additional
        jTextArea1.setBounds(new Rectangle(370, 110, 130, 390));
        jButton2.setText("Next");
        jButton2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                jButton2_actionPerformed(e);
            }
        });
        jButton3.setText("Next");
        jButton3.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                jButton3_actionPerformed(e);
            }
        });
        jButton4.setText("Next");
        jButton4.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                jButton4_actionPerformed(e);
            }
        });
        jPanel1.add(jButton1, null);
        jPanel1.add(jButton2, null);
        jTabbedPane1.addTab("jPanel1", jPanel1);
        jPanel2.add(jButton5, null);
        jPanel2.add(jButton3, null);
        jTabbedPane1.addTab("jPanel2", jPanel2);
        jPanel3.add(jButton4, null);
        jTabbedPane1.addTab("jPanel3", jPanel3);
        this.getContentPane().add(jTextArea1, null);
        this.getContentPane().add(jPanel4, null);
        this.getContentPane().add(jTabbedPane1, null);
        jPanel4.setLayout(null);
        buffPanel.setLayout(null);
        jButton5.setText("Buffered Labels");
        jButton5.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                jButton5_actionPerformed(e);
            }
        }); // Additional
    }

    public void init() {
        try {
            jbInit();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        Applet1 applet = new Applet1();
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(applet, BorderLayout.CENTER);
        frame.setTitle("Applet Frame");
        applet.init();
        applet.start();
        frame.setSize(500, 500);
        Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
        Dimension frameSize = frame.getSize();
        frame.setLocation((d.width - frameSize.width) / 2, (d.height - frameSize.height) / 2);
        frame.setVisible(true);
    }

    public void start() {
    }

    public void stop() {
    }

    public void destroy() {
    }

    private void jButton1_mouseClicked(MouseEvent e) {
        jTextArea1.append("Labels 2000\n");
        for (int i = 0; i < 2000; i++) {
            JLabel l = new JLabel("L-" + i);
            l.setLocation(rnd.nextInt(350), rnd.nextInt(380));
            l.setSize(20, 40);
            jPanel4.add(l);
            l.repaint();
        }
        jPanel4.repaint();
    }


    private void jButton2_actionPerformed(ActionEvent e) {
        long t1, t2;
        t1 = System.nanoTime();
        jTabbedPane1.setSelectedIndex(1);
        t2 = System.nanoTime();
        jTextArea1.append("" + (t2 - t1) + "\n");
    }

    private void jButton3_actionPerformed(ActionEvent e) {
        long t1, t2;
        t1 = System.nanoTime();
        jTabbedPane1.setSelectedIndex(2);
        t2 = System.nanoTime();
        jTextArea1.append("" + (t2 - t1) + "\n");
    }

    private void jButton4_actionPerformed(ActionEvent e) {
        long t1, t2;
        t1 = System.nanoTime();
        jTabbedPane1.setSelectedIndex(0);
        t2 = System.nanoTime();
        jTextArea1.append("" + (t2 - t1) + "\n");
    }

    private void jButton5_actionPerformed(ActionEvent e) {
        jTextArea1.append("Buffered Labels 2000\n");
        for (int i = 0; i < 2000; i++) {
            JLabel l = new JLabel("L-" + i);
            l.setLocation(rnd.nextInt(350), rnd.nextInt(380));
            l.setSize(20, 40);
            buffPanel.add(l);
            l.repaint();
        }
        img = new BufferedImage(buffPanel.getWidth(), buffPanel.getHeight(), BufferedImage.TYPE_INT_ARGB);
        buffPanel.paint(img.getGraphics());
        jPanel4.repaint();
    }

    private class MyPanel extends JPanel {
        public MyPanel() {
            super();
        }

        public void paint(Graphics g) {
            jTextArea1.append("Draw\n");
            if (img == null)
                super.paint(g);
            else {
                g.drawImage(img, 0, 0, this);
            }
        }
    }
}



--------------------
Mirkes
PM MAIL   Вверх
Mirkes
Дата 18.10.2012, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 586
Регистрация: 18.8.2011
Где: Красноярск

Репутация: 2
Всего: 17



Нашел решение на одном из англоязычных форумов.
Я бы сказал, что для предотвращения подобных эффектов при работе с JTabbedPane, всегда рекмендуется ставить строку
Код

        tabbedPane.setFocusCycleRoot(true);

Тему закрываю.


--------------------
Mirkes
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0415 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.