Java 添加滚动条时,jList将消失

Java 添加滚动条时,jList将消失,java,Java,当我取消注释下面的第6行和第11行时,jList将消失 JScrollPane scrollPane = new JScrollPane(); JList list = new JList(); list.setBackground(Color.CYAN); list.setBounds(284, 22, 127, 102); frame.getContentPane().add(list); //scrollPane = new JScrollPane(list, JScrollPane.V

当我取消注释下面的第6行和第11行时,jList将消失

JScrollPane scrollPane = new JScrollPane();
JList list = new JList();
list.setBackground(Color.CYAN);
list.setBounds(284, 22, 127, 102);
frame.getContentPane().add(list);

//scrollPane = new JScrollPane(list, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
scrollPane.setVisible(true);
frame.getContentPane().add(scrollPane);
frame.getContentPane().add(textArea);
list.setVisible(true);
//scrollPane.setViewportView(list);
我看到了这个答案

将滚动窗格添加到容器中

但我不知道怎么做

以下是所有课程:

public class Form{
    private String dbDriver= "com.mysql.jdbc.Driver";
    private String dbURL= "jdbc:mysql://localhost/datas";

    private JFrame frame;
    private JTextField txtIdPers;
    private JTextField txtName;
    private JTextField txtIdToDelete;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Form window = new Form();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
    public Form() {
        initialize();
    }

    private void initialize() {

        frame = new JFrame();
        frame.setBounds(100, 100, 450, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);

        DefaultListModel listModel= new DefaultListModel();

        JScrollPane scrollPane = new JScrollPane();

        JList list = new JList();
        list.setBackground(Color.CYAN);
        list.setBounds(284, 22, 127, 102);
        frame.getContentPane().add(list);

        Button btnDisplayAll = new Button("Display All");
        btnDisplayAll.setBounds(341, 205, 70, 22);
        frame.getContentPane().add(btnDisplayAll);
        displayPersons(btnDisplayAll, textArea, list, listModel);
    }


    private void displayPersons(Button btnDisplayAll, JTextArea textArea, JList list, DefaultListModel listModel){
        btnDisplayAll.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {

                ControllerDB controller = new ControllerDB();
                controller.driver= dbDriver;
                controller.url= dbURL;

                try {
                    controller.select("*", "person", "");
                } catch (SQLException e1) {
                    e1.printStackTrace();
                }
                for(int i=0; i<controller.Selected.size();i++){

                    for(int j=0; j<controller.Selected.get(i).length; j++)
                    {
                        listModel.addElement(controller.Selected.get(i)[j]);

                    }
                    //listModel.addElement("\n");
                }
                list.setModel(listModel);
            }
        });
    }
}
公共类表单{
私有字符串dbDriver=“com.mysql.jdbc.Driver”;
私有字符串dbURL=“jdbc:mysql://localhost/datas";
私有JFrame;
私有JTextField txtIdPers;
私有JTextField txtName;
私有JTextField txtidtolete;
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
公开募捐{
试一试{
窗体窗口=新窗体();
window.frame.setVisible(true);
}捕获(例外e){
e、 printStackTrace();
}
}
});
}
公共表格(){
初始化();
}
私有void初始化(){
frame=新的JFrame();
机架立根(100450300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
DefaultListModel listModel=新的DefaultListModel();
JScrollPane scrollPane=新的JScrollPane();
JList list=新JList();
列表.背景(颜色为青色);
名单.挫折(284、22、127、102);
frame.getContentPane().add(列表);
按钮btnDisplayAll=新按钮(“全部显示”);
btnDisplayAll.挫折(341205,70,22);
frame.getContentPane().add(btnDisplayAll);
显示人员(btnDisplayAll、textArea、list、listModel);
}
私有void displayPersons(按钮btnDisplayAll、JTextArea textArea、JList list、DefaultListModel listModel){
btnDisplayAll.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件e){
ControllerDB控制器=新的ControllerDB();
controller.driver=dbDriver;
controller.url=dbURL;
试一试{
控制器。选择(“*”、“人”、”);
}捕获(SQLException e1){
e1.printStackTrace();
}

对于(int i=0;i您没有将
列表添加到
滚动窗格

scrollPane.add(list)
然后拆下那条线

frame.getContentPane().add(list);

将滚动条添加到容器中,如下所示:

JScrollPane scrollPane = new JScrollPane( panelName );
试试看

或者试试这个:

JScrollPane scrollPane = new JScrollPane(listName);
JpanelName.add(scrollPane);
getContentPane().add(JpanelName);
pack();
请记住,当添加到scrollpane的组件的首选大小大于scrollpane的大小时,会出现滚动条

也许可以尝试改用a?可能会有帮助?然后可以使用下面的代码在组件之间添加垂直空间:

JpanelName.add(Box.createVerticalStrut(200));

使用
JList()
的一种方法是针对您的问题:

import java.awt.Color;
import java.awt.Component;
import java.awt.Point;
import java.awt.PopupMenu;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;

public class ExampJList extends JFrame {

    JScrollPane scrollPane = new JScrollPane();
    DefaultListModel model = new DefaultListModel();
    JList list = new JList(model);

    public ExampJList() {
        list.setBackground(Color.CYAN);
        list.setBounds(284, 22, 127, 102);
        getContentPane().add(list);

        // You can implement different action for popup
        JPopupMenu textArea = new JPopupMenu() {
            public void show(Component invoker, int x, int y) {
                int row = list.locationToIndex(new Point(x, y));
                if (row != -1) {
                    list.setSelectedIndex(row);
                }
                super.show(invoker, x, y);
            }
        };

        list.setComponentPopupMenu(textArea);

        scrollPane = new JScrollPane(list, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        scrollPane.setVisible(true);
        list.setVisible(true);
        scrollPane.setViewportView(list);
        getContentPane().add(scrollPane);
        setSize(600, 300);
        setVisible(true);
        updater.start();
    }

    final Thread updater = new Thread() {
        @Override
        public void run() {
            for (int i = 0; i < 10; i++) {
                model.addElement(i);
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    };

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

}
导入java.awt.Color;
导入java.awt.Component;
导入java.awt.Point;
导入java.awt.PopupMenu;
导入javax.swing.DefaultListModel;
导入javax.swing.JFrame;
导入javax.swing.JList;
导入javax.swing.jpopmenu;
导入javax.swing.JScrollPane;
公共类ExampJList扩展了JFrame{
JScrollPane scrollPane=新的JScrollPane();
DefaultListModel=新的DefaultListModel();
JList列表=新的JList(型号);
公共考试列表(){
列表.背景(颜色为青色);
名单.挫折(284、22、127、102);
getContentPane().add(列表);
//您可以为弹出窗口执行不同的操作
JPopupMenu textArea=新的JPopupMenu(){
公共void显示(组件调用程序,int x,int y){
int row=list.locationToIndex(新点(x,y));
如果(行!=-1){
列表。设置选定的索引(行);
}
super.show(调用程序,x,y);
}
};
list.setComponentPopupMenu(文本区域);
scrollPane=新的JScrollPane(列表,JScrollPane.VERTICAL\u SCROLLBAR\u ALWAYS,JScrollPane.HORIZONTAL\u SCROLLBAR\u ALWAYS);
scrollPane.setVisible(true);
list.setVisible(true);
scrollPane.setViewportView(列表);
getContentPane().add(滚动窗格);
设置大小(600300);
setVisible(真);
updater.start();
}
最终线程更新程序=新线程(){
@凌驾
公开募捐{
对于(int i=0;i<10;i++){
模型.补充件(i);
试一试{
睡眠(500);
}捕捉(中断异常e){
抛出新的运行时异常(e);
}
}
}
};
公共静态void main(字符串[]args){
新的ExampJList();
}
}
执行菜单后,JFrame如下所示:

不起作用。我在本教程中做了,它起作用了,只要它在另一个类中。但在我的应用程序窗口中,我没有扩展JFrame,甚至我扩展了JFrame,也不起作用。它需要在另一个类中起作用吗?如果你需要它在该类中起作用,你想知道你的错误是什么,为什么它仍然是一个问题?也许可以尝试一下在创建滚动条之前创建列表?我检查了您的代码,您没有向滚动条添加任何内容,只是声明了它。可能值得一试。