#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);