2016-10-13 33 views
0

konzentrieren kann ich zugeben, vielleicht scheint die Frage seltsam, wie geschrieben wird, aber ich werde hier erklären:Java nicht auf JTextField innen JPanel innerhalb JPanel als Ansichtsfenster in JScrollPane

ich eine JScrollPane haben, in denen Ich gebe richtigerweise ein JPanel, sagen wir, dass JScrollPane Variable ist jetzt "JSP" und JPanel ist "JP"

In meinem JP habe ich eine ArrayList von JPanel (nennen wir es AJP), die ich Sichtbarkeit steuern kann Außerhalb der JSP kann ich diese Sichtbarkeit steuern, indem ich auf verschiedene Schaltflächen klicke. Jede Schaltfläche ist mit einer Zahl verknüpft. Wenn ich also auf Button1 klicke, wird das erste AJP-Element auf true und alle anderen auf false gesetzt.

Jedes dieser AJP-Elemente hat verschiedene Elemente im Inneren, so dass beispielsweise AJP an der ersten Position zwei JTextFields und 1 JButton hat, AJP an Position 2 nur 1 JTextField.

Tatsache ist, dass scheint, dass ich nicht eine JButton oder bearbeiten Sie eine JTextField klicken können, wie die Maus, um sie nicht konzentrieren kann, werde ich hier einige Code schreiben

Dies ist die Klasse, die die JP enthält und es ist eine Erweiterung von 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); 

} 

das andere ist die Klasse, die pratically besteht die Arraylist in der Klasse KScrollPanel ich gerade geschrieben, wie man sehen kann, wobei das Verfahren initialisieren fügt dinamically die Elemente (Kdrücken und KTextFields sind zwei Klassen extendind JButton und JTextField)

Diese Klasse natürlich ist eine Erweiterung von 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(); 
} 

Antwort

1

Warum erweitern Sie JScrollPane?

Warum erstellen Sie einen JViewport?

Warum erstellen Sie ein internes JPanel, um es dem Ansichtsfenster hinzuzufügen?

Sie sollten nicht versuchen, mit den Größen Ihrer Komponenten zu spielen. Der Layout-Manager bestimmt die Größe jeder Komponente.

Die Komponente, die Sie dem Scrollpanel hinzufügen möchten, sollte separat vom Scrollpanel erstellt werden. Sie können dann den Rand dieser Komponente beim Erstellen festlegen.

JViewport viewport = new JViewport(); 

... 

viewport.add(this.internalPanel); 

So sieht es für mich wie eine interne Platte erstellen und an das Ansichtsfenster hinzufügen, aber man kann nie das Ansichtsfenster auf die Bildlauffenster hinzufügen, so dass es keine Komponenten angezeigt werden soll.

Also mein Vorschlag ist, die benutzerdefinierte JScrollPane-Klasse loszuwerden, dann ist es nicht notwendig, es zu erweitern, weil Sie der Klasse keine Funktionalität hinzufügen. Verwenden Sie einfach ein JScrollPane so, wie es entworfen wurde, verwendet werden:

JPanel internalPanel = new JPanel(); 
internalPanel.setBorder(...); 
internalPanel.add(...); 
JScrollPane scrollPane = new JScrollPane(internalPanel); 
scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 
+0

Ich vergesse es, um den Code hinzuzufügen, füge ich das Ansichtsfenster auf die JScrollPane, und in der Tat, ich sehe alle Objekte, die ganze Sache funktioniert , Ich erweitere die Komponenten, weil ich mehr Funktionalität hinzufügen möchte, das einzige, was nicht funktioniert, ist die Tatsache, dass ich nicht auf meine Tasten oder meine Textfelder konzentrieren kann –

+0

'Ich möchte mehr Funktionalität hinzufügen,' - was Funktionalität fügen Sie dem Bildlauffeld hinzu? Das Festlegen einer Eigenschaft fügt keine Funktionalität hinzu. 'Ich vergesse, es zum Code hinzuzufügen,' Veröffentlichen Sie eine ordnungsgemäße [SSCCE] (http://sscce.org/), die das Problem veranschaulicht. Erstellen Sie zunächst den SSCCE mit den Swing-Komponenten.Dann, wenn das funktioniert, probiere eine benutzerdefinierte Komponente aus. Wenn es dann nicht mehr funktioniert, wissen Sie, dass das Problem Ihre benutzerdefinierte Komponente ist. – camickr

+0

Ok, ich habe festgestellt, dass das Problem die Einstellungen der Elemente wegen des Layouts waren, ich habe getan, wie Sie über die Erstellung eines Arbeitsbeispiels beraten und jetzt funktioniert alles, danke –