JScrollPane包含JPanel,其中包含动态生成的较小面板 - 显示为空

时间:2013-12-03 13:13:03

标签: java swing jpanel jscrollpane

我有一个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();
}

1 个答案:

答案 0 :(得分:0)

1)您可以对setPreferredSize()使用setSize()代替MiniGUI,因为setSize()仅适用于空布局,但您可以在帮助中添加MiniGUIGridBagLayout添加到pane,因此请替换该代码,它将起作用。

2)不要在this.setLayout(null);中使用MiniGUI。尝试使用LayoutManager,例如FlowLayoutBorderLayout,您的代码也将正常运作。

详细了解LayoutManager

对于每次添加,您都不需要revalidate()容器,在添加所有组件时也可以这样做。