当前位置: 首页 > 知识库问答 >
问题:

Java无法将JPanel内部的JTextField作为JScrollPane中的视口来关注

何越
2023-03-14

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

我有一个JScrollPane,在其中我正确地添加了一个JPanel,让我们说,现在JScrollPane变量是"JSP"和JPanel是"JP"

在我的JP中,我有一个JPanel(我们称之为AJP)的ArrayList,我可以从JSP外部控制可见性,我可以通过单击不同的按钮来控制这种可见性,每个按钮都与一个数字“链接”,所以如果我单击button1,第一个AJP元素的可见性设置为true,其他所有元素的可见性设置为false。

每个AJP元素内部都有不同的元素,例如,第一个位置的AJP有两个JTextField和一个JButton,第二个位置的AJP只有一个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组成的,正如您所看到的,initialize方法以友好的方式添加元素(KButton和KTextFields是两个扩展的类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个答案

傅朗
2023-03-14

为什么要扩展JScrollPane?

你为什么要创建一个JViewport?

为什么要创建要添加到视口的内部JPanel?

您不应该尝试使用任何组件的大小。布局管理器将决定每个组件的大小。

要添加到scrollpane的组件应该与scrollpanel分开创建。然后,可以在创建该组件时设置其边框。

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);
 类似资料:
  • 我最近需要在一个JScrollPane的viewport视图中放置几个组件,其中包括一个JTextPane。 我将所有组件(两个JPanel和JTextPane)放在另一个JPanel中,这个JPanel有一个BorderLayout LayoutManager,并将该JPanel设置为ScrollPane的viewport视图。 我立即注意到: JTextPane不再根据JScrollPane的

  • 问题内容: 我有一个JFrame,在这个JFrame中,我有一个绘制的JPanel,此Panel可以是任何大小,因此我将其放在JScrollpane中,以便当面板大于窗口屏幕大小时可以滚动。 不幸的是,它没有按我预期的那样工作: 使JFrame窗口小于JPanel大小不会显示滚动条 现在,JScrollPane的大小似乎已锁定为我添加到其中的JPanel的大小,就像以前一样,它的大小已调整为JFr

  • 我在JScrollPane中有一个JPanel,JScrollPane嵌套在其他容器中。我的JPanel在这个问题中使用了SO user jxd中修改过的FlowLayout。 这可能是信息过火,但所讨论的面板的完整嵌套如下所示: JPanel(ModifiedFlowLayout)>JScrollPane>JPanel(GridBagLayout)>JTabbedPane>JPanel(Grid

  • 我使用子JPanel构造JScrollPane,然后尝试将JScrollPane添加到父JPanel中,希望有一个可滚动的自定义JPanel。 我有一个大的细白线前面的所有我的组件,他们是没有滚动。有什么想法吗?

  • 问题内容: 我有一个按钮添加到JTabbedPane添加到JPanel与这样的事情: 我想在按钮按下时关闭窗口。我尝试这样做: 但这给了我 我如何在按下按钮时关闭窗口 问题答案: 获取顶层窗口: 确保已将JFrame的默认关闭操作设置为(首选)或(首选)。 如果有可能会从JMenuItem调用此方法,那么除非您首先测试组件的父级是JPopupMenu还是JToolBar,否则它将不起作用。如果是这

  • 我有一个叫做CatalogPane的JPanel,它的大小是800 x 600,它位于一个叫做BookFrame的JFrame中的JTabbedPane中。因此,在CatalogPane中,我创建了一个名为bookDisplay的JPanel,它显示书籍及其详细信息的列表。我希望它的大小为780 x 900,滚动条的大小为20px,并且比框架高,这样就可以滚动。然后我创建了一个尺寸为800 x 4