2016-02-24 2 views
1

РедактироватьScrollPane с JList в Japanel не работает

Вот ваш код, в котором projectList имеет строку слишком длинную, который должен сделать полосу прокрутки появляется. но это не так. Скорее он расширяет размер кадра

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

public class FooFrame extends JFrame { 
private JList jList; 
private String[] projectList = {"One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nineeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"}; 
private DefaultListModel listItems; 
private JScrollPane scrollpane; 

public FooFrame() { 
    JLabel lblHeading = new JLabel(
      " Demo text"); 
    JPanel mainLayout = new JPanel(); 
    mainLayout.setLayout(new BorderLayout()); 
    mainLayout.add(lblHeading, BorderLayout.NORTH); 
    jList = new JList(projectList); 

    // listItems = new DefaultListModel(); // wasted line since you don't use this 
    jList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
    scrollpane = new JScrollPane(jList, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); 
    mainLayout.add(scrollpane); 
    add(mainLayout); 
} 

private static void createAndShowGui() { 
    FooFrame frame = new FooFrame(); 
    frame.setSize(10,10); 
    frame.setResizable(false); 
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
    frame.pack(); 
    frame.setLocationByPlatform(true); 
    frame.setVisible(true); 
} 

public static void main(String[] args) { 
    createAndShowGui(); 
} 

}

Странная вещь я заметил, при попытке добавить JList в JScrollPane в Japanel. Если я попытаюсь добавить JList в JscrollPane в рамку напрямую, это делается с легкостью. Если я пытаюсь добавить то же самое, что и положить его в панель (с маской рамки), это не работает для меня.

вот пример кода

JLabel lblHeading = new JLabel(
      " Demo text"); 
    JPanel mainLayout = new JPanel(); 
    mainLayout.setLayout(new BorderLayout()); 
    mainLayout.add(lblHeading, BorderLayout.NORTH); 
    jList = new JList(projectList); 

    listItems = new DefaultListModel(); 
    jList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
    scrollpane = new JScrollPane(jList, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); 
    mainLayout.add(scrollpane); 
    add(mainLayout); 

Независимо от того, что я делаю, текст в JList выходит из рамы и скроллинга не появляется.

Любые предложения?

+0

Вы хотите создать и опубликовать небольшой, но простой полную программу, которая иллюстрирует проблему, [MCVE] (http://stackoverflow.com/help/mcve). Для получения подробной информации об этом очень полезном инструменте проверьте ссылку. –

+0

Да, пробовал с ним TT. Это не работает для меня. –

+0

@HovercraftFullOfEels, Джентльмен, его 5-6 строк кода. Я не думаю, что это может пойти короче. Мне нужно добавить JList в JscrollPane, который находится внутри JPanel. Надеюсь, это четко указывает на мою проблему. Спасибо, что ответили на мой вопрос –

ответ

1

Ваша проблема не проблема, а скорее особенность. JScrollPane - это интеллектуальный компонент и не отображает вкладки полосы прокрутки или полосы прокрутки, если они не нужны, и это происходит только тогда, когда окно просмотра JScrollPane меньше чем компонент, который он удерживает и отображает. Например, если вы искусственно ограничить размер контейнера JPanel, здесь сделано переопределение getPreferredSize(), вкладка прокрутки отображается:

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

@SuppressWarnings("serial") 
public class FooPanel extends JPanel { 
    private static final int PREF_W = 200; 
    private static final int PREF_H = 200; 
    private static final String[] PROJECT_LIST = { "One", "Two", "Three", 
      "FOURRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR" }; 
    private static final String TITLE_TEXT = "Demo Text"; 
    private JList<String> jList = new JList<>(PROJECT_LIST); 

    public FooPanel() { 
     JScrollPane scrollPane = new JScrollPane(jList); 
     scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); 

     setLayout(new BorderLayout()); 
     add(new JLabel(TITLE_TEXT, SwingConstants.CENTER), BorderLayout.PAGE_START); 
     add(scrollPane); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     Dimension superSz = super.getPreferredSize(); 
     if (isPreferredSizeSet()) { 
      return superSz; 
     } 
     int prefW = Math.min(superSz.width, PREF_W); 
     int prefH = Math.max(superSz.height, PREF_H); 
     return new Dimension(prefW, prefH); 
    } 

    private static void createAndShowGui() { 
     FooPanel mainPanel = new FooPanel(); 

     JFrame frame = new JFrame("Foo Panel"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> { 
      createAndShowGui(); 
     }); 
    } 
} 
Смежные вопросы