JPanel внутри JPanel в ЯВА - PullRequest
0 голосов
/ 10 июня 2018
  public static void main(String[] args) {
      JTextField text = new JTextField();
      JFrame frame = new JFrame();
      frame.setLayout(new BorderLayout());      
      JPanel panel = new JPanel();
      panel.setLayout(new GridLayout(5, 4));
      JPanel panel2 = new JPanel();
      panel2.setLayout(new FlowLayout());



      JLabel imgLabel1 = new JLabel(new ImageIcon("C:\\Users\\Arthur\\Downloads\\abs.jpg"));
      JLabel imgLabel2 = new JLabel(new ImageIcon("C:\\Users\\Arthur\\Downloads\\abss.jpg"));


      imgLabel1.setPreferredSize(new Dimension(100,100));
      imgLabel2.setPreferredSize(new Dimension(100,100));

      panel2.add(imgLabel1);
      panel2.add(imgLabel2);


      for(int i=0; i<20; i++){
          panel.add(panel2);
      }


      frame.add(text, BorderLayout.NORTH);
      frame.add(panel, BorderLayout.CENTER);      
      frame.setPreferredSize(new Dimension(1280,700));
      frame.pack();
      frame.setVisible(true);      
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

Я хочу сделать игру на память, мне нужно поместить два изображения в каждую ячейку JPanel размером 4x5.Для этого я создал JPanel 1x2 с двумя изображениями внутри и поместил его в JPanel 4x5.Но результат:

Результат:

enter image description here

1 Ответ

0 голосов
/ 10 июня 2018

Итак, если вы правильно поняли, вы проблема в том, что вы не видите 20 новых панелей, только одну.

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

for (int i = 0; i < 20; i++) {
    panel.add(panel2);
}

равносильно выполнению чего-то вроде ...

panel.add(panel2);

На самом деле вам нужно создавать новый экземпляр компонента на каждой итерацииloop

Я хотел бы предложить вам создать панель «обертка» или «карточка», которая может содержать два изображения.В моем тестировании я просто использовал цветные панели, но вы поняли ...

public class WrapperPane extends JPanel {

    public WrapperPane() {
        setLayout(new FlowLayout());
        add(makePanel(Color.RED));
        add(makePanel(Color.GREEN));
        // This is just for demonstration purposes
        setBorder(new LineBorder(Color.DARK_GRAY));
    }

    protected JPanel makePanel(Color background) {
        JPanel panel = new JPanel();
        panel.setBackground(background);
        panel.setPreferredSize(new Dimension(100, 100));
        return panel;
    }

}

Вы просто должны сделать что-то вроде ...

JTextField text = new JTextField();
JFrame frame = new JFrame();
frame.setLayout(new BorderLayout());
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(5, 4));

for (int i = 0; i < 20; i++) {
    panel.add(new WrapperPane());
}

frame.add(text, BorderLayout.NORTH);
frame.add(panel, BorderLayout.CENTER);
// Don't do this, just let the content make it's own
// calculations
//frame.setPreferredSize(new Dimension(1280, 700));
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

И выв конечном итоге что-то вроде ...

Pretty

...