Столкнулся со странным эффектом торможения. Есть простая программка (текст ниже). В ней есть 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
|