【问题标题】:How do I resize a JScrollPane within a JFrame? And how do I read from a file in Java?如何在 JFrame 中调整 JScrollPane 的大小?以及如何从 Java 中读取文件?
【发布时间】:2013-02-10 19:36:06
【问题描述】:

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

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

    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();
    }

【问题讨论】:

标签: java swing user-interface jscrollpane layout-manager


【解决方案1】:
  1. 停止呼叫(在您的余生中)setPreferredSize()。这意味着这个电话:JSPane.setPreferredSize(new Dimension(100,100)); 绝对应该被删除。
  2. 如果您想将 2 个面板并排放置并使用可拖动的分隔符:请使用 JSplitPane。如果您不想要可拖动的分隔线,请使用 JPanel 和适当的 LayoutManager(GridBagLayout 可能是一个不错的选择)
  3. 从文件中读取非常简单,只需在 SO 上进行搜索,您就会发现数百条响应。如果你想解析 csv 文件,周围有一些库可以帮助你做到这一点。最终,如果您暂时考虑将其作为应用程序,将会有一些小型纯 Java 可嵌入数据库,它们在读取/存储/搜索信息方面会比简单的文本文件做得更好。
  4. 了解 Java 命名约定并遵守它们:变量始终以小写字母开头。

【讨论】:

    【解决方案2】:

    除了@Guillaume Polet 的好advice,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();
                }
            });
        }
    }
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-19
        • 1970-01-01
        • 2015-02-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多