2014-02-04 7 views
1

Я тестирую, как много времени ставит компоненты в панель. В качестве примера тестирования я помещаю несколько компонентов в jPanel. Я ищу более быстрый способ разместить их. Вот мой тестовый код:Самый быстрый способ добавления компонентов в Jpanel

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

public class MyPane { 
    JFrame Myframe; 
    JPanel Mypanel; 


    public void createUI() 
    { 

    Myframe = new JFrame("Test clicks"); 
    Mypanel = new JPanel(); 
    Myframe.setPreferredSize(new Dimension(600, 600)); 
    Myframe.setMinimumSize(new Dimension(600, 600)); 
    Myframe.add(Mypanel); 
    Myframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    Myframe.setVisible(true); 

    //ADD 100+1 LABELS 
    long start_time = System.nanoTime();//START TIME 
    for (int i=0; i<100 ; i++){ 
     JLabel myLabel= new JLabel(); 
     myLabel.setText("label"+ i); 
     Mypanel.add(myLabel); 
    } 

    long end_time = System.nanoTime(); //START TIME 
    double difference = (end_time - start_time)/1000000; 

    //ADD EXECUTION TIME LABEL 
    JLabel MyInfo= new JLabel(); 
    MyInfo.setText("milliseconds:"+ difference); 
    MyInfo.setBackground(Color.yellow); 
    MyInfo.setOpaque(true); 
    Mypanel.add(MyInfo); 

    Myframe.pack(); 
} 

public static void main(String[] args) { 
    MyPane overlapPane = new MyPane(); 
    overlapPane.createUI(); 
} 

} 

В моем компьютере добавление 1000 JLabels занимает 120 millliseconds. Конечно, время выполнения может сильно различаться в зависимости от аппаратного обеспечения, Os и т. Д.

Мой вопрос: есть ли более быстрый способ разместить многие компоненты в панели. Есть ли способ, например, разместить все сразу? Разве это имеет значение?

EDIT: Я хотел бы уточнить, что создание 1000 ярлыков один за другим не является тем, чего я пытаюсь достичь в любом реальном программном обеспечении, которое я разрабатываю, хотя я имею на это право. Это всего лишь пример, и я знаю, что в некоторых случаях могут быть более эффективные способы отображения большого количества текстовой информации на экране. Кроме того, мой вопрос заключается не в оптимизации программного обеспечения в целом, а только в тестировании этого конкретного алгоритма.

+2

Я думаю, что это довольно бессмысленный вопрос без дополнительного контекста. Например, добавьте один 'JList', состоящий из 1000 элементов с рендером ячеек по умолчанию (который может использовать один JLabel), и вы можете обнаружить, что это намного быстрее. Но даже без этого, действительно ли это является узким местом в приложении? –

+0

@ Андрей Томпсон. Я упростил случай, чтобы увидеть, как добавление компонентов влияет на производительность. – geo

+0

Иногда случаи могут быть упрощенными, и я думаю, что это произошло здесь, если это было непонятно. –

ответ

2

Это добавляет 1,000,000 видимые объекты в 196 наносекундах.

enter image description here

Как я уже сказал, это зависит от контекста, и довольно произвольный вопрос.

import java.awt.*; 
import java.util.Vector; 
import javax.swing.*; 

class ManyObjects { 

    public static void main(String[] args) { 
     Runnable r = new Runnable() { 
      @Override 
      public void run() { 
       JPanel gui = new JPanel(new BorderLayout()); 

       Vector<Integer> v = new Vector<Integer>(); 
       long start = System.nanoTime(); 
       for (int ii=0; ii<=1000000; ii++) { 
        v.add(ii); 
       } 
       long end = System.nanoTime(); 

       int duration = (int)((end-start)/1000000); 
       v.add(duration); 

       JList<Integer> list = new JList<Integer>(v); 
       System.out.println("Duration in seconds: " + duration); 

       JOptionPane.showMessageDialog(null, new JScrollPane(list)); 
      } 
     }; 
     // Swing GUIs should be created and updated on the EDT 
     // http://docs.oracle.com/javase/tutorial/uiswing/concurrency 
     SwingUtilities.invokeLater(r); 
    } 
} 
+0

Ваш пример добавляет целые числа в JScrollPane. Как насчет Jlabels для группы? :) – geo

+0

* «Как насчет Jlabels для группы?» * Почему мы должны заботиться ***? Это просто пустая, без приложений в * реальном мире *. –

+0

Если кто-то не заботится, может просто игнорировать вопрос. И, в любом случае, насколько быстро компонент добавляется в панель, это связано с производительностью программного обеспечения. Если доказывать, что это имеет значение очень мало, достаточно мало, чтобы игнорировать, это еще ответ. Если кто-то говорит, что способ добавления компонентов в мой тест является лучшим, это все равно ответ. – geo

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