2015-04-20 5 views
3

Итак, у меня есть свои ярлыки и все, но у меня все еще есть проблемы с форматированием и выравниванием всего. Очевидно, что кнопка расчета должна быть центрирована. Я понимаю, что использование gridbag разбивает кадр на систему координат, и когда один столбец больше других, он будет настраивать другие и выкидывает его (справа?). Но я не понимаю, как это исправить. И все еще проблема с выравниванием всего слева, чтобы он не начинался к центру.Выравнивание графического интерфейса Java

При компиляции Heres в окно

Have

Вот что я пытаюсь сделать это как, я не добавил все еще.

Want

JPanel p = new JPanel(new GridBagLayout()); 


GridBagConstraints gc = new GridBagConstraints(); 

//0 Column 
    gc.gridx = 0; 
    gc.gridy = 0; 
    gc.anchor = GridBagConstraints.EAST; 
    p.add(new JLabel("Mortgage amount:"),gc); 


    gc.gridx = 0; 
    gc.gridy =1; 
    p.add(new JLabel("Mortgage term:"),gc); 



    gc.gridx = 0; 
    gc.gridy = 2; 
    p.add(new JLabel("Interest rate:"),gc); 

    gc.gridx = 0; 
    gc.gridy = 3; 
    p.add(new JLabel("Mortgage start date:"),gc); 

    gc.gridx = 0; 
    gc.gridy= 4; 
    p.add(new JLabel("Monthly Payments:"),gc); 

    gc.gridx = 0; 
    gc.gridy = 7; 
    p.add(new JLabel("Extra payments"),gc); 

    gc.gridx = 0; 
    gc.gridy = 8; 
    p.add(new JLabel("Adding: "),gc); 

    gc.gridx = 0; 
    gc.gridy = 9; 
    p.add(new JLabel("Adding: "),gc); 

    gc.gridx = 0; 
    gc.gridy = 10; 
    p.add(new JLabel("Adding: "),gc); 

    gc.gridx = 0; 
    gc.gridy = 11; 
    p.add(new JLabel("Changes paid off date to:"),gc); 


    //1 Column 
    gc.gridx = 1; 
    gc.gridy = 0; 
    p.add(new JLabel("$"),gc); 

    gc.gridx = 1; 
    gc.gridy = 4; 
    p.add(new JLabel("$"),gc); 

    gc.gridx = 1; 
    gc.gridy = 8; 
    p.add(new JLabel("$"),gc); 

    gc.gridx = 1; 
    gc.gridy = 9; 
    p.add(new JLabel("$"),gc); 

    gc.gridx = 1; 
    gc.gridy = 10; 
    p.add(new JLabel("$"),gc); 

    //2 column 
    gc.gridx = 2; 
    gc.gridy = 0; 
    p.add(new JTextField(8),gc); 

    gc.gridx = 2; 
    gc.gridy =1; 
    p.add(new JTextField(8),gc); 

    gc.gridx = 2; 
    gc.gridy = 2; 
    p.add(new JTextField(8),gc); 

    gc.gridx = 2; 
    gc.gridy = 3; 
    p.add(new JComboBox(month),gc); 

    gc.gridx= 2; 
    gc.gridy = 4; 
    p.add(new JTextField(8),gc); 

    gc.gridx = 2; 
    gc.gridy = 8; 
    p.add(new JTextField(8),gc); 

    gc.gridx = 2; 
    gc.gridy = 9; 
    p.add(new JTextField(8),gc); 

    gc.gridx = 2; 
    gc.gridy = 10; 
    p.add(new JTextField(8),gc); 

    //3 column 
    gc.gridx = 3; 
    gc.gridy = 1; 
    p.add(new JLabel(" years or "),gc); 

    gc.gridx = 3; 
    gc.gridy = 2; 
    p.add(new JLabel(" % per year"),gc); 

    gc.gridx = 3; 
    gc.gridy = 3; 
    p.add(new JComboBox(days),gc); 

    gc.gridx = 3; 
    gc.gridy = 8; 
    p.add(new JLabel("to your monthly mortgage payment"),gc); 

    gc.gridx = 3; 
    gc.gridy = 9; 
    p.add(new JLabel("as an extra yearly mortgage payment every "),gc); 

    gc.gridx = 3; 
    gc.gridy = 10; 
    p.add(new JLabel("as a one-time payment in "),gc); 


    //4 column 
    gc.gridx = 4; 
    gc.gridy = 1; 
    p.add(new JTextField(8),gc); 

    gc.gridx = 4; 
    gc.gridy=3; 
    p.add(new JComboBox(years),gc); 



    //5 column 
    gc.gridx = 5; 
    gc.gridy = 1; 
    p.add(new JLabel(" months"),gc); 

    gc.gridy=5; 
    gc.anchor = GridBagConstraints.CENTER; 
    p.add(new JButton("Calculate"),gc); 


    add(p, BorderLayout.NORTH); 





    } 



} 
+0

1) Для получения более эффективной помощи отправьте сообщение [MCVE] (http://stackoverflow.com/help/mcve) (минимальный полный проверяемый пример) или [SSCCE] (http://www.sscce.org/) (Короткий, самосохраненный, правильный пример). 2) Предоставить ASCII-искусство или простой рисунок макета GUI с минимальным размером и, если он изменен, с большей шириной и высотой. –

+2

Честно говоря, рассмотрите возможность использования [MigLayout] (http://www.miglayout.com/). Это намного лучше и проще, чем стандартные раскладки Swing. – Veluria

+0

Держу пари, я могу использовать только swing хотя = /. Ха-ха –

ответ

0

Поскольку вы не указали поведение изменения размеров, многие менеджеры компоновки могут быть использованы, чтобы получить очень похожие результаты. Как уже упоминалось @MadProgrammer, 2 панели, вероятно, являются хорошим подходом, где для верхнего я использовал GridBagLayout для образовательной цели, а нижний я оставил пустым для вас, чтобы реализовать себя, хотя из этого не получится GridBagLayout и более простая компоновка может использоваться менеджер (например, BoxLayout).

public class Mort extends JFrame { 

    public static void main(String[] args) { 

     new Mort(); 
    } 

    Mort() { 

     JPanel topPanel = new JPanel(new GridBagLayout()); 
     GridBagConstraints gc = new GridBagConstraints(); 
     JPanel tempPanel; 

     gc.anchor = GridBagConstraints.LINE_START; 

     // Top 
     // 0 Column 
     gc.gridx = 0; 

     gc.gridy = 0; 
     topPanel.add(new JLabel("Mortgage amount:"), gc); 

     gc.gridy = 1; 
     topPanel.add(new JLabel("Mortgage term:"), gc); 

     gc.gridy = 2; 
     topPanel.add(new JLabel("Interest rate:"), gc); 

     gc.gridy = 3; 
     topPanel.add(new JLabel("Mortgage start date:"), gc); 

     gc.gridy = 4; 
     topPanel.add(new JLabel("Monthly Payments:"), gc); 

     gc.gridy = 5; 
     gc.gridwidth = GridBagConstraints.REMAINDER; 
     gc.anchor = GridBagConstraints.CENTER; 
     topPanel.add(new JButton("Calculate"), gc); 

     gc.gridwidth = 1; 
     gc.anchor = GridBagConstraints.LINE_START; 

     // 1 Column 
     gc.gridx = 1; 

     gc.gridy = 0; 
     tempPanel = new JPanel(); 
     tempPanel.add(new JLabel("$")); 
     tempPanel.add(new JTextField(8)); 
     topPanel.add(tempPanel, gc); 

     gc.gridy = 1; 
     tempPanel = new JPanel(); 
     tempPanel.add(new JTextField(8)); 
     tempPanel.add(new JLabel("years of")); 
     tempPanel.add(new JTextField(8)); 
     tempPanel.add(new JLabel("months")); 
     topPanel.add(tempPanel, gc); 

     gc.gridy = 2; 
     tempPanel = new JPanel(); 
     tempPanel.add(new JTextField(8)); 
     tempPanel.add(new JLabel("% per year")); 
     topPanel.add(tempPanel, gc); 

     gc.gridy = 3; 
     tempPanel = new JPanel(); 
     tempPanel.add(new JComboBox()); 
     tempPanel.add(new JComboBox()); 
     tempPanel.add(new JComboBox()); 
     topPanel.add(tempPanel, gc); 

     gc.gridy = 4; 
     tempPanel = new JPanel(); 
     tempPanel.add(new JLabel("$")); 
     tempPanel.add(new JTextField(8)); 
     topPanel.add(tempPanel, gc); 

     // Bottom 
     JPanel bottomPanel = new JPanel(); 
     bottomPanel.add(new JLabel("BottomPanel")); 

     // Main 
     JPanel mainPanel = new JPanel(); 
     mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); 
     mainPanel.add(new JLabel("Mortgage Calculator")); 
     mainPanel.add(new JSeparator()); 
     mainPanel.add(topPanel); 
     mainPanel.add(new JSeparator()); 
     mainPanel.add(bottomPanel); 

     getContentPane().add(mainPanel); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     pack(); 
     setVisible(true); 
    } 
} 

enter image description here

Чтобы ответить на ваши конкретные смущаясь:

  • Вы отсутствовали линии gc.anchor = GridBagConstraints.LINE_START; , который выравнивает все влево, как вы хотели.

  • Нет смысла в более чем двух столбцах, потому что есть только 2 места, которые необходимо выровнять по вертикали.

  • Кнопка «Рассчитать» находится за пределами выравнивания столбцов (она центрируется по обеим колонкам). Строка gc.gridwidth = GridBagConstraints.REMAINDER; означает, что она должна охватывать (заполнять) остальные столбцы справа, а линия gc.anchor = GridBagConstraints.CENTER; выравнивает ее по центру.

Я оставляю все изображения (цвета, шрифты, прокладки, вставки и т. Д.) Для вас.

Смежные вопросы