Java无法专注于JPanel中JPanel内的JTextField作为JScrollPane中的视口

时间:2016-10-13 21:16:22

标签: java swing jbutton jscrollpane jtextfield

我不得不承认,也许问题看起来很奇怪,但我会在这里解释一下:

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

1 个答案:

答案 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);