2011-01-04 6 views
0

스윙 앱이 있습니다. 큰 JTable을 포함하는 많은 내부 프레임이있는 jframe이 있습니다. 이러한 jtable은 지속적으로 업데이트되므로 계속해서 다시 칠할 수 있습니다.보이지 않는 JFrame/JTable 얼마나 빨라 졌습니까?

일부 상황에서는 JFrame을 보이지 않게 유지할 수 있습니다. (frame.setVisible) (false)를

사람이

과 같은 50 %의 이득 또는 2 %를 얻을 것 I는 성능면에서 뭔가를 얻을 것입니다 경우 (상당한 뭔가를 여부) 알고 있다면 궁금

이득 ...

그리고 어쩌면 무엇을 기대해야하는지에 대한 설명.

감사합니다.

p.s. 질문을 수정하는 또 다른 방법은 다음과 같습니다. 스윙 구성 요소가 눈에 보이지 않으면 다시 칠하기/리플 로우하지 않을만큼 충분히 똑똑합니까 ???

+0

테이블의 새로운 레코드를 추가하자 마자 사용자에게 표시해야합니까? – Cratylus

+0

아니요. 어떤 상황에서는 1 시간 또는 2 시간 동안 보이지 않게 유지할 수있어서 기쁩니다. – chacko

+0

그러면 테이블 모델을 업데이트하는 대신 레코드를 대기열에 배치 할 수 있습니다. 그런 다음 몇 초 간격 (예 : x 초 또는 분) 동안 대기열에있는 모든 정보로 테이블 모델을 새로 고칠 수 있습니다. 필자는 메모를 할 때 성능 문제가있는 경우 확실하지 않습니다. 동일한 구성 요소에 대한 일련의 다시 칠하기 요청이있을 때만 1이 마지막 요청 인 Swing에 의해 수행됩니다. – Cratylus

답변

0

그것은 각 라인 ADITION에서 다시 칠 (그리고 모델의 fireTableRowsInserted로) 호출됩니다 보인다.스크롤 구획이 scollbars를 갱신 해, 그 안에 포함되는 컴퍼넌트 (JTable)를 갱신하기 때문입니다. 테이블이 스크롤 구획 내에없는 경우는, 표시된 행만 재 묘화됩니다. 그러므로 라인이 보이지 않으면 페인트 칠을하지 않을 것입니다. Stupide. 나는 이것을 피할 방법을 찾고 있습니다.

+0

길을 찾을 수 없습니다. 삽입을 큐에 넣고 새로 고침 스레드를 사용하는 것이 가장 좋은 방법이라고 생각합니다. – Twister

1

JTable을 표시하지 않는 동안 JTable에서 TableModel을 일시적으로 연결 해제해야한다고 생각합니다.

당신이 직면 한 가장 큰 문제는 JTable이 모델 변경 이벤트에 반응하여 지속적으로 다시 칠한다는 것입니다.

JTable은 눈에 보이지 않지만 (모델 변경이 있지만) 자체적으로 다시 칠하지 못하도록 지능형 일 수도 있지만이 경우에는 돈을 넣지 않을 수도 있습니다.

+0

이것이 정말로 의문입니다 ... jtable은 눈에 보이지 않으면 스스로 다시 그리지 않을만큼 충분히 열심히 일할 것입니까? 예를 들면 – chacko

1

이 문제를 해결하는 가장 좋은 방법은이 두 가지를 테스트하는 것입니다. 두 옵션의 프로필을 작성하고 아무 이득이 없다면 솔라와 같은 다른 경로를 시도해보십시오. 응용 프로그램의 잘못된 부분을 최적화하지 않았는지 확인하십시오.

1

성능 향상에 대한 수치는 알려 드릴 수 없으며 너무 많은 요소에 따라 다르며 자신의 프로파일 링에 가장 적합합니다. 그러나 구성 요소가 표시되지 않으면 paintComponent() (또는 repaint()) 메서드가 아는 한 호출되지 않습니다.

3

회화 효율에 대한 유용한 팁이있는 Swing Painting Guidelines을 살펴보십시오. 예를 들어 :

복잡한 출력 구성 요소에

, 칠하고는() 전체 구성 요소의 원인 업데이트 필요가 단지 사각형, 인수 없음의 버전보다 오히려 을 정의 인수로 호출해야 다시 칠하기. 복잡한 출력 렌더링

구성 요소 클립 영역으로 교차하는 사람들에게 도면을 작업을 좁힐 클립 사각형의 스마트 사용할 수 있도록해야한다.

보이지 않는 구성 요소가 그려지지 않았 음을 증명하는 것도 매우 쉽습니다. 다음 코드는 패널을 숨기고 페인트가 호출되면 인쇄합니다. 당신의 JTable가 JScrollPane의에있는 경우

public static void main(String args[]) throws Exception { 
    JFrame f = new JFrame(); 
    final JPanel p = new JPanel(){ 
     public void paint(Graphics g){ 
      super.paint(g); 
      System.out.println("IN PAINT"); 
      g.fillRect(10, 10, 20, 20); 
     } 
    }; 
    f.setLayout(new BorderLayout()); 
    f.add(p, BorderLayout.CENTER); 

    JButton b = new JButton("OK"); 
    b.addActionListener(new ActionListener(){ 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      System.out.println("PRESSED"); 
      p.setVisible(!p.isVisible()); 
     } 
    }); 
    f.add(b, BorderLayout.SOUTH); 
    f.setSize(100,100); 
    f.setVisible(true); 
} 
+0

+1. 디버거를 사용하여 단계별 실행을 제안했지만이 방법은 복사하여 붙여 넣는 방법으로 수행됩니다. –

관련 문제