Hoe kan ik de grootte van een knop instellen?

Ik heb mijn buttons in een JPane gezet met GridLayout. Daarna plaatste ik JPanel in een ander JPanel met BoxLayout.Y_AXIS. Ik wil dat de knoppen in de GridLayout vierkant zijn. Ik gebruik tmp.setSize (30,30) en het werkt niet. Ik probeer ook new GridLayout(X, Y, 4, 4)te gebruiken, maar ik kan niet achterhalen wat X en Y zijn. Dus, wat is de juiste manier om dit te doen?

TOEGEVOEGD:

Ik kan het probleem nog steeds niet oplossen. Hier is de code van wat ik probeer te doen:

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);
    }
}

Het probleem is dat Java de breedte probeert te maken van de firstPanelen secondPanelgelijk! Bovendien probeert Java alle hoogte van het venster te vullen. Hoe kan ik dit gedrag verwijderen?


Antwoord 1, Autoriteit 100%

De volgende bit van code doet wat u vraagt. Zorg ervoor dat u voldoende ruimte toewijst, zodat de tekst op de knop zichtbaar wordt

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

De X en Y (twee eerste parameters van de Gridlayout-constructeur) specificeren het aantal rijen en kolommen in het rooster (respectievelijk). Mogelijk kunt u een van hen achterlaten als u wilt dat die waarde onbegrensd is.

bewerken

Ik heb de opgegeven code gewijzigd en ik geloof dat het nu voldoet aan wat gewenst is:

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

In principe stel ik nu het voorkeursgrootte van de panelen en een minimale grootte voor het frame in.


Antwoord 2, Autoriteit 12%

Probeer met setPreferredSizein plaats van setSize.

UPDATE: GridLayoutNeem alle ruimte in de container, en BoxLayoutnaden om alle breedte in zijn container op te nemen, dus ik Sommige lijmpanelen toegevoegd die onzichtbaar zijn en gewoon ruimte innemen wanneer de gebruiker het venster uitrekt. Ik heb dit gewoon horizontaal gedaan, en niet verticaal, maar je zou dat op dezelfde manier kunnen implementeren als je het wilt.

Sinds GridLayoutMaak alle cellen in dezelfde grootte, het maakt niet uit of ze een opgegeven grootte hebben. U moet in plaats daarvan een maat opgeven voor de container, zoals ik gedaan heb.

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);
    }
}

Antwoord 3, autoriteit 8%

GridLayout is vaak niet de beste keuze voor knoppen, hoewel het misschien wel voor uw toepassing is. Een goede referentie is de zelfstudie over het gebruik van Layout Managers. Als je naar het GridLayout-voorbeeld kijkt, zie je dat de knoppen er een beetje dom uitzien – veel te groot.

Een beter idee zou kunnen zijn om een FlowLayout te gebruiken voor uw knoppen, of als u precies weet wat u wilt, misschien een GroupLayout. (Sun/Oracle aanbevelendie GroupLayout- of GridBag-lay-out zijn beter dan GridLayout bij handmatig coderen.)


Antwoord 4, autoriteit 8%

Zo heb ik het gedaan.

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

Other episodes