我有一个我在代码中动态填充的scrollPane。问题是我不能让它在范围内扩大。
我已经尝试了很多我可以在网上找到的提示,但没有任何东西能让它出现。
我正在循环使用10个组件,但大小始终保持不变。
B = new JScrollPane();
B.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
B.setViewportBorder(null);
B.setBounds(12, 53, 330, 400);
//making the scrollPane
loadArtists(country);
// loading the method with the content
contentPane.add(B);
// the content method
public void loadArtists(String country){
ArrayList<Artist> top10A = Methods.getTopArtist(country); // top atrister
B.removeAll();
String [] genre =Methods.getGenreArtist(country);
Component2[] comp = new Component2[10]; // skriv ut infohållare
for (int i = 0; i < top10A.size(); i++) {
comp[i] = new Component2(this);
comp[i].setBounds(0, 0, 327, 68);
comp[i].setLocation(0, 0 + space2);
ImageIcon[] panel= new ImageIcon[10];
int lyssnare = top10A.get(0).getListeners();
try {
URL url2 = new URL((top10A.get(i).getImageURL(ImageSize.valueOf("MEDIUM"))));
panel[i]= new ImageIcon(url2);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
panel[i]= new ImageIcon(GUI.class.getResource("/bilder/super.jpg"));
e.printStackTrace();
}
comp[i].setInfo(panel[i],top10A.get(i).getListeners(), top10A.get(i).getName().toString(), String.valueOf(i+1),genre[i],lyssnare,"");
B.add(comp[i]);
space2 = space2 + 75;
//B.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
B.repaint();
}
}
好的,这就是我在。我会得到卷轴,但它只让我滚动1毫米。如果我删除setBounds,整个滚动窗格就会消失。我不知道如何解决它。对不起,如果我有点蠢,但这是我的第一个“真正的程序”:
scroll1 = new JScrollPane();
scroll1.setViewportBorder(null);
scroll1.setBounds(12, 53, 330, 400);
setComponents = new JPanel();
contentPane.add(scroll1);
scroll1.setViewportView(setComponents);
GroupLayout gl_testP = new GroupLayout(setComponents);
gl_testP.setHorizontalGroup(
gl_testP.createParallelGroup(Alignment.LEADING)
.addGap(0, 307, Short.MAX_VALUE)
);
gl_testP.setVerticalGroup(
gl_testP.createParallelGroup(Alignment.LEADING)
.addGap(0, 398, Short.MAX_VALUE)
);
setComponents.setLayout(gl_testP);
loadArtists(country);
public void loadArtists(String country){
ArrayList<Artist> top10A = Methods.getTopArtist(country); // top atrister
setComponents.removeAll();
String [] genre =Methods.getGenreArtist(country);
Component2[] comp = new Component2[10]; // skriv ut infohållare
for (int i = 0; i < top10A.size(); i++) {
comp[i] = new Component2(this);
comp[i].setBounds(0, 0, 327, 68);
comp[i].setLocation(0, 0 + space2);
ImageIcon[] panel= new ImageIcon[10];
int lyssnare = top10A.get(0).getListeners();
try {
URL url2 = new URL((top10A.get(i).getImageURL(ImageSize.valueOf("MEDIUM")))); // skapa array av artist bilder
panel[i]= new ImageIcon(url2);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
panel[i]= new ImageIcon(GUI.class.getResource("/bilder/super.jpg"));
e.printStackTrace();
System.out.println(panel[i]+" "+"saknar bild");
}
comp[i].setInfo(panel[i],top10A.get(i).getListeners(), top10A.get(i).getName().toString(), String.valueOf(i+1),genre[i],lyssnare,"");
setComponents.add(comp[i]);
space2 = space2 + 75;
scroll1.setViewportView(setComponents);
//B.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
setComponents.repaint();
}
}
行。所以我“修理”了它。
setComponents.setPreferredSize(new Dimension(1,750));
它不是最佳的,因为它不会让我动态增长内容。 但是,当我不需要超过10个组件循环时,这并没有真正起作用。
答案 0 :(得分:4)
B.setBounds(12, 53, 330, 400);
不要在组件上使用setBounds()方法。
Swing旨在与布局管理器一起使用。添加到滚动窗格的组件的首选大小大于滚动窗格的大小时,滚动条将自动出现。布局管理员会为您执行这些计算。
有关更多信息和示例,请参阅Using Layout Managers上Swing教程中的部分。
答案 1 :(得分:3)
除了Rob Camick给出的好建议之外,您还要直接删除所有组件并尝试直接向JScrollPane添加组件,而忽略JViewport不应该被混淆,并且可视化组件需要添加到JScrollPane的视口,而不是JScrollPane本身。
因此,您可以通过将组件传递到JScrollPane的构造函数中来将组件添加到JScrollPane的视口中,或者如果要交换它所持有的视图,则可以调用JScrollPane的setViewportView(...)
方法。
顺便说一下,请尝试使用更好的变量名,符合Java命名标准的名称(例如变量名称应以小写字母开头),以及使代码自我评论有意义的名称。变量名称B不符合这些建议中的任何一个。
此外,您的整个计划都缺乏体面的布局管理器。您似乎希望向JScrollPane添加多个组件。考虑创建一个由JScrollPane的视口保存的JPanel,为其提供适当的布局,可能是GridLayout(....)并将多个组件添加到此JPanel。
有关更具体和信息量更高的帮助,请考虑创建和发布SSCCE。