2016-11-19 4 views
1

Во-первых, это домашнее задание, я не ищу полного ответа, но я надеюсь получить представление о том, как делать то, что нужно. Я пытаюсь выровнять кнопки в JFrame, чтобы выглядеть как, например: Какой графический интерфейс должен выглядеть следующим образом:JAVA Button Alignment

https://i.stack.imgur.com/jOSsB.jpg

Однако, будучи новым для GUI решений, на этой неделе у меня возникают трудности. Я пытался использовать FlowLayout, но в конце концов, я пришел к выводу, что это не правильный способ добиться желаемых результатов. Это то, что у меня есть:

Текущая сборка:

https://i.stack.imgur.com/y51ke.png

я сейчас способ добавить текстовое поле внизу и я думаю, что нужно использовать макет сетки. Уловка заключается в том, что я никогда не использовал сетку (или FlowLayout, если на то пошло!).

Если я понимаю схему сетки, я думал, что 5x8 будет работать. Это позволит размещать горизонтально и вертикально. Я на правильном пути с этой мыслью? Или можно продолжить то, что я сейчас делаю?

Код прилагается для тех, кто хочет видеть, с чем я работаю.

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

public class ATM extends JFrame { 

    //create objects to add to JPanel 
    private JRadioButton radio1 = new JRadioButton("Checking"); 
    private JRadioButton radio2 = new JRadioButton("Savings"); 
    private JButton withdrawBtn = new JButton("Withdraw"); 
    private JButton depositBtn = new JButton("Deposit"); 
    private JButton transferBtn = new JButton("Transfer"); 
    private JButton balanceBtn = new JButton("Balance"); 

    public ATM() { 
     super("ATM"); 
     setLayout(new BorderLayout()); 

     //add buttons to JPanel 
     JPanel buttonsPanel1 = new JPanel(); 
     buttonsPanel1.setLayout(new FlowLayout(FlowLayout.CENTER)); 
     buttonsPanel1.add(withdrawBtn); 
     buttonsPanel1.add(balanceBtn); 
     add(buttonsPanel1, BorderLayout.NORTH); 
     JPanel buttonsPanel2 = new JPanel(); 
     buttonsPanel2.add(transferBtn); 
     buttonsPanel2.add(depositBtn); 
     add(buttonsPanel2, BorderLayout.CENTER); 
     JPanel buttonsPanel3 = new JPanel(); 
     buttonsPanel3.add(radio1); 
     buttonsPanel3.add(radio2); 
     add(buttonsPanel3, BorderLayout.SOUTH); 

     /** 
     * 
     * @param args 
    */} 
    public static void main (String[] args) { 
     ATM app = new ATM(); 
     app.setSize(400,300); 
     app.setVisible(true); 
     app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     app.setLocationRelativeTo(null); 
    } 
} 
+0

Возможно, вы захотите изучить «GridBagLayout» или даже «SpringLayout». И если вы еще этого не видели, [это очень полезно] (https://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html) Также пара семантики: BorderLayout.NORTH считается ['old fashioned'] (https://docs.oracle.com/javase/tutorial/uiswing/layout/border.html), а комментарий чуть выше «основного» - прикосновение странно. –

+0

Прежде всего, избавьтесь от 'app.setSize (400,300);' или любого 'setSize (...)' или 'setPreferredSize (...)'. Используйте менеджеров компоновки, вызовите 'pack()' на вашем JFrame после добавления всех компонентов, а затем установите его видимым. –

+0

BTW - * «ATM Machine» *. Для банкоматов используется автоматическая банкомат, что на самом деле означает * «Автоматический машинный аппарат ** **» *. –

ответ

2

У вас есть хороший код для начала. Infact, используя BorderLayout, вы можете выполнить задачу.

Обратите внимание, что вы можете вызвать диспетчер компоновки в любом контейнере Swing. Например, приведенный ниже код в порядке, чтобы помочь вам выполнить эту работу.

JPanel buttonsPanel3 = new JPanel(); 
buttonsPanel3.setLayout(new BorderLayout()); 
buttonsPanel3.add(radio1, BorderLayout.WEST); 
buttonsPanel3.add(radio2, BorderLayout.EAST); 
buttonsPanel3.add(txtAmount, BorderLayout.SOUTH); 

Однако, ваш код должен выглядеть следующим образом:

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

public class ATM extends JFrame { 

//create objects to add to JPanel 
private JRadioButton radio1 = new JRadioButton("Checking"); 
private JRadioButton radio2 = new JRadioButton("Savings"); 
private JButton withdrawBtn = new JButton("Withdraw"); 
private JButton depositBtn = new JButton("Deposit"); 
private JButton transferBtn = new JButton("Transfer"); 
private JButton balanceBtn = new JButton("Balance"); 
private JTextField txtAmount = new JTextField(); 
public ATM() { 
    super("ATM"); 
    setLayout(new BorderLayout()); 

//add buttons to JPanel 
JPanel buttonsPanel1 = new JPanel(); 
buttonsPanel1.setLayout(new FlowLayout(FlowLayout.CENTER)); 
buttonsPanel1.add(withdrawBtn); 
buttonsPanel1.add(balanceBtn); 
add(buttonsPanel1, BorderLayout.NORTH); 
JPanel buttonsPanel2 = new JPanel(); 
buttonsPanel2.add(transferBtn); 
buttonsPanel2.add(depositBtn); 
add(buttonsPanel2, BorderLayout.CENTER); 
JPanel buttonsPanel3 = new JPanel(); 
buttonsPanel3.setLayout(new BorderLayout()); 
buttonsPanel3.add(radio1, BorderLayout.WEST); 
buttonsPanel3.add(radio2, BorderLayout.EAST); 
buttonsPanel3.add(txtAmount, BorderLayout.SOUTH); 
add(buttonsPanel3, BorderLayout.SOUTH); 
// This method will set adjust the size of the container so it can contain all other controls 
pack(); 
} 
public static void main (String[] args) { 
ATM app = new ATM(); 
//app.setSize(400,300);// This line is not very helpful in this situation instead avoid it 
app.setVisible(true); 
app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
app.setLocationRelativeTo(null); 
    } 
} 

Я надеюсь, что это работает для вас.

+0

Благодарим вас за быстрый ответ и пример того, как правильно все делать. Сам и другие отметили «pack()»; о чем я не знал. Я продолжал работать над кодом, и теперь я в процессе добавления действий ко всем кнопкам. – Feralix

1

Эта компоновка может быть выполнена с помощью единственного 2-х столбчатого макета сетки (для кнопок и флажков) и макета границы (чтобы содержать панель кнопок/флажка и текстовое поле). Поместите панель с кнопками и флажками в рамку PAGE_START. Поместите текстовое поле в поле PAGE_END.

Используйте соответствующие пустые границы на обеих панелях, чтобы создать пустое пространство.

+0

Привет, Андрей! Спасибо за быстрый ответ. Я был возился со схемой сетки с момента моего первоначального сообщения, но, скорее всего, остался с текущим форматом, который у меня есть для этого сценария, поскольку графические интерфейсы для меня новы (на этой неделе), а макет сетки еще не совсем утонул. Я ценю время, которое вы взяли, и продолжите экспериментировать. – Feralix

0

Чтобы создать пользовательский интерфейс, как в примере, я бы использовал GridLayout. Чтобы гарантировать, что GridLayout использует 2 столбца, вы должны установить его в 0 строк либо с помощью метода setRows, либо с помощью конструктора. Я создал пример для вас, где результат выглядит так:

output from ATM UI

Это два отдельных файла

ATM.java

import javax.swing.*; 

public class ATM extends JFrame { 

    public ATM() { 
     super("ATM"); 
     setSize(400, 300); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLocationRelativeTo(null); 

     add(new ATMPanel()); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     ATM app = new ATM(); 
    } 
} 

ATMPanel.java:

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

public class ATMPanel extends JPanel { 

    private class Buttons extends JPanel { 
     //create objects to add to JPanel 
     private JButton withdrawBtn; 
     private JButton balanceBtn; 
     private JButton depositBtn; 
     private JButton transferBtn; 
     private JRadioButton radio1; 
     private JRadioButton radio2; 

     private Buttons() { 
      //initialize buttons 
      this.setLayout(new GridLayout(0, 2)); 
      this.withdrawBtn = new JButton("Withdraw"); 
      this.balanceBtn = new JButton("Balance"); 
      this.depositBtn = new JButton("Deposit"); 
      this.transferBtn = new JButton("Transfer"); 
      this.radio1 = new JRadioButton("Checking"); 
      this.radio2 = new JRadioButton("Savings"); 

      //add buttons 
      this.add(withdrawBtn); 
      this.add(balanceBtn); 
      this.add(depositBtn); 
      this.add(transferBtn); 
      this.add(radio1); 
      this.add(radio2); 
     } 
    } 

    public ATMPanel() { 
     add(new Buttons()); 


    } 
} 

Я разделил панель, удерживая кнопку в своем классе. Причиной этого является то, что вы можете иметь несколько панелей на кадре, и все они могут иметь разные макеты. У вас есть эта панель с GridLayout, которая позволит кнопкам, которые она имеет линию, красиво, но затем вы можете перемещать эту панель на более высоком уровне с помощью другого типа менеджера макетов.

Я понимаю, что эта проблема связана с UI, но когда вы решите сделать эти кнопки на , я бы предложил сделать обработку в классе кнопок, а затем действия внутри класса движка/модели.

+0

Майкл, благодарю вас за ответ. Я очень заинтересован в разделении классов в этом формате. На сегодняшний день у меня мало опыта в этом, просто делайте, где я участвую в JAVA. Тем не менее, я знаю, что это то, что мне нужно узнать, тем более, что я нахожусь в том, что кнопки делают что-то вроде вас. – Feralix

+0

* «Мне очень интересно разделять классы в этом формате». * Для записи нет необходимости расширять ни JFrame, ни JPanel в этом случае. –