2016-05-16 7 views
0

Ich benutze Swing in Java und ich muss ein JButton erstellen und es in ein JPanel.Insert Taste in JPanel

I Reed-Tutorials und ich habe dies:

public void crearNuevaMiga(String nombre) 
{ 
    JButton nuevo = new JButton(nombre); 
    this.MigasDePan.add(nuevo); 
    nuevo.setVisible(true); 
    nuevo.setLocation(new Point(migaX, migaY)); 
    System.out.println(nuevo.getLocation().x + " "+ nuevo.getLocation().y); 
    migaX = migaX-avanceMigas; 
} 

ich das tun und wenn ich die Funktion aufrufen, kippe ich den Knopf sehen. Ich habe einen Knopf mit dem Designer von NetBeans gesetzt und bekomme X und Y Location. Dann setze ich in den Variablen migaX und migaY diese X- und Y-Position, so dass die Schaltfläche in der gleichen Position sein muss, aber es ist nicht da.

Wer weiß warum? Vielleicht ist es falsch, den Standort so zu setzen?

Danke für Ihre Zeit!

EDIT: MigasDePan ist mein JPanel

+0

Versuchen Aufruf 'this.MigasDePan.repaint();' nach den Button Hinzufügen, und seine Standorte zu setzen. – Hackerdarshi

+0

Nein, das Repaint funktioniert nicht:/ – Transy

+0

Ihr Fehler war der NetBeans Designer. Bis Sie ein paar hundert GUIs von Hand erstellt haben und [Swing-Architektur] (https://docs.oracle.com/javase/tutorial/uiswing/) verstehen, werden Sie Probleme bekommen. –

Antwort

1

Standardmäßig haben Komponenten eine Größe von (0, 0), also gibt es nichts zu malen.

Wenn Sie einer sichtbaren GUI dynamisch eine Schaltfläche hinzufügen, müssen Sie den Layout-Manager aufrufen, damit die Größe/Position der Komponenten vom Layout-Manager bestimmt werden kann.

Der Grundcode lautet:

panel.add(...); 
panel.revalidate(); 
panel.repaint(); 
1

Hier ist ein einfaches Beispiel für eine JButton in einem JPanel setzen, und die JPanel in einem JFrame setzen. Ich habe diesen Code erstellt, ohne einen GUI-Builder zu verwenden.

  1. Ich rief die SwingUtilities invokeLater Methode im Hauptverfahren auf den Event Dispatch thread die Erstellung und Verwendung der Swing-Komponenten zu setzen. Oracle und ich bestehen darauf, dass Sie jede Swing-Anwendung im Event Dispatch-Thread starten.

  2. Ich habe einen JFrame verwendet. Sie müssen die JFrame-Methoden in der Reihenfolge aufrufen, in der sie in der run-Methode aufgerufen werden.

  3. Ich benutzte ein JPanel. Ich habe den JButton in der Mitte des JPanels platziert, da es die einzige Komponente im JPanel ist.

  4. Ich benutzte ein Swing layout, das Border Layout. Verschiedene Swing-Layouts werden verwendet, um verschiedene Swing-Komponentenlayouts zu erstellen.

Hier ist die kurze, in sich geschlossene, runnable Code.

package com.ggl.testing; 

import java.awt.BorderLayout; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class MyButton implements Runnable { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new MyButton()); 
    } 

    @Override 
    public void run() { 
     JFrame frame = new JFrame("My Button"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(createMainPanel()); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    private JPanel createMainPanel() { 
     JPanel panel = new JPanel(); 
     panel.setLayout(new BorderLayout()); 

     JButton myButton = new JButton("My Button"); 
     panel.add(myButton); 

     return panel; 
    } 

}