макеты границ и сетки - PullRequest
       13

макеты границ и сетки

2 голосов
/ 20 марта 2012

Sample GUI Привет всем, у меня есть проблема. Если кто-то может помочь, было бы здорово. Я использую border и gridlayout, и я пытаюсь разделить GUI, но это не происходит, потому что я хочу, чтобы кнопки были маленькой частью целого, скажем, 1/5, но на данный момент это больше, чем половина GUI. Я также пытаюсь поместить кнопки в размерность, но я не уверен, что это хорошая практика. У меня есть два класса: RunFurniture, где основной метод с рамкой, а другой метод PanelFurniture с графическим интерфейсом. Я использую eclipse и программа компилируется и работает. Я надеюсь, что дал хорошее объяснение. Вот код.

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class PanelFurniture extends JPanel implements ActionListener
{

    JButton center, east;
    JButton[] commandButtons = {
                                 new JButton(" Add Chair"),
                                 new JButton(" Add Table"),
                                 new JButton(" Add Desk "),
                                 new JButton(" Clear All   "),
                                 new JButton("Total Price"),
                                 new JButton("   Save       "),
                                 new JButton("   Load       "),
                                 new JButton("Summary ")
                                                        };

    JPanel centerPanel, westPanel, eastPanel;

    PanelFurniture()
    {

        this.setLayout(new BorderLayout());


        westPanel = new JPanel();
        westPanel.setLayout(new FlowLayout());

        for(int i=0; i<commandButtons.length; i++)      
        {
            westPanel.add(commandButtons[i]);
            commandButtons[i].addActionListener(this);

        }
//      westPanel.setSize(westDimension);   
        this.add(westPanel, BorderLayout.WEST);

        // start the middle panel       
        centerPanel = new JPanel(new GridLayout(1,2));

        center = new JButton("center");
        centerPanel.add(center);
        east = new JButton("east");
        centerPanel.add(east);  


        this.add(centerPanel, BorderLayout.CENTER);


    }

    public void actionPerformed(ActionEvent ae)
    {




    }
}

RunRurniture

import java.awt.*;
import javax.swing.*;
public class RunRurniture 
{

    /**
     * @param args
     */
    public static void main(String[] args) 
    {


        JFrame application = new JFrame();
        PanelFurniture panel = new PanelFurniture();
        application.add(panel);
        application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        application.setSize(300,150);
        application.setLocationByPlatform(true);
        application.setVisible(true);

    }

}

Ответы [ 3 ]

4 голосов
/ 20 марта 2012

Это пример того, что я упомянул в комментарии (с несколькими другими изменениями).

PanelFurniture image

package test;

import java.awt.*;
import javax.swing.*;

public class PanelFurniture extends JPanel
{

    private static final long serialVersionUID = 4231608548183463223L;

    JButton center, east;
    // leading/trailing spaces in these labels will be ignored.
    JButton[] commandButtons = {
            new JButton("Add Chair"),
            new JButton("Add Table"),
            new JButton("Add Desk "),
            new JButton("Clear All   "),
            new JButton("Total Price"),
            new JButton("Summary "),
            new JButton("Save"),
            new JButton("Load")
    };

    JPanel centerPanel, eastPanel;

    PanelFurniture()
    {
        this.setLayout(new BorderLayout());

        JToolBar toolBar = new JToolBar(); 

        for(int i=0; i<commandButtons.length; i++)      
        {
            if (i==3 || i==6) {
                toolBar.addSeparator();
            }
            toolBar.add(commandButtons[i]);
        }
        this.add(toolBar, BorderLayout.NORTH);

        // start the middle panel       
        centerPanel = new JPanel(new GridLayout(1,2));

        center = new JButton("center");
        centerPanel.add(center);
        east = new JButton("east");
        centerPanel.add(east);  

        this.add(centerPanel, BorderLayout.CENTER);
    }

    public static void main(String[] args) 
    {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame application = new JFrame();
                PanelFurniture panel = new PanelFurniture();
                application.add(panel);
                application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                application.pack();
                application.setLocationByPlatform(true);
                application.setVisible(true);
            }
        });
    }
}

Обновление

Этот графический интерфейс основан на изображении.

PanelFurniture 2

package test;

import java.awt.BorderLayout;
import java.awt.GridLayout;

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

public class PanelFurniture extends JPanel
{

    private static final long serialVersionUID = 4231608548183463223L;

    JButton center, east;
    // leading/trailing spaces in these labels will be ignored.
    JButton[] commandButtons = {
            new JButton("Add Chair"),
            new JButton("Add Table"),
            new JButton("Add Desk "),
            new JButton("Clear All   "),
            new JButton("Total Price"),
            new JButton("Summary "),
            new JButton("Save"),
            new JButton("Load")
    };

    JPanel centerPanel, westPanel, westPanelConstrain, eastPanel;

    PanelFurniture()
    {
        super(new BorderLayout(2,2));
        this.setBorder(new EmptyBorder(4,4,4,4));

        westPanel = new JPanel(new GridLayout(0,1,4,4));

        for(int i=0; i<commandButtons.length; i++)      
        {
            westPanel.add(commandButtons[i]);
        }
        westPanelConstrain = new JPanel(new BorderLayout());
        westPanelConstrain.add(westPanel, BorderLayout.NORTH);
        this.add(westPanelConstrain, BorderLayout.WEST);

        // start the middle panel       
        centerPanel = new JPanel(new GridLayout(1,2));

        center = new JButton("center");
        centerPanel.add(center);
        east = new JButton("east");
        centerPanel.add(east);

        this.add(centerPanel, BorderLayout.CENTER);
    }

    public static void main(String[] args) 
    {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame application = new JFrame();
                PanelFurniture panel = new PanelFurniture();
                application.add(panel);
                application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                application.pack();
                application.setLocationByPlatform(true);
                application.setVisible(true);
            }
        });
    }
}
4 голосов
/ 20 марта 2012

Несколько дополнительных предложений:

  • Не используйте пробелы для макета; используйте выравнивание.

  • Пусть макет выполняет работу, используя предпочтительный размер компонентов.

  • При возможности используйте конструкцию for-each.

  • Начало в EDT .

Furniture Test

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

/** @see http://stackoverflow.com/q/9793194/230513 */
public class FurnitureTest {

    private static final class FurniturePanel
        extends JPanel implements ActionListener {

        private static final int N = 3;
        private static final Icon icon =
            UIManager.getIcon("OptionPane.informationIcon");
        private JPanel westPanel = new JPanel();
        private JPanel centerPanel = new JPanel();
        private JButton[] commandButtons = {
            new JButton("Add Chair"),
            new JButton("Add Table"),
            new JButton("Add Desk"),
            new JButton("Clear All"),
            new JButton("Total Price"),
            new JButton("Save"),
            new JButton("Load"),
            new JButton("Summary")
        };

        FurniturePanel() {
            this.setLayout(new GridLayout());
            westPanel.setLayout(new BoxLayout(westPanel, BoxLayout.Y_AXIS));

            for (JButton b : commandButtons) {
                b.setAlignmentX(JButton.CENTER_ALIGNMENT);
                westPanel.add(b);
                b.addActionListener(this);
            }
            this.add(westPanel, BorderLayout.WEST);

            centerPanel.setLayout(new GridLayout(N, N, N, N));
            for (int i = 0; i < N * N; i++) {
                centerPanel.add(new JLabel(icon));
            }
            this.add(centerPanel, BorderLayout.CENTER);
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println(e);
        }
    }

    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                JFrame application = new JFrame();
                FurniturePanel panel = new FurniturePanel();
                application.add(panel);
                application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                application.pack();
                application.setLocationByPlatform(true);
                application.setVisible(true);
            }
        });

    }
}
4 голосов
/ 20 марта 2012

Последнее редактирование:

Я думаю, JPanel на LINE_START или WEST должно быть с GridLayout, а CENTER JPanel может идти с GridLayout для размещения этих изображений :-). Я работал над этим, когда вы приняли этот ответ и когда @AndrewThompson добавил этот комментарий относительно GridLayout штуковины, но похоже, что включение этого JPanel в GridLayout позволит использовать JButtons одинакового размера. Вот моя интерпретация с GridLayout в коде:

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

import java.awt.*;
import javax.swing.*;
public class RunFurniture 
{

    /**
     * @param args
     */
    public static void main(String[] args) 
    {


        JFrame application = new JFrame();
        PanelFurniture panel = new PanelFurniture();
        application.add(panel);
        application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        application.pack();
        application.setLocationByPlatform(true);
        application.setVisible(true);

    }

}

class PanelFurniture extends JPanel implements ActionListener
{

    JButton center, east;
    JButton[] commandButtons = {
                                 new JButton(" Add Chair"),
                                 new JButton(" Add Table"),
                                 new JButton(" Add Desk "),
                                 new JButton(" Clear All   "),
                                 new JButton("Total Price"),
                                 new JButton("   Save       "),
                                 new JButton("   Load       "),
                                 new JButton("Summary ")
                                                        };

    JPanel centerPanel, westPanel, eastPanel;

    PanelFurniture()
    {

        this.setLayout(new BorderLayout());


        westPanel = new JPanel();
        westPanel.setLayout(new GridLayout(0, 1));
        //westPanel.setLayout(new BoxLayout(westPanel, BoxLayout.PAGE_AXIS));
        westPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));

        for(int i=0; i<commandButtons.length; i++)      
        {
            westPanel.add(commandButtons[i]);
            commandButtons[i].addActionListener(this);

        }
//      westPanel.setSize(westDimension);   
        this.add(westPanel, BorderLayout.LINE_START);

        // start the middle panel       
        centerPanel = new JPanel(new GridLayout(1,2));

        center = new JButton("center");
        centerPanel.add(center);
        east = new JButton("east");
        centerPanel.add(east);  


        this.add(centerPanel, BorderLayout.CENTER);


    }

    public void actionPerformed(ActionEvent ae)
    {




    }
}

Выход:

FURNITUREGRIDLAYOUT

Вот моя интерпретация с BoxLayout в коде:

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

import java.awt.*;
import javax.swing.*;
public class RunFurniture 
{

    /**
     * @param args
     */
    public static void main(String[] args) 
    {


        JFrame application = new JFrame();
        PanelFurniture panel = new PanelFurniture();
        application.add(panel);
        application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        application.pack();
        application.setLocationByPlatform(true);
        application.setVisible(true);

    }

}

class PanelFurniture extends JPanel implements ActionListener
{

    JButton center, east;
    JButton[] commandButtons = {
                                 new JButton(" Add Chair"),
                                 new JButton(" Add Table"),
                                 new JButton(" Add Desk "),
                                 new JButton(" Clear All   "),
                                 new JButton("Total Price"),
                                 new JButton("   Save       "),
                                 new JButton("   Load       "),
                                 new JButton("Summary ")
                                                        };

    JPanel centerPanel, westPanel, eastPanel;

    PanelFurniture()
    {

        this.setLayout(new BorderLayout());


        westPanel = new JPanel();
        westPanel.setLayout(new GridLayout(0, 1));
        //westPanel.setLayout(new BoxLayout(westPanel, BoxLayout.PAGE_AXIS));
        westPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));

        for(int i=0; i<commandButtons.length; i++)      
        {
            westPanel.add(commandButtons[i]);
            commandButtons[i].addActionListener(this);

        }
//      westPanel.setSize(westDimension);   
        this.add(westPanel, BorderLayout.LINE_START);

        // start the middle panel       
        centerPanel = new JPanel(new GridLayout(1,2));

        center = new JButton("center");
        centerPanel.add(center);
        east = new JButton("east");
        centerPanel.add(east);  


        this.add(centerPanel, BorderLayout.CENTER);


    }

    public void actionPerformed(ActionEvent ae)
    {




    }
}

Вот вывод:

FURNITURE

...