2015-06-16 4 views
0

У меня возникли проблемы с добавлением панели прокрутки к вложенной панели. Вот что у меня есть:Проблема с панелью прокрутки с вложенными макетами

public class board { 
    public static void addComponentsToPane(Container pane) { 
     pane.setLayout(new GridLayout(1, 0)); 

     JPanel left = new JPanel(); 
     pane.add(left); 
     left.setLayout(new BoxLayout(left, BoxLayout.Y_AXIS)); 

     JPanel leftTop = new JPanel(); 
     leftTop.setPreferredSize(new Dimension(266, 300)); 
     leftTop.setBackground(Color.black); 
     left.add(leftTop); 

     JScrollPane scrollPane = new JScrollPane(leftTop); //problem is here 
     left.add(scrollPane); 

     JButton jb = new JButton(); 
     jb.setPreferredSize(new Dimension(250,50)); 
     leftTop.add(jb); 

     JButton jb1 = new JButton(); 
     jb1.setPreferredSize(new Dimension(250,50)); 
     leftTop.add(jb1); 

     JButton jb2 = new JButton(); 
     jb2.setPreferredSize(new Dimension(250,50)); 
     leftTop.add(jb2); 

     JButton jb3 = new JButton(); 
     jb3.setPreferredSize(new Dimension(250,50)); 
     leftTop.add(jb3); 

     JButton jb4 = new JButton(); 
     jb4.setPreferredSize(new Dimension(250,50)); 
     leftTop.add(jb4); 

     JButton jb5 = new JButton(); 
     jb5.setPreferredSize(new Dimension(250,50)); 
     leftTop.add(jb5); 

     JButton jb6 = new JButton(); 
     jb6.setPreferredSize(new Dimension(250,50)); 
     leftTop.add(jb6); 

     JPanel leftBottom = new JPanel(); 
     leftBottom.setPreferredSize(new Dimension(266, 300)); 
     leftBottom.setBackground(Color.red); 
     left.add(leftBottom); 

     JPanel middle = new JPanel(); 
     pane.add(middle); 
     middle.setLayout(new BoxLayout(middle, BoxLayout.Y_AXIS)); 

     JPanel middleTop = new JPanel(); 
     middleTop.setPreferredSize(new Dimension(266, 200)); 
     middleTop.setBackground(Color.green); 
     middle.add(middleTop); 

     JPanel middleBottom = new JPanel(); 
     middleBottom.setPreferredSize(new Dimension(266, 400)); 
     middleBottom.setBackground(Color.yellow); 
     middle.add(middleBottom); 

     JPanel right = new JPanel(); 
     right.setPreferredSize(new Dimension(266, 600)); 
     right.setBackground(Color.blue); 

     pane.add(right); 
    } 

    private static void createAndShowGUI() { 
     JFrame frame = new JFrame("GridBagLayoutDemo"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     addComponentsToPane(frame.getContentPane()); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 
} 

Я просто возиться с JPanel, и я не могу показаться, чтобы добавить прокрутку в левой верхней части окна. Я думаю, что я инициализировал scrollPane правильно, но добавляю ли я его к неправильной панели?

ответ

0

Ваша первоначальная проблема здесь

leftTop.setPreferredSize(new Dimension(266, 300)); 

Это переопределение, что менеджер компоновки (FlowLayout в данном случае) иначе предоставлять JScrollPane для того, чтобы знать, как управлять видом (когда показывать например, полосы прокрутки)

Следующая проблема у вас будет, FlowLayout не будет делать то, что вы хотите. Вместо этого вы можете использовать GridLayout или, может быть GridBagLayout вместо

ExampleLayout

JPanel leftTop = new JPanel(new GridBagLayout()); 
//leftTop.setPreferredSize(new Dimension(266, 300)); 
leftTop.setBackground(Color.black); 

JScrollPane scrollPane = new JScrollPane(leftTop); //problem is here 
left.add(scrollPane); 

GridBagConstraints gbc = new GridBagConstraints(); 
gbc.gridwidth = GridBagConstraints.REMAINDER; 
gbc.fill = GridBagConstraints.HORIZONTAL; 
gbc.weightx = 1; 
gbc.insets = new Insets(5, 10, 5, 10); 
JButton jb = new JButton(); 
jb.setPreferredSize(new Dimension(250, 50)); 
leftTop.add(jb, gbc); 

JButton jb1 = new JButton(); 
jb1.setPreferredSize(new Dimension(250, 50)); 
leftTop.add(jb1, gbc); 

JButton jb2 = new JButton(); 
jb2.setPreferredSize(new Dimension(250, 50)); 
leftTop.add(jb2, gbc); 

JButton jb3 = new JButton(); 
jb3.setPreferredSize(new Dimension(250, 50)); 
leftTop.add(jb3, gbc); 

JButton jb4 = new JButton(); 
jb4.setPreferredSize(new Dimension(250, 50)); 
leftTop.add(jb4, gbc); 

JButton jb5 = new JButton(); 
jb5.setPreferredSize(new Dimension(250, 50)); 
leftTop.add(jb5, gbc); 

JButton jb6 = new JButton(); 
jb6.setPreferredSize(new Dimension(250, 50)); 
leftTop.add(jb6, gbc); 

Знаешь, если это не отвечает вашим потребностям, вам нужно будет создать пользовательский компонент, который реализует Scrollable, который позволит вам определить PreferredScrollableViewportSize, который укажет JScrollPane, какой должен быть предпочтительный размер области видимости, а не с помощью preferredSize вида

+0

Ya Мне нужно, чтобы это было прокручиваемо, следует ли хранить сетку в неподвижном состоянии, создать пользовательский компонент или вернуться к gridlayout с вложенным boxlayout и добавить пользовательский компонент. –

+0

Пример, который я сделал, по-прежнему «прокручивается», вам просто нужно изменить размер окна, чтобы он был меньше, чем предпочтительный размер. Проблема в том, что 'JScrollPane' всегда будет желать быть предпочтительным размером контейнера, поэтому причина, о которой я упомянул:« Scrollable » – MadProgrammer

+0

А-а-а-а-а-а-а-а-а-а-а-а-а-а-а-а-а-а. –

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