繁体   English   中英

Java Swing JScrollPane包含更多Panes而不是滚动?

[英]Java Swing JScrollPane Containing more Panes not Scrolling?

对不起,如果这是一个愚蠢的问题,我对Java swing UI很新。 我正在尝试开发一个程序来获取我的Steam成就,并且我有基本代码,但现在我想为它创建一个UI。

以下代码是UiHandler类,还有许多其他代码,但它们与此问题无关。 这个类基本上只给出了两个对话框,询问用户和应用程序ID,然后应该给出一个包含所有成就和值的滚动框。 相反,列表离开屏幕没有任何滚动选项。

问题是我的scrollPanel(在mainPanel内)似乎没有滚动(它的侧面没有滚动条,滚轮没有任何作用)。 我希望scrollPanel的内容(它是面板,具有存储在Map中的所有成就的列表)将滚动。

这是我第一次使用滚动面板,所以我真的不知道我在做什么....

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.WindowEvent;
import java.util.Iterator;
import java.util.Map;

import javax.swing.*;

@SuppressWarnings("serial")
public class UserInterface extends JFrame {

public UserInterface() {
    initUI();
}

@SuppressWarnings("unchecked")
private void initUI() {

    UserInteractionHandler uiHandler = new UserInteractionHandler();

    setTitle("Steam Stats");
    setSize(500, 400);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(DISPOSE_ON_CLOSE);

    JPanel panel = new JPanel(new GridLayout(0, 1));

    JLabel header = new JLabel("Steam Stats", SwingConstants.CENTER);
    header.setFont(new Font("trebuchet ms", Font.BOLD, 20));
    panel.add(header);


    String userId = JOptionPane.showInputDialog("Steam ID 64");
    String appId = JOptionPane.showInputDialog("App Id of Game");

    Map<String, Integer> allAchievements = uiHandler.getAllAchievements(appId, userId);

    @SuppressWarnings("rawtypes")
    Iterator it = allAchievements.entrySet().iterator();
    while (it.hasNext()) {
        Map.Entry<String, Integer> pair = (Map.Entry<String, Integer>) it.next();

        JLabel key = new JLabel(pair.getKey());
        JLabel value = new JLabel(pair.getValue().toString());
        panel.add(key);
        panel.add(value);

        it.remove();
    }

    JScrollPane scrollPanel = new JScrollPane(panel);

    JPanel mainPanel = new JPanel(new GridLayout(0, 1));
    mainPanel.add(scrollPanel);

    getContentPane().add(mainPanel, BorderLayout.NORTH);



}

public static void runUi() {

    EventQueue.invokeLater(new Runnable() {
        public void run() {
            UserInterface ui = new UserInterface();
            ui.setVisible(true);
        }
    });
}
}

以下是此窗口的屏幕截图: http//puu.sh/jVsto/4a4bcbdf6e.png

谢谢你的帮助。

您的问题是您正在添加JScrollPane BorderLayout.NORTH,并且正在设置GUI的大小。 这会将GUI限制为一定的大小,但不会限制BorderLayout.NORTH组件的大小,因此它将显示JScrollPane视口的整个内容所需的大小,而不管是否在一个小的GUI中。

可能的解决方案:

  • 如果您将JScrollPane添加到BorderLayout.CENTER位置,它实际上会起作用。
  • 如果可能,您将希望避免设置任何尺寸。
  • 您可以约束JScrollPane视口的preferredSize
  • 我最喜欢的解决方案:使用JScrollPane中的JList显示您的数据,并通过setVisibleRowCount(...)指定列表的可见行数。

例如:

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.WindowEvent;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import javax.swing.*;

@SuppressWarnings("serial")
public class UserInterface extends JFrame {

    public UserInterface() {
        initUI();
    }

    @SuppressWarnings("unchecked")
    private void initUI() {

        UserInteractionHandler uiHandler = new UserInteractionHandler();

        setTitle("Steam Stats");
        // !! setSize(500, 400);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);

        JPanel panel = new JPanel(new GridLayout(0, 1));

        JLabel header = new JLabel("Steam Stats", SwingConstants.CENTER);
        header.setFont(new Font("trebuchet ms", Font.BOLD, 20));
        panel.add(header);

        String userId = JOptionPane.showInputDialog("Steam ID 64");
        String appId = JOptionPane.showInputDialog("App Id of Game");

        Map<String, Integer> allAchievements = uiHandler.getAllAchievements(
                appId, userId);

        DefaultListModel<MyPair> listModel = new DefaultListModel<>();
        JList<MyPair> pairList = new JList<>(listModel);
        pairList.setCellRenderer(new MyPairRenderer());
        pairList.setVisibleRowCount(20);

        @SuppressWarnings("rawtypes")
        Iterator it = allAchievements.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry<String, Integer> pair = (Map.Entry<String, Integer>) it
                    .next();

            MyPair myPair = new MyPair(pair.getKey(), pair.getValue());
            listModel.addElement(myPair);

            it.remove();
        }

        //!! JScrollPane scrollPanel = new JScrollPane(panel);
        JScrollPane scrollPanel = new JScrollPane(pairList);

        JPanel mainPanel = new JPanel(new BorderLayout());
        mainPanel.add(header, BorderLayout.PAGE_START);
        mainPanel.add(scrollPanel);

        getContentPane().add(mainPanel, BorderLayout.PAGE_START);
        pack(); // !!

    }

    public static void runUi() {

        EventQueue.invokeLater(new Runnable() {
            public void run() {
                UserInterface ui = new UserInterface();
                ui.setVisible(true);
            }
        });
    }

    public static void main(String[] args) {
        UserInterface.runUi();
    }
}

class MyPair {
    private String name;
    private int value;
    public MyPair(String name, int value) {
        this.name = name;
        this.value = value;
    }

    public String getName() {
        return name;
    }

    public int getValue() {
        return value;
    }

}

class MyPairRenderer implements ListCellRenderer<MyPair> {
    private JPanel panel = new JPanel(new GridLayout(1, 2, 5, 5));
    private JLabel nameLabel = new JLabel();
    private JLabel valueLabel = new JLabel();

    public MyPairRenderer() {
        panel.add(nameLabel);
        panel.add(valueLabel);
    }

    @Override
    public Component getListCellRendererComponent(JList<? extends MyPair> list,
            MyPair value, int index, boolean isSelected, boolean cellHasFocus) {
        if (value != null) {
            nameLabel.setText(value.getName());
            valueLabel.setText("" + value.getValue());
        }
        return panel;
    }

}

暂无
暂无

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

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