#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. Хорошо, я обнаружил, что проблема заключалась в настройках элементов из-за макета, я сделал так, как вы советовали о создании рабочего примера, и теперь все работает, спасибо