IntelliJ IDEA - JScrollpane中的JPanel没有显示任何内容

时间:2015-06-28 10:18:28

标签: java swing intellij-idea jframe


我有一个JScrollPane需要填充来自数据库的数据。 面板采用IntelliJ IDEA制造。

public class NodeViewer extends JFrame {
private NodeManager _manager;
private JScrollPane _container;

public NodeViewer(NodeManager manager) {
    setVisible(false);
    pack();
    setContentPane(_container);
    setSize(new Dimension(1000, 700));
    setLayout(new ScrollPaneLayout());
    _manager = manager;
}

public void LoadData() {
    _container.removeAll();
    LoadNodes(_manager.GetAllNodes());
}

private void LoadNodes(List<Object> nodes) {
    for (int i = 0; i < nodes.size(); i++) {

        JPanel newPanel = new NodePanel((INode) nodes.get(i), i);
        getContentPane().add(newPanel);
    }
}

这是滚动窗格,它将为每次迭代创建一个NodePanel,并将其添加到滚动窗格。

public class NodePanel extends JPanel {
private JPanel _nodeContainer;
private JLabel _personName;
private JLabel _albumName;
private JLabel _bandName;
private JLabel _memberSince;
private JLabel _personBirth;
private JLabel _releasedOn;
private JButton _deletePerson;
private JButton _deleteBand;
private JButton _deleteAlbum;

public NodePanel(INode node, int i) {
    setVisible(true);
    setBounds(150, (i * 250) + (i * 25), 700, 250);
    setSize(new Dimension(700, 250));
    setLayout(new GridLayout());
    setBackground(Color.BLUE);
    SetContent(node);
}

节点面板扩展了JPanel。

面板本身已创建:http://gyazo.com/6e55dc85c177f8599f16d3bdbeb6c36e,如屏幕截图所示。但是内容是不可见的。 NodePanel中的所有JLabel都由setText()设置。

我试图重新粉刷,重新验证几乎所有东西,但我似乎无法找到问题所在。我也尝试了不同的布局类型,但这似乎并不重要。

1 个答案:

答案 0 :(得分:2)

几点

  • public class NodeViewer extends JFrame {,不要扩展JFrame,将此Obejct创建为本地变量(就像private NodeManager _manager;一样)

代码排序非常重要,例如

  • JFrame.setVisible(false);,为什么可见性设置为false,而JFrame.setVisible(true);此代码行应该是public NodeViewer(NodeManager manager) {

    中的最后一个代码行
  • JFrame.pack();应位于代码行JFrame.setVisible(true);之前,此代码行即将来自第一级getPrefererSize所有JFrame个孩子的JScrollPane在这种情况下)

  • setSize(new Dimension(1000, 700));,而不是为getPrefererSize设置JScrollPane,然后JFrame.pack();接受此值为PrefererSize

  • setLayout(new ScrollPaneLayout());将此细节LayoutManager视为JScrollPaneAPI s,BasicsScrollPaneUIUIManager中)的唯一指定,未被LayoutManager

  • 指定为JFrame

主要问题

  • setContentPane(_container);!= getContentPane().add(newPanel);,可能与原始主题相符

  • _container.removeAll();JSrollPane不是容器,最后一点解释了选项,否则使用JSrollPane.setVieportView(something);

  • getPreferredSize代替public class NodePanel extends JPanel {代替无用的代码行setVisible(true);setBounds(150, (i * 250) + (i * 25), 700, 250);以及setSize(new Dimension(700, 250));

直接解决方案,

  • 对于JComponent.setText("")中的所有JTextComponents使用public class NodePanel extends JPanel {更容易,而不是删除然后添加相同的JPanel而不是重置值,隐藏在SetContent(node);后面的东西应该用一些默认的初始值刷新