2016-04-22 3 views
0

У меня есть следующая часть кода:Java JScrollPane иногда не удается изменить размер

final JList<String> list = new JList<String>(strings); 
    list.setLayoutOrientation(JList.VERTICAL); 
    list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 

    /* Create scroll pane instance */ 
    JScrollPane scroll = new JScrollPane(list) { 
     @Override 
     public Dimension getPreferredSize() 
     { 
      BookFrame frame = BookFrame.instance(); 

      Container parent = getParent(); 

      return new Dimension(frame.getWidth(), parent.getHeight() - parent.getComponent(parent.getComponentCount() - 1).getHeight() - 14); 
     } 
    }; 

    /* Create button instance */ 
    JButton button = new JButton("Add Directory"); 

    /* Add new panel */ 
    JPanel panel = new JPanel(); 
    panel.add(scroll); 
    panel.add(button); 

Этот код работает, когда программа запускается, а иногда высота кнопки нормальное значение (например, 15). Но иногда это 0. Я думаю, проблема связана с экземпляром JScrollPane - он был создан до экземпляра JButton, но я не могу синхронизировать. Я также попытался добавить JButton button = ... до JScrollPane scroll = ..., но он тоже не работает.

Я новичок на Java, поэтому, пожалуйста, скажите мне, что я делаю неправильно.

ответ

2

Я не вижу причин, по которым вам необходимо переопределить метод getPreferredSize(). Я предполагаю, что это проблема.

JScrollPane scroll = new JScrollPane(list) 

Я не знаю, что «список» есть, но предполагает, что вы используете JList, то вы можете использовать:

list.setVisibleRowCount(...); 

, чтобы указать количество строк для размера списка. Тогда прокрутка будет таким размером, и полосы прокрутки появятся, если потребуется.

+0

Но как я могу изменить размер моей 'JScrollPane' динамически? Как это сделать с помощью 'setVisibleRowCount (...)'? – ventaquil

+0

@ventaquil. Любой компонент, добавленный в CENTER JFrame, будет динамически изменяться по мере изменения размера кадра. SetVisibleRowCount() - это предложение, когда вы используете метод pack(). Прочтите раздел из учебника Swing [Как использовать BorderLayout] (http://docs.oracle.com/javase/tutorial/uiswing/layout/border.html) для получения дополнительной информации и рабочих примеров. Загрузите – camickr

+0

okay - проблема с 'JPanel'. Когда я добавляю прокрутку 'getContentPane(). Add (..)' method' setVisibleRowCount (..) 'работает хорошо. Благодаря :) – ventaquil

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