Java не может сосредоточиться на JTextField внутри JPanel внутри JPanel в качестве области просмотра в JScrollPane

#java #swing #jbutton #jscrollpane #jtextfield

#java #swing #jbutton #jscrollpane #jtextfield

Вопрос:

Я должен признать, может быть, вопрос кажется странным, как написано, но я объясню здесь:

У меня есть JScrollPane, в который я правильно добавляю JPanel, скажем, что на данный момент переменная JScrollPane равна «JSP», а JPanel — «JP»

В моем JP у меня есть ArrayList JPanel (назовем его AJP), которым я могу управлять видимостью извне JSP, я могу управлять этой видимостью, нажимая разные кнопки, каждая кнопка «связана» с номером, поэтому, если я нажму button1, для первого элемента AJP будет установлена видимость true, а для всех остальных установлено значение false.

Каждый из этих элементов AJP имеет внутри разные элементы, так, например, AJP в первой позиции имеет два JTextFields и 1 JButton, AJP в позиции 2 имеет только 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);

}
 

Это другой класс, который практически состоит из ArrayList в классе KScrollPanel, который я только что опубликовал, как вы можете видеть, метод 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:

Почему вы расширяете JScrollPane?

Зачем вы создаете JViewport?

Почему вы создаете внутреннюю JPanel для добавления в область просмотра?

Вы не должны пытаться играть с размерами любого из ваших компонентов. Менеджер компоновки определит размер каждого компонента.

Компонент, который вы хотите добавить в область прокрутки, должен создаваться отдельно от 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);
 

Комментарии:

1. Я забываю добавить его в код, я добавляю окно просмотра в JScrollPane, и на самом деле я вижу все объекты, все это работает, я расширяю компоненты, потому что хочу добавить больше функциональности, единственное, что не работает, это тот факт, что я не могу сосредоточиться на моих кнопках или в моих текстовых полях

2. i want to add more functionality, — какие функции вы добавляете в панель прокрутки?? Установка свойства — это не добавление функциональности. I forget to add it to the code, Опубликуйте надлежащий SSCCE , который демонстрирует проблему. Сначала создайте SSCCE, используя компоненты Swing. Затем, как только это сработает, попробуйте использовать пользовательский компонент. Затем, когда он перестает работать, вы знаете, что проблема в вашем пользовательском компоненте.

3. Хорошо, я обнаружил, что проблема заключалась в настройках элементов из-за макета, я сделал так, как вы советовали о создании рабочего примера, и теперь все работает, спасибо