2010-01-05 6 views
0

그래서 아래에서 몇 가지 데모 코드를 만들었습니다.오른쪽에서 왼쪽으로의 컴포넌트 지향을위한 JInternalFrames의 JScrollPanes - Java 버그?

JScrollPane이 JInternalFrame 내에 있고 구성 요소 방향이 오른쪽에서 왼쪽으로 설정된 경우 프레임을 최소화 할 때 스크롤 막대가 내용의 왼쪽에 위치한다는 것을 알 수 있습니다. RtL로 볼 때, 스크롤 창을 내부 프레임에 추가하지 않으면 내용의 오른쪽에 머무를 것으로 예상됩니다 (두 프레임 참조 - 하나가 데모에서 다른 뒤에 표시됨).

이것은 자바 버그입니까? 아니면 무언가를하는 것을 잊었습니까? 사전에

import javax.swing.JDesktopPane; 
import javax.swing.JFrame; 
import javax.swing.JInternalFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.SwingUtilities; 
import javax.swing.UIManager; 
import javax.swing.WindowConstants; 
import java.awt.ComponentOrientation; 
import java.awt.Dimension; 


public class JScrollBarTest 
{ 
    public static void main(String[] a) 
    { 
     try 
     { 
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
     } 
     catch (Exception e) { } 

     runInternalFrameDemo(); 
     runNormalDemo(); 
    } 

    private static void runInternalFrameDemo() 
    { 
     // Frame... 
     final JFrame frame = new JFrame("Internal Frame Demo"); 
     frame.setSize(new Dimension(500, 500)); 
     frame.setLocationRelativeTo(null); 
     frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 

     // Desktop pane... 
     JDesktopPane desktopPane = new JDesktopPane(); 

     // Table... 
     JTable table = getTable(); 

     // Scroll pane... 
     JScrollPane scrollPane = new JScrollPane(); 

     // Internal frame... 
     final JInternalFrame internalFrame = new JInternalFrame("Test Internal Frame", true, true, true, true); 
     internalFrame.setSize(400, 300); 
     internalFrame.setLocation(50, 50); 
     internalFrame.setVisible(true); 

     // Add everything... 
     frame.setContentPane(desktopPane); 
     desktopPane.add(internalFrame); 
     internalFrame.setContentPane(scrollPane); 
     scrollPane.setViewportView(table); 

     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       internalFrame.applyComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); 
       frame.applyComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    private static void runNormalDemo() 
    { 
     // Frame... 
     final JFrame frame = new JFrame("Normal Demo"); 
     frame.setSize(new Dimension(500, 500)); 
     frame.setLocationRelativeTo(null); 
     frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 

     // Table... 
     JTable table = getTable(); 

     // Scroll pane... 
     JScrollPane scrollPane = new JScrollPane(); 

     // Add everything... 
     frame.setContentPane(scrollPane); 
     scrollPane.setViewportView(table); 

     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       frame.applyComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    private static JTable getTable() 
    { 
     final String[] columns = { "test 1", "test 2", "test 3", "test 4" }; 
     final Object[][] data = { { "1", "2", "3", "4" }, { "1", "2", "3", "4" } }; 
     final JTable table = new JTable(data, columns); 
     table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 
     return table; 
    } 
} 

감사 :

다음은 데모 코드입니다.

편집 : 명확성의 부족에 대한

사과 - 꽤 서두에 작성합니다.

너비가 인 테이블의 '일반 데모'(JInternalFrame에는 포함되지 않음)를 줄이면 오른쪽에서 가로 스크롤 막대가 시작되고 '내 부 프레임' 프레임 데모 '를 선택하면 왼쪽에서 가로 스크롤 막대가 시작됩니다.

아이디어가 있으십니까?

+0

스크롤 막대가 나타날 때까지 창 크기를 최소화하거나 줄이는 것에 대해 이야기하고 있습니까? 어떤 Java 버전을 사용하고 있습니까? Windows와 Java 1.6에서 예제를 시도했는데 두 스크롤바가 모두 왼쪽에 있습니다. 'applyComponentOrientation'을 제거하면 두 스크롤바가 오른쪽에 있습니다. –

+0

@Ed ... Atleast 나는 문제를 이해했다. 그것은 InternalFrame 내부에서만 발생하는 것 같아요 비록 내가 crollbar (왼쪽/오른쪽) poisitoning 어떤 문제가 될 것이라고 이해가 안 돼요. 그럼에도 불구하고 나는 그것을 들여다 볼 것이다. –

+0

여전히 재현 할 수 없습니다. 두 스크롤바는 왼쪽에서 시작합니다 ... 어떤 Java 버전을 사용합니까? –

답변

1

설명했듯이 Java 1.6에서는 내부 프레임과 표준 프레임의 동작에 차이가없는 것처럼 보입니다.

버그 "JScrollPane ignores ComponentOrientation"은 문제를 설명하지만 오랜 시간 전에 수정되었습니다.

버그 "JScrollPane does not layout properly with RTL (RIGHT_TO_LEFT)"은 여전히 ​​열려있어 문제가 발생할 수 있습니다.

문제가 약간 다르긴했지만 Sun Forums의 솔루션을 찾았습니다. 세로 스크롤 막대는 왼쪽 대신 오른쪽에 표시됩니다.

scrollPane.setLayout(new ScrollPaneLayout() { 

    @Override 
    public void layoutContainer(Container parent) { 
     JScrollPane scrollPane = (JScrollPane) parent; 
     scrollPane.setComponentOrientation(
      ComponentOrientation.LEFT_TO_RIGHT); 
     super.layoutContainer(parent); 
     scrollPane.setComponentOrientation(
      ComponentOrientation.RIGHT_TO_LEFT); 
    } 
}); 

현재 동작은 버그 (위 참조)가 수정 되었기 때문에 나에게 버그와 비슷합니다.

+0

놀랍습니다 - 도와 주셔서 감사합니다! –

0

나는 당신이 무엇을 보는지 모르겠다. 그러나 내가 본 것은 여기있다.

alt text http://dl.dropbox.com/u/3608004/jframe.png

스크롤이 (전후 최소화) 왼쪽에 두 경우 모두

, 이것은 옳은 일이다. 아랍어 (오른쪽에서 왼쪽으로)에서 스크롤 막대의 기본 위치는 왼쪽에 있습니다.