我有一个JScrollPane,称之为jsp。我想用动态生成的字符串列表填充此滚动窗格。为此,我正在创建一个JPanel'窗格',并使用GridBagLayout(仅用于垂直列表)插入其中,几个扩展JPanel的MiniGUI(格式化为我希望输出看起来)。
当我加载程序时,jsp显示为空。我之前使用JTextAreas(而不是MiniGUI)以相同的方式填充它并且它工作正常,但JTextArea证明格式化很糟糕。我需要在MiniGUI(后面)中插入一些小图像,不用说使用JTextAreas是不可能的,所以我无法摆脱MiniGUI。
我似乎无法在网上找到答案,所以如果有人能提供帮助,那就太好了。 我检查了这个问题:How do I make JScrollPane work properly with nested JPanels?,但缩小MiniGUI的大小不起作用,我已经使用了revalidate。
我发布了我的代码。 JScrollPane约为250x500。
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
public class MiniGUI extends JPanel {
public MiniGUI(String str1, String str2) {
this.setLayout(null);
this.setSize(new Dimension(250, 95));
this.setVisible(true);
JLabel lbl1 = new JLabel(str1);
lbl1.setOpaque(true);
lbl1.setVerticalAlignment(SwingConstants.TOP);
lbl1.setBackground(Color.WHITE);
lbl1.setBounds(0, 0, 234, 64);
this.add(lbl1);
JLabel lbl2 = new JLabel(str2);
lbl2.setHorizontalAlignment(SwingConstants.RIGHT);
lbl2.setOpaque(true);
lbl2.setBackground(Color.WHITE);
lbl2.setVerticalAlignment(SwingConstants.TOP);
lbl2.setBounds(86, 63, 148, 21);
this.add(lbl2);
this.setBackground(Color.WHITE);
// To be set later:
// ImagePanel panel = img; //img passed as parameter, image panel is a class i made
// if (img == null)
// return;
// panel.setBounds(0, 0, 108, 89);
// this.add(panel);
}
填充滚动窗格jsp的函数:
public void fillScrollPane() {
JPanel pane = new JPanel();
GridBagLayout expLayout = new GridBagLayout();
GridBagConstraints c = new GridBagConstraints();
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 1;
c.weighty = 0;
c.gridx = 0;
c.gridy = 0;
pane.setLayout(expLayout);
ArrayList<Triplet> content = this.C2.getAL(); //C2 is another class i have, getAL returns ArrayList, Triplet is just 3 strings
for (int i = 0; i < content.size(); i += 1) {
MiniGUI x = new MiniGUI(content.get(i).first,
content.get(i).second + " " + content.get(i).third); //setVisible is in minigui class
pane.add(x, c);
pane.revalidate();
c.gridy += 1;
}
MiniGUI end = new MiniGUI("", "");
c.weighty = 1;
pane.setBackground(Color.WHITE);
pane.add(end, c);
pane.setVisible(true);
jsp.setViewportView(pane);
jsp.revalidate();
}
答案 0 :(得分:0)
1)您可以对setPreferredSize()
使用setSize()
代替MiniGUI
,因为setSize()
仅适用于空布局,但您可以在帮助中添加MiniGUI
将GridBagLayout
添加到pane
,因此请替换该代码,它将起作用。
2)不要在this.setLayout(null);
中使用MiniGUI
。尝试使用LayoutManager
,例如FlowLayout
或BorderLayout
,您的代码也将正常运作。
详细了解LayoutManager
。
对于每次添加,您都不需要revalidate()
容器,在添加所有组件时也可以这样做。