2016-12-20 3 views
0

스윙 응용 프로그램에서 구성 요소의 크기를 조정하기 위해 setXXXSize() 메서드를 사용하지 않으려면이 포럼 (예 :)에서 몇 가지 답변 된 질문을 읽었습니다.JScrollPane의 크기를 조정하는 모범 사례

그래서 내 문제가 생기면 JScrollPane의 크기를 조절하지 않고 크기를 늘릴 수 없도록 JScrollPane의 크기를 조정하는 방법을 알고 싶습니다.

일부 코드를 작성하기 전에 "장난감 예제"를 게시 할 것이므로 실제 상황을 설명하고 싶습니다.

내 JFrame에서 현재 콘텐츠 창에 테두리 레이아웃을 사용하고 있습니다. BorderLayout.CENTER에는 사용자 정의 페인팅을 수행하는 JPanel이 있습니다. BorderLayout.EAST에는 다른 패널 (이 패널은 BorderLayout.NORTH의 eastPanel에 추가됩니다) 및 JTable (BorderLayout.CENTER의 eastPanel에 추가됨)을 포함하는 JScrollPane에 포함 된 일부 구성 요소를 포함하는 JPanel (eastPanel)이 있습니다. 이 테이블에는 많은 행이 있습니다. eastPanel의 높이가 centerPanel의 높이와 같기 때문에 JScrollPane이 가능한 한 많은 행을 표시하려고 크기를 늘리지 않도록하는 방법이 필요합니다.

지금은 scrollpane이 포함 된 eastPanel에서 setPreferredSize를 호출하는 것과는 다른 솔루션을 찾을 수 없었지만이 솔루션을 싫어한다는 것을 인정해야합니다. 내 목적은 코드의 간단한 예제를 게시 할 때부터

이 코드 샘플에서 샘플 코드

나는, eastPanel의 북쪽과 JScrollPane의 내부에 어떤 임의의 레이블을 추가했다. 그러나 상황은 위에서 설명한 것과 매우 유사합니다. 나는이 코드 "끔찍한"라인을 사용하지 않고 내 문제를 해결할 수 없습니다 :

eastPanel.setPreferredSize(new Dimension(eastPanel.getPreferredSize().width, centerPanel.getPreferredSize().height)); 

내가 이런 간단한 상황에 더 복잡한 레이아웃을 피하기 위해 싶습니다. 내가 놓친 게 있니? 또한, 빈 경계를 허용할만한 방법으로 패널의 크기를 설정하여 사용자 정의 페인팅을 수행 할 것인가를 설정하고 있습니까?

코드 : 당신의 도움에 대한

import java.awt.*; 
import javax.swing.*; 
import javax.swing.border.EmptyBorder; 
public class Test 
{ 
    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       try {      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
        new TestFrame().setVisible(true); 
       } 
       catch(Exception exception) { 
        JOptionPane.showMessageDialog(null, "Fatal error while initialiing application", "Error", JOptionPane.ERROR_MESSAGE); 
       } 
      } 
     }); 
    } 
} 
class TestFrame extends JFrame 
{ 
    public TestFrame() { 
     super("Test"); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     JPanel pane = new JPanel(new BorderLayout(20, 0)); 
     pane.setBorder(new EmptyBorder(20, 20, 20, 20)); 
     JPanel centerPanel = new JPanel(); 
     centerPanel.setBackground(Color.WHITE); 
     centerPanel.setBorder(new EmptyBorder(400, 400, 0, 0)); 
     // centerPanel.setPreferredSize(new Dimension(400, 400)); 
     JPanel eastPanel = new JPanel(new BorderLayout(0, 20)); 
     JPanel labelsContainer = new JPanel(new GridLayout(0, 1)); 
     for(int i=0;i<7;i++) labelsContainer.add(new JLabel(String.valueOf(i))); 
     eastPanel.add(labelsContainer, BorderLayout.NORTH); 
     JPanel moreLabelsContainer = new JPanel(new GridLayout(0, 1)); 
     for(int i=7;i<70;i++) moreLabelsContainer.add(new JLabel(String.valueOf(i))); 
     JScrollPane scroll = new JScrollPane(moreLabelsContainer, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 
     eastPanel.add(scroll, BorderLayout.CENTER); 
     eastPanel.setPreferredSize(new Dimension(eastPanel.getPreferredSize().width, centerPanel.getPreferredSize().height)); 
     pane.add(centerPanel, BorderLayout.CENTER); 
     pane.add(eastPanel, BorderLayout.EAST); 
     setContentPane(pane); 
     pack(); 
     setLocationRelativeTo(null); 
    } 
} 

감사합니다!

답변

3

저는 패널의 특정 구성 요소 높이를 기준으로 패널의 높이를 제한하는 레이아웃 관리자를 알지 못합니다.

두 가지 하위 구성 요소가 포함 된 상위 패널의 동작을 사용자 지정하는 것도 한 가지 방법입니다. 이러한 접근 방식은 중앙의 구성 요소에 따라 높이를 동적으로 계산 수

@Override 
public Dimension getPreferredSize() 
{ 
    Dimension d = super.getPreferredSize(); 

    BorderLayout layout = (BorderLayout)getLayout(); 
    Component center = layout.getLayoutComponent(BorderLayout.CENTER); 

    int centerHeight = center.getPreferreidSize().height; 

    if (d.height > centerHeight) 
     d.height = centerHeight; 

    return d; 
} 

:

코드는 다음과 같을 수 있습니다.

또 다른 옵션은 나에게 레이아웃 관리자를 쓰는 것입니다. 그런 다음 레이아웃 관리자 내에서이 유형의 로직을 제어 할 수 있습니다.

또한 빈 경계선을 사용자 정의 그림을 그리기위한 패널의 크기를 설정하는 허용 가능한 방법으로 설정하고 있습니까?

적절한 치수를 반환하려면 getPreferredSize()을 덮어 씁니다.

EmptyBorder를 사용하면 실제 테두리를 패널에 추가 할 수 없으므로 권장하지 않습니다.

+0

답변 해 주셔서 감사합니다. 일부 게시물을 읽고 내가 잘못 생각, setPreferredSize 너무 "악마"로 간주되면, getPreferredSize 메서드를 재정의하는 것이 훨씬 더 좋을 않았을. 나는 당신 같은 전문 사용자로부터이 팁을 받게되어 기쁩니다! 감사합니다, 그리고 나쁜 영어로 유감 : D – Ansharja