Добавление JScrollPane в JList

#java #swing #user-interface #jscrollpane #jlist

#java #качать #пользовательский интерфейс #jscrollpane #jlist

Вопрос:

У меня есть следующий код: Main:

 package PackageMain;

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.WindowConstants;

public class Main {

public static JFrame frame = new JFrame("Window");
public static PanelOne p1;
public static PanelTwo p2;

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
                frame.setBounds(100, 100, 800, 600);
                p1 = new PanelOne();
                p2 = new  PanelTwo();
                frame.setVisible(true);
            } catch(Exception e){

            }
        }
    });
}
  

И класс 2:

 package PackageMain;

import java.awt.Color; 
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.DefaultListModel;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class PanelOne{

public PanelOne(){
    loadScreen();
}

public void loadScreen(){
    JPanel p1 = new JPanel();
    DefaultListModel model = new DefaultListModel<String>();
    JList list = new JList<String>(model);
    //
    JScrollPane scroll = new JScrollPane(list);
    list.setPreferredSize(null);
          scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS;
    scroll.setViewportView(list);
    //
    list.addListSelectionListener(new ListSelectionListener() {
        public void valueChanged(ListSelectionEvent arg0) { 
            System.out.println("You selected "   list.getSelectedValue());
        }
    });
    p1.add(list);
    Main.frame.add(p1);
    Main.frame.revalidate();
    Main.frame.repaint();
    for (int i = 0; i < 100; i  ){
        model.addElement("test");
    }
}
  

Я перепробовал кучу всего, чтобы заставить JScrollPane отображаться в JList, но он этого не хочет. Мое лучшее предположение заключается в том, что модель все портит, но это упрощенная версия, и модель должна быть там.

Ответ №1:

 JScrollPane scroll = new JScrollPane(list);
  

Вы добавляете JList в JScrollPane, который является правильным.

 p1.add(list);
  

Но затем вы добавляете JList в , which is incorrect. A component can only have a single parent, so the JList is removed from the JPanel JScrollPane`.

Вам нужно добавить JScrollPane в JPanel :

 p1.add( scroll );
  

Ответ №2:

Вы добавляете список к слишком большому количеству компонентов: в окно просмотра JScrollPane — ОК, но также в JPanel p1 — не ОК. Добавьте его только в окно просмотра, а затем добавьте JScrollPane в графический интерфейс пользователя (p1, если необходимо).

Также:

  • Нет необходимости добавлять JList в JScrollPane дважды, в конструкторе и в окне просмотра, как вы делаете, достаточно одного раза.
  • list.setPreferredSize(null); ????

Ответ №3:

Просто добавьте Scroll Pane в фрейм, а не в List .

измените свою строку с помощью приведенного ниже кода:

 Main.frame.add(scroll);