web-dev-qa-db-fra.com

Comment définir la taille d'un bouton?

Je mets mes boutons dans un JPane avec GridLayout. Puis j'ai mis JPanel dans un autre JPanel avec BoxLayout.Y_AXIS. Je veux que les boutons dans GridLayout soient carrés. J'utilise tmp.setSize (30,30) et cela ne fonctionne pas. J'essaie aussi d'utiliser new GridLayout(X, Y, 4, 4) mais je ne peux pas comprendre ce que sont X et Y. Alors, quelle est la bonne façon de faire ce genre de choses?

ADDED:

Je ne peux toujours pas résoudre le problème. Voici le code de ce que j'essaie de faire:

import javax.swing.*;
import Java.awt.*;

public class PanelModel {
    public static void main(String[] args) {
        JFrame frame = new JFrame("Colored Trails");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel mainPanel = new JPanel();
        mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));

        JPanel firstPanel = new JPanel();
        firstPanel.setLayout(new GridLayout(4, 4));
        JButton btn;
        for (int i=1; i<=4; i++) {
            for (int j=1; j<=4; j++) {
                btn = new JButton();
                btn.setPreferredSize(new Dimension(100, 100));
                firstPanel.add(btn);
            }
        }

        JPanel secondPanel = new JPanel();
        secondPanel.setLayout(new GridLayout(5, 13));
        for (int i=1; i<=5; i++) {
            for (int j=1; j<=13; j++) {
                btn = new JButton();
                btn.setPreferredSize(new Dimension(40, 40));
                secondPanel.add(btn);
            }
        }

        mainPanel.add(firstPanel);
        mainPanel.add(secondPanel);
        frame.add(mainPanel);

        frame.setSize(400,600);
        frame.setVisible(true);
    }
}

Le problème est que Java essaie d'égaler la largeur de firstPanel et secondPanel!! De plus, Java essaie de remplir toute la hauteur de la fenêtre. Comment puis-je supprimer ce problème?

27
Roman

Le code suivant fait ce que vous demandez. Assurez-vous simplement d’attribuer suffisamment d’espace pour que le texte du bouton soit visible.

JFrame frame = new JFrame("test");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
JPanel panel = new JPanel(new GridLayout(4,4,4,4));

for(int i=0 ; i<16 ; i++){
    JButton btn = new JButton(String.valueOf(i));
    btn.setPreferredSize(new Dimension(40, 40));
    panel.add(btn);
}
frame.setContentPane(panel);
frame.pack();
frame.setVisible(true);

Les X et Y (deux premiers paramètres du constructeur GridLayout) spécifient le nombre de lignes et de colonnes dans la grille (respectivement). Vous pouvez laisser l'un d'entre eux à 0 si vous souhaitez que cette valeur soit sans limite.

Éditer

J'ai modifié le code fourni et je crois qu'il est maintenant conforme à ce qui est souhaité:

JFrame frame = new JFrame("Colored Trails");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JPanel mainPanel = new JPanel();
mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));

JPanel firstPanel = new JPanel();
firstPanel.setLayout(new GridLayout(4, 4));
firstPanel.setMaximumSize(new Dimension(400, 400));
JButton btn;
for (int i=1; i<=4; i++) {
    for (int j=1; j<=4; j++) {
        btn = new JButton();
        btn.setPreferredSize(new Dimension(100, 100));
        firstPanel.add(btn);
    }
}

JPanel secondPanel = new JPanel();
secondPanel.setLayout(new GridLayout(5, 13));
secondPanel.setMaximumSize(new Dimension(520, 200));
for (int i=1; i<=5; i++) {
    for (int j=1; j<=13; j++) {
        btn = new JButton();
        btn.setPreferredSize(new Dimension(40, 40));
        secondPanel.add(btn);
    }
}

mainPanel.add(firstPanel);
mainPanel.add(secondPanel);
frame.setContentPane(mainPanel);

frame.setSize(520,600);
frame.setMinimumSize(new Dimension(520,600));
frame.setVisible(true);

Fondamentalement, je définis maintenant la taille préférée des panneaux et une taille minimale pour le cadre.

33
Kris

Essayez avec setPreferredSize au lieu de setSize.

MISE À JOUR: GridLayout occupe tout l'espace de son conteneur et BoxLayout semble occuper toute la largeur de son conteneur. J'ai donc ajouté des panneaux de colle invisibles qui prennent juste de la place lorsque l'utilisateur étend la fenêtre. Je viens de le faire horizontalement, et non verticalement, mais vous pouvez le mettre en œuvre de la même manière si vous le souhaitez.

Puisque GridLayout rend toutes les cellules de la même taille, peu importe si elles ont une taille spécifiée. Vous devez plutôt spécifier une taille pour son conteneur, comme je l'ai fait.

import javax.swing.*;
import Java.awt.*;

public class PanelModel {
    public static void main(String[] args) {
        JFrame frame = new JFrame("Colored Trails");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel mainPanel = new JPanel();
        mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));

        JPanel firstPanel = new JPanel(new GridLayout(4, 4));
        firstPanel.setPreferredSize(new Dimension(4*100, 4*100));
        for (int i=1; i<=4; i++) {
            for (int j=1; j<=4; j++) {
                firstPanel.add(new JButton());
            }
        }

        JPanel firstGluePanel = new JPanel(new BorderLayout());
        firstGluePanel.add(firstPanel, BorderLayout.WEST);
        firstGluePanel.add(Box.createHorizontalGlue(), BorderLayout.CENTER);
        firstGluePanel.add(Box.createVerticalGlue(), BorderLayout.SOUTH);

        JPanel secondPanel = new JPanel(new GridLayout(13, 5));
        secondPanel.setPreferredSize(new Dimension(5*40, 13*40));
        for (int i=1; i<=5; i++) {
            for (int j=1; j<=13; j++) {
                secondPanel.add(new JButton());
            }
        }

        JPanel secondGluePanel = new JPanel(new BorderLayout());
        secondGluePanel.add(secondPanel, BorderLayout.WEST);
        secondGluePanel.add(Box.createHorizontalGlue(), BorderLayout.CENTER);
        secondGluePanel.add(Box.createVerticalGlue(), BorderLayout.SOUTH);

        mainPanel.add(firstGluePanel);
        mainPanel.add(secondGluePanel);
        frame.getContentPane().add(mainPanel);

        //frame.setSize(400,600);
        frame.pack();
        frame.setVisible(true);
    }
}
5
Jonas

Voici comment je l'ai fait.

            JFrame.setDefaultLookAndFeelDecorated(true);
            JDialog.setDefaultLookAndFeelDecorated(true);
            JFrame frame = new JFrame("SAP Multiple Entries");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            JPanel panel = new JPanel(new GridLayout(10,10,10,10));
            frame.setLayout(new FlowLayout());
            frame.setSize(512, 512);
            JButton button = new JButton("Select File");
            button.setPreferredSize(new Dimension(256, 256));
            panel.add(button);

            button.addActionListener(new ActionListener() {

                public void actionPerformed(ActionEvent ae) {
                    JFileChooser fileChooser = new JFileChooser();
                    int returnValue = fileChooser.showOpenDialog(null);
                    if (returnValue == JFileChooser.APPROVE_OPTION) {
                        File selectedFile = fileChooser.getSelectedFile();

                        keep = selectedFile.getAbsolutePath();


                       // System.out.println(keep);
                        //out.println(file.flag); 
                       if(file.flag==true) {
                           JOptionPane.showMessageDialog(null, "It is done! \nLocation: " + file.path , "Success Message", JOptionPane.INFORMATION_MESSAGE);
                       }
                       else{
                           JOptionPane.showMessageDialog(null, "failure", "not okay", JOptionPane.INFORMATION_MESSAGE);
                       }
                    }
                }
            });
            frame.add(button);
            frame.pack();
            frame.setVisible(true);
3
Tanvir Rahman

GridLayout n'est souvent pas le meilleur choix pour les boutons, bien que cela puisse être pour votre application. Une bonne référence est le tutoriel sur l’utilisation des gestionnaires de disposition . Si vous regardez l'exemple GridLayout, vous verrez que les boutons ont l'air un peu ridicules - beaucoup trop gros.

Une meilleure idée pourrait être d’utiliser un FlowLayout pour vos boutons ou, si vous savez exactement ce que vous voulez, peut-être un GroupLayout. (Sun/Oracle recommandé que la disposition de GroupLayout ou GridBag est meilleure que GridLayout pour le codage manuel.)

2
John