我有一个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()设置。
我试图重新粉刷,重新验证几乎所有东西,但我似乎无法找到问题所在。我也尝试了不同的布局类型,但这似乎并不重要。
答案 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
视为JScrollPane
(API
s,BasicsScrollPaneUI
或UIManager
中)的唯一指定,未被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);
后面的东西应该用一些默认的初始值刷新