将 JScrollPane 添加到 JList
Add a JScrollPane to a JList
我有以下代码:
主要:
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){
}
}
});
}
和class 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 上,但它不想这样做。我最好的猜测是模型搞砸了,但这是一个简化版本,模型需要在那里。
您将列表添加到太多组件:添加到 JScrollPane 的视口——好的,但是 也 到 p1 JPanel——不行。仅将其添加到视口,然后将 JScrollPane 添加到 GUI(如果需要,则为 p1)。
另外:
- 不需要在构造函数和视口视图中两次将 JList 添加到 JScrollPane,一次就足够了。
list.setPreferredSize(null);
????
JScrollPane scroll = new JScrollPane(list);
您将 JList 添加到 JScrollPane 是正确的。
p1.add(list);
但随后您将 JList
添加到 JPanel, which is incorrect. A component can only have a single parent, so the
JListis removed from the
JScrollPane`。
您需要将 JScrollPane
添加到 JPanel
:
p1.add( scroll );
只需将 Scroll Pane
添加到框架而不是 List
。
使用以下代码更改您的行:
Main.frame.add(scroll);
我有以下代码: 主要:
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){
}
}
});
}
和class 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 上,但它不想这样做。我最好的猜测是模型搞砸了,但这是一个简化版本,模型需要在那里。
您将列表添加到太多组件:添加到 JScrollPane 的视口——好的,但是 也 到 p1 JPanel——不行。仅将其添加到视口,然后将 JScrollPane 添加到 GUI(如果需要,则为 p1)。
另外:
- 不需要在构造函数和视口视图中两次将 JList 添加到 JScrollPane,一次就足够了。
list.setPreferredSize(null);
????
JScrollPane scroll = new JScrollPane(list);
您将 JList 添加到 JScrollPane 是正确的。
p1.add(list);
但随后您将 JList
添加到 JPanel, which is incorrect. A component can only have a single parent, so the
JListis removed from the
JScrollPane`。
您需要将 JScrollPane
添加到 JPanel
:
p1.add( scroll );
只需将 Scroll Pane
添加到框架而不是 List
。
使用以下代码更改您的行:
Main.frame.add(scroll);