【问题标题】:JScrollPane isn't displayedJScrollPane 不显示
【发布时间】:2013-06-04 20:20:29
【问题描述】:
String test[] = {"1", "2", "3", "4", "5", "6", "7", "75" };
    list = new JList(test);
    list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    list.setLayoutOrientation(JList.VERTICAL);
    list.setVisibleRowCount(5);
    list.setLocation(50,159);
    list.setSize(50, 100);

    JScrollPane jScrollPane1= new JScrollPane();
    jScrollPane1.setViewportView(list);

    add(jScrollPane1);

编辑:如你们所说,更新了我的代码。还是不行:(

所以这基本上是我在这个列表中的全部代码。当我运行程序时,您可以看到列表。但是你只能看到前 5 个数字,不能滚动或类似的东西。我知道,显示前 5 个数字是有意的。

那么没有滚动条我做错了什么?

顺便说一句,我用谷歌搜索了很多年,所以不要给出这么烦人的答案......

感谢阅读和帮助我^^

【问题讨论】:

  • 为什么要添加两次列表?最初在滚动窗格中,然后再次作为普通列表?
  • 尝试删除这个add(list);
  • 当我删除这部分( add(list); )它完全消失了。您看不到滚动条和列表。
  • 后面的“add”其实是把列表添加到我认为的容器中

标签: java swing jscrollpane jlist


【解决方案1】:

如果没有进一步的证据,您似乎正在放弃使用布局管理器(或使用错误的)。

JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout()); // This is the default layout, but I added it as an example

String test[] = {"1", "2", "3", "4", "5", "6", "7", "75" };
list = new JList(test);
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
list.setLayoutOrientation(JList.VERTICAL);
list.setVisibleRowCount(5);

JScrollPane jScrollPane1= new JScrollPane()
jScrollPane1.setViewportView(jList1);
add(jScrollPane1);// add to the contentPane
frame.pack();// Size the frame.

布局管理器为您的应用程序提供重要支持,并克服了大多数 UI 开发人员面临的几乎任何语言的最烦人和最耗时的问题;简单地扔掉它们是一个非常糟糕的主意,不应该如此轻易地这样做。

很容易认为你可以没有它们;但是当您的 UI 变得复杂并且您希望支持可调整大小的窗口(并且在处理滚动窗格时,您应该)时,布局管理器将挽救您的生命。

【讨论】:

    【解决方案2】:

    试试这个

    JScrollPane jScrollPane1= new JScrollPane()
    jScrollPane1.setViewportView(jList1);
    getContentPane().setLayout(null);// here u specify layout put the layout what u want
    getContentPane().add(jScrollPane1);// add to the contentPane
    jScrollPane1.setBounds(126, 63, 100, 100);// here we set coordinates x, y width height cause we have null layout
    pack();// Size the frame.
    

    注意您应该始终提供一个 layoutManager

    所以你不必设置边界“硬编码”

    JScrollPane jScrollPane1= new JScrollPane()
    jScrollPane1.setViewportView(jList1);
    setLayout(new BorderLayout());
    add(jScrollPane1);// add to the frame
    pack();// Size the frame.
    

    另外一个好的做法是使用顶级容器添加到框架,例如,你可以使用 JPanel

    setLayout(new BorderLayout());
    JPanel panel = new JPanel();
    panel.setLayout(new VerticalLayout()); // this layout is in swingx package
    JScrollPane jScrollPane1= new JScrollPane()
    jScrollPane1.setViewportView(jList1);
    setLayout(new BorderLayout());
    panel.add(jScrollPane1);// add to the frame
    add(panel);
    pack();// Size the frame.
    

    【讨论】:

    • 我认为你在另一部分有不好的地方..我把那个代码放在一个 ide 中并为我工作
    • :D .. 可能你不应该直接将 scrollPane 添加到 Frame 中,而是将 scrollPane 添加到 Panel 和 Panel 到 Frame,所以你有一个框架,你可以在需要时更改面板;)
    • 建议删除布局管理器是不明智的,只会导致更多问题。布局管理器提供了一项重要的工作,并解决了一些非常常见和重要的问题,即使这是 OP 开始做的事情,将它们丢弃是一个坏主意。我还应该添加该包会将框架调整为顶级组件的组合首选大小,您现在已经忽略了
    • 是的,这就是为什么我放“放你想要的布局”
    • 然后你去使用了 setBounds。您应该已经演示了如何使用适当的(且简单的)布局管理器。由于该操作已经在使用 setLocation 和 setSize,因此建议不要非常特别 - 恕我直言
    【解决方案3】:

    我将它作为一个测试应用程序进行了尝试(它完全符合 nachokk 的建议),我得到了一个运行良好的滚动面板

    package seronis.testing;
    
    import java.awt.Dimension;
    
    import javax.swing.JFrame;
    import javax.swing.JList;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.ListSelectionModel;
    import javax.swing.SwingUtilities;
    
    @SuppressWarnings("serial")
    public class FrameTest extends JFrame {
    
        public FrameTest(String string) {
            super(string);
            JPanel panel = new JPanel();
            panel.setPreferredSize(new Dimension(800,600));
    
            String test[] = {"alpha", "bravo", "charlie", "delta", "echo", "omega", "zeta" };
            JList list = new JList(test);
            list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
            list.setLayoutOrientation(JList.VERTICAL);
            list.setVisibleRowCount(5);
            list.setBounds(50, 150, 75, 90);
    
            JScrollPane jScrollPane1= new JScrollPane();
            jScrollPane1.setViewportView(list);
    
            panel.add(jScrollPane1);
    
            this.add(panel);
            this.pack();
            this.setDefaultCloseOperation(EXIT_ON_CLOSE);
            this.setResizable(false);
            this.setFocusable(true);
            this.setLocationRelativeTo(null);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    JFrame frame = new FrameTest("Quick Test");
                    frame.setVisible(true);
                }
            });
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-02
      • 1970-01-01
      相关资源
      最近更新 更多