2016-10-13 5 views
0

Я должен признать, что, возможно, этот вопрос кажется странным, как написано, но я объясню здесь:Java не может сосредоточиться на JTextField внутри JPanel внутри JPanel в окне просмотра в JScrollPane

У меня есть 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); 

} 

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

Почему вы простирающийся JScrollPane?

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

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

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

Компонент, который вы хотите добавить в scrollpane, должен быть создан отдельно от панели прокрутки. Затем вы можете установить границу этого компонента при его создании.

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); 
+0

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

+0

«Я хочу добавить дополнительные функции», - что функциональность вы добавляете в панель прокрутки ??? Установка свойства не добавляет функциональности. 'Я забыл добавить его в код,' Опубликуйте правильный [SSCCE] (http://sscce.org/), который демонстрирует проблему. Сначала создайте SSCCE с помощью компонентов Swing.Затем, когда это работает, попробуйте создать пользовательский компонент. Затем, когда он перестает работать, вы знаете, что проблема заключается в вашем пользовательском компоненте. – camickr

+0

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

Смежные вопросы