Устанавливать несколько Layouts в окне Java

Я пробую сочетать в том же окне два JPannel, чтобы, в один вводит один GridLayout и в другой власти помещать один JButton что не был включен в Grid.

Вид Grid появляется правильно, но JButton он не появляется в окне.

Код - следующий:

public class Interface extends JFrame {
//-----ATRIBUTOS-----
private JPanel contentPane;
private JPanel panel2;
private GridLayout gridLayout;
private BorderLayout borderLayout;
private JButton jButton;

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                Interface frame = new Interface();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

//----------CONSTRUCTOR--------
public Interface(){
    setTitle("Sudoku");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(25,25,650,430); 
    contentPane = new JPanel();
    panel2 = new JPanel();
    panel2.setBorder(new EmptyBorder(400,250,20,20));
    setContentPane(panel2);
    contentPane.setBorder(new EmptyBorder(5,5,150,300)); 
    setContentPane(contentPane);
    contentPane.setLayout(null);

    //Establecemos el gridLayout
    gridLayout = new GridLayout(5, 5);
    contentPane.setLayout(gridLayout);
    //Rellenamos el gridLayout
    for (int i =0;i<gridLayout.getRows();i++){
        for (int j=0;j<gridLayout.getColumns();j++){
            contentPane.add(new JTextField());
        }
    }


    //Establecemos el borderLayout
    borderLayout = new BorderLayout();
    panel2.setLayout(borderLayout);

    //Botón de validar
    jButton = new JButton("VALIDAR");
        jButton.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {

        }
    });
    jButton.setBounds(0, 0, 100,150);
    panel2.add(jButton);


}
}
1
задан 08.10.2016, 14:26
2 ответа

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

 setContentPane(panel2);
 setContentPane(contentPane);

После этих двух линий кода, JFrame , все compontentes, которые ты добавишь к твоему JFrame, приспособятся к Layout, установленному для contentPane именно поэтому, если ты делаешь один

contentPane.add(jButton); /* o add(jButton); se añadira al Layaout Grid*/
panel2.add(jButton); /* No se visualizará ya que no fue añadido al JFrame*/

Чтобы Организовывать Лучше твои Контейнеры включая ты JFrame необходимо использовать Layouts, Строитель мог бы оставаться таким

public Interface(){
   setTitle("Sudoku");
   setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   setBounds(25,25,650,430); 
   setLayout(new BorderLayout());
   contentPane = new JPanel();
   panel2 = new JPanel(new BorderLayout());
//Establecemos el gridLayout
   gridLayout = new GridLayout(5, 5);
   contentPane.setLayout(gridLayout);
//Rellenamos el gridLayout
  for (int i =0;i<gridLayout.getRows();i++){
    for (int j=0;j<gridLayout.getColumns();j++){
        contentPane.add(new JTextField());
    }
}
//Botón de validar
  jButton = new JButton("VALIDAR");
    jButton.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent e) {

    }
});
  panel2.add(jButton, BorderLayout.CENTER);
  add(contentPane,BorderLayout.CENTER);
  add(panel2,BorderLayout.WEST);
}
2
ответ дан 24.11.2019, 13:10

Хорошие, тебе остается добавлять кнопку к grid, добавляет эта линию contentPane.add(jButton); тогда ты будешь виден. :)

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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

public class Interface extends JFrame {
//-----ATRIBUTOS-----
private JPanel contentPane;
private JPanel panel2;
private GridLayout gridLayout;
private BorderLayout borderLayout;
private JButton jButton;

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                Interface frame = new Interface();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

//----------CONSTRUCTOR--------
public Interface(){
    setTitle("Sudoku");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(25,25,650,430); 
    contentPane = new JPanel();
    panel2 = new JPanel();
    panel2.setBorder(new EmptyBorder(400,250,20,20));
    setContentPane(panel2);
    contentPane.setBorder(new EmptyBorder(5,5,150,300)); 
    setContentPane(contentPane);
    contentPane.setLayout(null);
    //Establecemos el gridLayout
    gridLayout = new GridLayout(5, 5);
    contentPane.setLayout(gridLayout);
    //Rellenamos el gridLayout
    for (int i =0;i<gridLayout.getRows();i++){
        for (int j=0;j<gridLayout.getColumns();j++){
            contentPane.add(new JTextField());
        }
    }


    //Establecemos el borderLayout
    borderLayout = new BorderLayout();
    panel2.setLayout(borderLayout);

    //Botón de validar
    jButton = new JButton("VALIDAR");
        jButton.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {

        }
    });
    jButton.setBounds(0, 0, 100,150);
    panel2.add(jButton);
    contentPane.add(jButton);


}
}

0
ответ дан 24.11.2019, 13:10
  • 1
    Не является этим soluci и # 243; n. Сделав это, я в и # 241; ade bot и # 243; n как элемент Grid. Я хочу в и # 241; adirlo отдельно, что не был элементом Grid. –  Iván García 08.10.2016, 20:00