2016-04-20 6 views
1

В настоящее время я делаю довольно простой графический интерфейс и задавался вопросом, как я могу получить эту кнопку из GridLayout и поместить ее в свой собственный ответ BorderLayout, если это немного расплывчато. присоединять изображения, чтобы показать вам, что я имею в виду:Расположение кнопок вне GridLayout

enter image description here

с этой картиной я хотел бы кнопку, чтобы не быть с макетом сетки и для него, чтобы заполнить весь путь через в нижней части программы, как это будет в макете границы. Мой код выглядит следующим образом:

import java.awt.*; 
import javax.swing.*; 
import java.awt.event.*; 
/** 
* Write a description of class HW4GUI here. 
* 
* @author (your name) 
* @version (a version number or a date) 
*/ 
    public class HW4GUI extends JFrame implements ActionListener 
{ 
private JButton jbtAction; 
private JTextField jtfFName; 
private JTextField jtfLName; 
private JTextField jtfLibNo; 
private int nextLibNo; 
private JPanel textPanel; 

/** 
* The constructor for the GUI, also initalises nextLibNo number 
*/ 
public HW4GUI() 
{ 
    super("Adding a borrower"); 
    makeFrame(); 
    showFrame(); 
    nextLibNo = 1001; 
} 

/** 
* 
*/ 
private void makeFrame() 
{ 
    setLayout(new GridLayout(4,0)); 
    setResizable(false); 
    textPanel = new JPanel(); 
    //textPanel.setLayout(new FlowLayout(FlowLayout.CENTER)); 
    textPanel.setLayout(new BorderLayout()); 

    jtfFName = new JTextField(15); 
    JLabel fNLbl = new JLabel("First Name: "); 
    add(fNLbl); 
    add(jtfFName); 
    // add(textPanel); 
    fNLbl.setHorizontalAlignment(JLabel.RIGHT); 
    jtfFName.setEditable(true); 

    jtfLName = new JTextField(15); 
    JLabel lNLbl = new JLabel("Last Name: "); 
    add(lNLbl); 
    add(jtfLName); 
    //add(textPanel); 
    lNLbl.setHorizontalAlignment(JLabel.RIGHT); 
    jtfLName.setEditable(true); 

    jtfLibNo = new JTextField(15); 
    JLabel lNOLbl = new JLabel("Library Number: "); 
    add(lNOLbl); 
    add(jtfLibNo); 
    // add(textPanel); 
    lNOLbl.setHorizontalAlignment(JLabel.RIGHT); 
    jtfLibNo.setEditable(false); 


    jbtAction = new JButton("Add Borrower"); 
    add(jbtAction, BorderLayout.SOUTH); 
    jbtAction.addActionListener(this); 

} 

/** 
* displays the frame window where you can set the size of it and also other variables 
*/ 
private void showFrame() 
{ 
    setSize(400,200); 
    setResizable(false); 
    setLocationRelativeTo(null); 
    setVisible(true); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
} 

public void actionPerformed(ActionEvent e) 
{ 
    String fn = jtfFName.getText(); 
    String ln = jtfLName.getText(); 
    boolean valid = true; 
    if (e.getActionCommand().equals("Add Borrower")) 
    { 
     if (fn.equals("") && (ln.equals(""))) 
     { 
      jtfLibNo.setText("No Names"); 
      valid = false; 
     } 
     else if (fn.equals("")) 
     { 
      jtfLibNo.setText("No First Name"); 
      valid = false; 
     } 
     else if (ln.equals("")) 
     { 
      jtfLibNo.setText("No Last Name"); 
      valid = false; 
     } 
     else 

     if (valid == true) 
     { 
      String lib = Integer.toString(nextLibNo++); 
      jtfLibNo.setText(lib); 
      jbtAction.setText("Confirm"); 
     } 
    } 
    if (e.getActionCommand().equals("Confirm")) 
    { 
     jtfLibNo.setText(""); 
     jbtAction.setText("Add Borrower"); 
    } 

} 
} 
+1

«Добавление заемщика», вероятно, должно быть модальным 'JDialog' или' JOptionPane' .. См. [Использование нескольких JFrames, Good/Bad Practice?] (Http://stackoverflow.com/q/9554636/ 418556) –

+2

Я бы использовал 'GridBagLayout' лично,' GridLayout 'не очень подходит для того, что вы делаете – MadProgrammer

+1

Это больше [я имею в виду] (http://i.stack.imgur.com/hSaev. png), хотя я, вероятно, использовал бы «GridBagLayout», как это предложил @MadProgrammer. Он позволяет использовать столбцы неравномерного размера, которые позволят лучше отобразить панель ввода заемщика. –

ответ

1

Как вы сказали, что вы хотите, чтобы кнопка вне вашего GridLayout, вы можете сделать:

  • Объявите новую панель, как mainPanel или что-то в этом роде.

    JPanel mp = new JPanel(); 
    
  • Установить его расположение на 3x1 с помощью GridLayout.

    mp.setlayout(new GridLayout(3,1)); 
    
  • Добавить ярлыки и текстовые поля на эту панель.

    mp.add(fNLbl);// and the rest. 
    
  • Добавить эту панель в свою раму.

    add(mp, BorderLayout.CENTER); 
    
  • Затем добавить кнопку в конце, используя, BorderLayout.SOUTH.

    add(jbtAction, BorderLayout.SOUTH); 
    

    Но насколько я знаю, ваша кнопка будет занимать ширину всего кадра. Таким образом, вы можете добавить кнопку на панель, а затем добавить к ней панель. Как:

    add(new JPanel(){{ add(jbtAction);}}, BorderLayout.SOUTH); // this is double-brace initialization. 
    


Следующий код работает отлично:

private void makeFrame() 
{ 
    JPanel mp = new JPanel(); 
    mp.setLayout(new GridLayout(3,1)); 
    setResizable(false); 
    textPanel = new JPanel(); 
    //textPanel.setLayout(new FlowLayout(FlowLayout.CENTER)); 
    textPanel.setLayout(new BorderLayout()); 

    jtfFName = new JTextField(15); 
    JLabel fNLbl = new JLabel("First Name: "); 
    mp.add(fNLbl); 
    mp.add(jtfFName); 
    // add(textPanel); 
    fNLbl.setHorizontalAlignment(JLabel.RIGHT); 
    jtfFName.setEditable(true); 

    jtfLName = new JTextField(15); 
    JLabel lNLbl = new JLabel("Last Name: "); 
    mp.add(lNLbl); 
    mp.add(jtfLName); 
    //add(textPanel); 
    lNLbl.setHorizontalAlignment(JLabel.RIGHT); 
    jtfLName.setEditable(true); 

    jtfLibNo = new JTextField(15); 
    JLabel lNOLbl = new JLabel("Library Number: "); 
    mp.add(lNOLbl); 
    mp.add(jtfLibNo); 
    // add(textPanel); 
    lNOLbl.setHorizontalAlignment(JLabel.RIGHT); 
    jtfLibNo.setEditable(false); 

    jbtAction = new JButton("Add Borrower"); 
    add(mp, BorderLayout.CENTER); 
    add(new JPanel(){{ add(jbtAction);}}, BorderLayout.SOUTH); 
    jbtAction.addActionListener(this); 

} 
+0

Спасибо за быстрый ответ, кнопка идеальна (как в том, как я хочу ее внизу, но нет, у меня нет каких-либо из моих текстовых полей или jlabels, ее просто пустое я могу отправить вам код makeFrame? – newbie

+0

@newbie См. Редактирование. – Hackerdarshi

0

С этой картиной я хотел бы кнопку, чтобы не быть с макетом сетки и он должен заполнить весь путь в нижней части программы, как это было бы в макете границы

Затем используйте BorderLayout. Менеджером раскладки по умолчанию для JFrame является BorderLayout. Таким образом, вы бы сделали что-то вроде:

  1. Создайте панель, используя GridLayout. Добавьте на эту панель первые 5 компонентов. Затем добавьте панель в «ЦЕНТР» кадра.

  2. Создайте свою кнопку. Добавьте кнопку «PAGE_END» кадра.

Идея менеджеров макетов заключается в том, что вы можете встраивать панели с различными макетами для достижения окончательной компоновки.

Я также согласен с тем, что основная панель с несколькими кнопками должна быть GridBagLayout, так как размер каждого столбца будет составлять ширину самого широкого компонента в столбце вместо того, чтобы сделать каждую ширину столбца одинаковой, что сделает панель лучше выглядеть , Прочтите раздел из руководства Swing по телефону How to Use GridBagLayout для получения дополнительной информации и рабочих примеров.