2014-07-12 2 views
2

북부 패널에 JSlider이 하나만있는 매우 단순한 JFrame입니다. JSlider를 다음과 같은 방법으로 최소 크기로 표시하고 싶습니다.JSlider가 최소 크기로 표시되지 않습니다

slider.putClientProperty("JComponent.sizeVariant", "mini"); 

그러나 여전히 정상적인 크기로 표시됩니다. 트릭을 따르는 것도 효과가 없습니다.

SwingUtilities.updateComponentTreeUI(this); 

다음은 전체 프로그램입니다.

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

public class TestSliderSize extends JFrame { 

    public TestSliderSize() { 
     setLookNFeel(); 
     Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 
     this.setSize(screenSize.width/2, screenSize.height/2); 
     JSlider slider = new JSlider(SwingConstants.HORIZONTAL, 0, 50, 10); 
     slider.putClientProperty("JComponent.sizeVariant", "mini"); 
     slider.setMajorTickSpacing(10); 
     slider.setMinorTickSpacing(1); 
     slider.setPaintTicks(true); 
     slider.setPaintLabels(true); 

      //SwingUtilities.updateComponentTreeUI(this); 
     getContentPane().setLayout(new BorderLayout()); 
     JPanel centerPanel = new JPanel(new BorderLayout()); 

     JPanel northPanel = new JPanel(new FlowLayout()); 
     Dimension d1 = centerPanel.getSize(); 
     northPanel.setPreferredSize(new Dimension(screenSize.width/2, 100)); 
     northPanel.add(slider); 
     northPanel.setBackground(Color.BLACK); 
     centerPanel.add(northPanel, BorderLayout.NORTH); 

     JPanel innerPanel = new JPanel(); 
     innerPanel.setBackground(Color.ORANGE); 
     centerPanel.add(innerPanel, BorderLayout.CENTER); 

     SwingUtilities.updateComponentTreeUI(this); 

     getContentPane().add(centerPanel, BorderLayout.CENTER); 
     this.setVisible(true); 

    } 

    public static void main(String[] args) { 

     new TestSliderSize(); 
    } 

    private void setLookNFeel() { 
     try {    // UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 

      for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) { 
       if ("Nimbus".equals(info.getName())) { 
        UIManager.setLookAndFeel(info.getClassName()); 
        break; 
       } 
      } 
     } catch (Exception e1) { 
     } 
    } 
} 

이제 최소 크기로 슬라이더를 배치하는 데 도움이 필요합니다.

+1

기본적인 크기와 최소 크기의 차이는 무엇입니까? 나는 네가 기대하는 것을 얻지 못한다. 최소 크기는 일반적인 크기이며, 선호하는 크기인데 코드에서 발생하는 것입니다 –

+1

그리고 질문 제목이 JScrollPane을 말하는 이유는 무엇입니까? 귀하의 설명이나 귀하의 코드에서 JScrollPane에 대한 언급이 보이지 않습니다. –

+1

그것은 그것을 정정 한 실수였습니다. – user3741146

답변

2

여기의 키는 pack()으로 둘러싸여 있으며, 구성 요소가 preferred sizes을 채택하도록 Window을 포함합니다. innerPanel에는 효과를 설명하기 위해 임의의 크기가 지정되었습니다. Initial Threads을 참조하십시오.

image

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

public class TestSliderSize extends JFrame { 

    public TestSliderSize() { 
     this.setDefaultCloseOperation(EXIT_ON_CLOSE); 

     JSlider slider = new JSlider(SwingConstants.HORIZONTAL, 0, 50, 10); 
     slider.putClientProperty("JComponent.sizeVariant", "mini"); 
     slider.setMajorTickSpacing(10); 
     slider.setMinorTickSpacing(1); 
     slider.setPaintTicks(true); 
     slider.setPaintLabels(true); 

     JPanel centerPanel = new JPanel(new BorderLayout()); 
     JPanel northPanel = new JPanel(); 
     northPanel.add(slider); 
     northPanel.setBackground(Color.BLACK); 
     centerPanel.add(northPanel, BorderLayout.NORTH); 
     JPanel innerPanel = new JPanel() { 

      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(200, 100); // arbitrary size 
      } 
     }; 
     innerPanel.setBackground(Color.ORANGE); 
     centerPanel.add(innerPanel, BorderLayout.CENTER); 
     this.add(centerPanel, BorderLayout.CENTER); 

     this.pack(); 
     this.setLocationRelativeTo(null); 
     this.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new TestSliderSize(); 
      } 
     }); 
    } 
} 
관련 문제