web-dev-qa-db-fra.com

Comment placer un JButton à l'emplacement souhaité dans un JFrame en utilisant Java

Je veux mettre un Jbutton sur une coordonnée particulière dans un JFrame. J'ai mis setBounds pour le JPanel (que j'ai placé sur le JFrame) et aussi setBounds pour le JButton. Cependant, ils ne semblent pas fonctionner comme prévu.

Ma sortie:

alt text

Voici mon code:

import Java.awt.Color;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Control extends JFrame {

    // JPanel
    JPanel pnlButton = new JPanel();
    // Buttons
    JButton btnAddFlight = new JButton("Add Flight");

    public Control() {
        // FlightInfo setbounds
        btnAddFlight.setBounds(60, 400, 220, 30);

        // JPanel bounds
        pnlButton.setBounds(800, 800, 200, 100);

        // Adding to JFrame
        pnlButton.add(btnAddFlight);
        add(pnlButton);

        // JFrame properties
        setSize(400, 400);
        setBackground(Color.BLACK);
        setTitle("Air Traffic Control");
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

    public static void main(String[] args) {
        new Control();
    }
}

Comment placer le JButton aux coordonnées (0, 0)?

20
Haxed

La ligne suivante doit être appelée avant d'ajouter votre composant

pnlButton.setLayout(null);

Ci-dessus, votre panneau de contenu utilisera une disposition absolue. Cela signifie que vous devrez toujours définir explicitement les limites de votre composant en utilisant la méthode setBounds.

En général, je ne recommanderais pas d'utiliser une disposition absolue.

23
Eugene Ryzhikov

Utilisez child.setLocation(0, 0) sur le bouton et parent.setLayout(null) . Au lieu d'utiliser setBounds (...) sur le JFrame pour le dimensionner, pensez à utiliser simplement setSize(...) et à laisser le système d'exploitation positionner le cadre.

//JPanel
JPanel pnlButton = new JPanel();
//Buttons
JButton btnAddFlight = new JButton("Add Flight");

public Control() {

    //JFrame layout
    this.setLayout(null);

    //JPanel layout
    pnlButton.setLayout(null);

    //Adding to JFrame
    pnlButton.add(btnAddFlight);
    add(pnlButton);

    // postioning
    pnlButton.setLocation(0,0);
3
Chadwick

Vous devez d'abord définir la mise en page par la syntaxe pnlButton.setLayout(), puis choisir la mise en page la plus appropriée que vous souhaitez. Ex: pnlButton.setLayout(new FlowLayout(FlowLayout.LEADING, 5, 5));. Et puis, prenez ce JButton dans JPanel.

2
Daniel Tremblay

Définissez quelque part les consts:

private static final int BUTTON_LOCATION_X = 300;  // location x 
private static final int BUTTON_LOCATION_Y = 50;   // location y 
private static final int BUTTON_SIZE_X = 140;      // size height
private static final int BUTTON_SIZE_Y = 50;       // size width

puis ci-dessous:

                JButton startButton = new JButton("Click Me To Start!");
                // startButton.setBounds(300, 50,140, 50 );
                startButton.setBounds(BUTTON_LOCATION_X
                                    , BUTTON_LOCATION_Y,
                                      BUTTON_SIZE_X, 
                                      BUTTON_SIZE_Y );
                contentPane.add(startButton);

contentPane est l'objet Container qui contient le cadre entier:

 JFrame frame = new JFrame("Some name goes here");
 Container contentPane = frame.getContentPane();

J'espère que cela aide, fonctionne très bien pour moi ...

1
JAN

Je l'ai compris lol. pour le bouton faire .setBounds (0, 0, 220, 30) La disposition .setBounds est la suivante (int x, int y, int largeur, int hauteur)

0
Conor Watt

Tout d'abord, rappelez-vous la hauteur et la largeur de votre taille JPanel, puis observez: les coordonnées JButton sont (xo, yo, x longueur, y longueur). Si votre fenêtre fait 800x600, il vous suffit d'écrire:

JButton.setBounds(0, 500, 100, 100);

Il vous suffit d'utiliser un écart de coordonnées pour représenter le bouton et de savoir où se termine la fenêtre et où commence la fenêtre.

0
Carlos Xavier