[英]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中。
可能的解决方案:
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.