Java(Swing):JScrollPane.setBounds()不适用?

时间:2011-03-24 16:12:46

标签: java swing size jscrollpane jlist

我正在尝试使用滚动条创建一个简单的JList,因此我需要在JScrollPane中使用JList。到现在为止还挺好。但是,出于某种原因,我无法调整JScrollPane的大小/位置!?听起来逻辑上它内部的所有内容都应该延伸到100%,所以如果我将JScrollPane设置为300px宽,那么里面的元素也是如此。这是对的吗?

当你在这里时,请批评并给我提示我是否应该改变或优化它。

无论如何,这是代码:

package train;
import java.awt.*;
import javax.swing.*;

public class GUI {

    private DefaultListModel loggerContent = new DefaultListModel();
    private JList logger = new JList(loggerContent);

    GUI() {
        JFrame mainFrame = new JFrame("title");


        this.addToLog("testing testing");
        this.addToLog("another test");


        // Create all elements
        logger = new JList(loggerContent);

        JScrollPane logWrapper = new JScrollPane(logger);
        logWrapper.setBounds(10, 10, 20, 50);


        // Add all elements
        mainFrame.add(logWrapper);


        // Show everything
        mainFrame.setSize(new Dimension(600, 500));
        mainFrame.setVisible(true);
    }

    public void addToLog(String inputString) {
        int size = logger.getModel().getSize();
        loggerContent.add(size, inputString);
    }

}

提前致谢, QWERTY

编辑:以下是正在运行的屏幕截图:http://i.stack.imgur.com/sLGgQ.png

3 个答案:

答案 0 :(得分:2)

JListsetVisibleRowCount()方法特别方便,如相关tutorial中所述。 ListDemo就是一个很好的例子。

附录:

  

请批评并给我提示......

好吧,既然你问:不要在构造函数中调用公共方法;将它们设为私有或在构造函数完成后调用它们。当add()可用时,无需查找addElement()的最后一个索引。另外,请务必在event dispatch thread 上构建GUI。

import java.awt.*;
import javax.swing.*;

/** @see http://stackoverflow.com/questions/5422160 */
public class ListPanel extends JPanel {

    private DefaultListModel model = new DefaultListModel();
    private JList list = new JList(model);

    ListPanel() {
        list.setVisibleRowCount(5);
    }

    public void append(String inputString) {
        model.addElement(inputString);
    }

    private void init() {
        for (int i = 0; i < 10; i++) {
            this.append("String " + String.valueOf(i));
        }
        JFrame mainFrame = new JFrame("GUI");
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JScrollPane jsp = new JScrollPane(list);
        mainFrame.add(jsp);
        mainFrame.pack();
        mainFrame.setVisible(true);
    }

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

            @Override
            public void run() {
                new ListPanel().init();
            }
        });
    }
}

答案 1 :(得分:1)

尝试将JScrollPane放入JPanel并将面板添加到框架中。

JPanel panel = new JPanel();
panel.add (logWrapper);
mainFrame.add(panel);

然后设置面板的边界而不是JScrollpane

panel.setBounds(10, 10, 20, 50);

问题是Swing使用布局管理器来控制子边界属性。直接将JScrollpane添加到主框架中,不允许您正确选择正确的边界。

答案 2 :(得分:1)

界限&amp;组件的大小通常会被忽略,而不是它的首选大小和容器使用的布局约束。

要解决此问题,请了解如何使用布局&amp;适当地应用它们。