我不得不承认,也许问题看起来很奇怪,但我会在这里解释一下:
我有一个JScrollPane,我正确地添加了一个JPanel,让我们说现在JScrollPane变量是“JSP”而JPanel是“JP”
在我的JP中我有一个JPanel的ArrayList(让我们称之为AJP),我可以控制JSP外部的可见性,我可以通过点击不同的按钮来控制这种可见性,每个按钮都与一个数字“链接”,所以如果我单击button1,第一个AJP元素的可见性设置为true,其他所有元素都设置为false。
每个AJP元素都有不同的元素,例如,第一个位置的AJP有两个JTextFields和一个JButton,位置2的AJP只有1个JTextField。
事实是,似乎我无法点击JButton或编辑JTextField,就像鼠标无法对焦它们一样,我会在这里发布一些代码
这是包含JP的类,它是JScrollPane
的扩展private int x, y, width, height;
private JPanel internalPanel = new JPanel();
private ArrayList<KPanel> kPanels = new ArrayList<KPanel>();
JViewport viewport = new JViewport();
public KScrollPanel(int x, int y, int width, int height) {
this.x = x;
this.y = y;
this.width = width;
this.height = height;
this.internalPanel.setBorder(new LineBorder(Color.black, 1));
this.internalPanel.setSize(new Dimension(this.width - 10, this.height - 10));
this.internalPanel.setPreferredSize(new Dimension(this.width - 10, this.height - 10));
this.setSize(new Dimension(this.internalPanel.getWidth() + 10, this.internalPanel.getHeight() + 10));
this.setPreferredSize(this.internalPanel.getSize());
this.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
this.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
viewport.add(this.internalPanel);
}
另一个是在我刚发布的KScrollPanel类中实际组成ArrayList的类,正如你所看到的,方法初始化添加了dinamically元素(KButton和KTextFields是两个类extendind JButton和JTextField)
这类课程是JPanel
的扩展private int x, y, width, height;
KTextField textfield_nodeName, textfield_relationshipName;
KButton button_saveNode, button_saveRelationship;
public KPanel(int x, int y, int width, int height) {
this.x = x;
this.y = y;
this.width = width;
this.height = height;
initGUI();
}
public KPanel() {
}
public void initGUI() {
this.setBounds(this.x, this.y, this.width, this.height);
this.setBorder(new LineBorder(Color.gray, 1));
}
public void initialize(String type) {
switch(type) {
case "Node":
textfield_nodeName = new KTextField(5, 5, 200, 30);
this.add(textfield_nodeName);
button_saveNode = new KButton(5, 35, 200, 30, "Save Node");
this.add(button_saveNode);
break;
case "Relationship":
textfield_relationshipName = new KTextField(5, 5, 250, 30);
this.add(textfield_relationshipName);
break;
}
this.revalidate();
this.repaint();
}
答案 0 :(得分:1)
为什么要扩展JScrollPane?
为什么要创建JViewport?
为什么要创建要添加到视口的内部JPanel?
您不应尝试使用任何组件的尺寸。布局管理器将确定每个组件的大小。
要添加到滚动窗格的组件应与滚动窗格分开创建。然后,您可以在创建时设置此组件的边框。
JViewport viewport = new JViewport();
...
viewport.add(this.internalPanel);
因此,在我看来,您创建了一个内部面板并将其添加到视口,但您从未将视口添加到滚动窗格,因此没有要显示的组件。
所以我的建议是摆脱自定义的JScrollPane类,然后不需要扩展它,因为你没有向类中添加任何功能。只需按照设计使用的方式使用JScrollPane:
JPanel internalPanel = new JPanel();
internalPanel.setBorder(...);
internalPanel.add(...);
JScrollPane scrollPane = new JScrollPane( internalPanel );
scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);