【问题标题】:JPanel inside JPanel in JAVAJAVA中的JPanel里面的JPanel
【发布时间】:2018-06-10 03:34:12
【问题描述】:
  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);
    }

我想做一个记忆游戏,我需要在 4x5 的 JPanel 的每个单元格中放置两个图像。为此,我创建了一个 JPanel 1x2,里面有两个图像,并将其放在 4x5 的 JPanel 中。但结果是:

结果:

【问题讨论】:

    标签: java user-interface interface jpanel


    【解决方案1】:

    所以,如果理解正确,你的问题是,你没有看到 20 个新面板,只有一个。

    问题是,一个组件只能驻留在一个容器中,一次,所以做类似...

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

    相当于做类似...

    panel.add(panel2);
    

    您实际上需要在循环的每次迭代中创建组件的新实例

    我建议您做的是创建一个可以包含两个图像的“包装”或“卡片”面板。在我的测试中,我只使用了彩色面板,但你明白了......

    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);
    

    你最终会得到类似......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-12
      • 2023-04-04
      • 2013-06-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多