繁体   English   中英

如何在JFrame中调整JScrollPane的大小? 以及如何从Java文件读取?

[英]How do I resize a JScrollPane within a JFrame? And how do I read from a file in Java?

我有一个歌曲库,我希望此选择列表仅位于窗口的左侧,因为我想将有关歌曲的其他信息放在右侧。 我不确定如何更改JFrame内部的JScrollPane的大小。

在这个库中,我希望能够将文件中存储的歌曲导入到我的歌曲库中。 现在,我的代码中有一个数组,但是我希望能够从文本文件中读取而不是使用这种方法。 在文件中,我希望能够存储有关歌曲的艺术家和专辑信息,但是我不希望它显示在歌曲列表中。

    String songs[] = {"Song1", "Song2", "Song3", "Song4", "Song5"};
    JList list = new JList(songs);

    public SongLib(){

        JFrame songLibrary = new JFrame("Song Library");
        songLibrary.setLocationRelativeTo(null);
        songLibrary.setResizable(true);
        songLibrary.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

        list.addListSelectionListener(new ListSelectionListener(){
            public void valueChanged(ListSelectionEvent evt){
                int i = list.getSelectedIndex();
                if (i != -1)
                    System.out.println("Selected: " + songs[i]);
                else
                    System.out.println("Choose a song");    
            }
        });

        JScrollPane JSPane = new JScrollPane(list);
        JSPane.setPreferredSize(new Dimension(100,100));
        songLibrary.add(JSPane);
        songLibrary.setSize(400,400);
        songLibrary.setVisible(true);
    }

    public static void main(String[] args){
        new SongLib();
    }
  1. 停止调用(余生) setPreferredSize() 表示此调用: JSPane.setPreferredSize(new Dimension(100,100)); 应该删除。
  2. 如果要并排放置两个带有可拖动分隔符的面板,请使用JSplitPane 如果您不希望使用可拖动的分隔线,请使用带有适当LayoutManagerJPanelGridBagLayout可能是一个不错的选择)
  3. 从文件读取非常容易,只需在SO上进行搜索,您就会发现数百个响应。 如果您想解析csv文件,则周围有一些库可以帮助您做到这一点。 最终,如果您考虑使它成为一种应用程序,那么有一些小型的纯Java可嵌入式数据库将比简单的文本文件在读取/存储/搜索信息方面做得更好。
  4. 学习Java命名约定并遵守这些约定:变量始终以小写字母开头。

除了@Guillaume Polet的好建议之外setVisibleRowCount()可能对您将来很有用。

图片

import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

/** @see https://stackoverflow.com/a/14801908/230513 */
public class SongLib {

    String songs[] = {"Song1", "Song2", "Song3", "Song4", "Song5"};
    JList list = new JList(songs);

    public SongLib() {

        JFrame songLibrary = new JFrame("Song Library");
        songLibrary.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        list.setVisibleRowCount(4);
        list.addListSelectionListener(new ListSelectionListener() {

            @Override
            public void valueChanged(ListSelectionEvent evt) {
                int i = list.getSelectedIndex();
                if (i != -1) {
                    System.out.println("Selected: " + songs[i]);
                } else {
                    System.out.println("Choose a song");
                }
            }
        });

        JScrollPane JSPane = new JScrollPane(list);
        songLibrary.add(JSPane);
        songLibrary.pack();
        songLibrary.setLocationRelativeTo(null);
        songLibrary.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new SongLib();
            }
        });
    }
}

对于1.,请看一下Java中的布局,尤其是GridBagLayout。 http://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html

对于2:使用文件对象和Inout / Output-Streams进行文件读写。 但这是一个非常低级的方法。 我认为您应该考虑使用XML文件。 看看JAXB

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM