Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 包含卡片布局的网格布局-可以吗?_Java_Swing_Jframe_Grid Layout_Cardlayout - Fatal编程技术网

Java 包含卡片布局的网格布局-可以吗?

Java 包含卡片布局的网格布局-可以吗?,java,swing,jframe,grid-layout,cardlayout,Java,Swing,Jframe,Grid Layout,Cardlayout,目标是显示一个单元格表,其中所有单元格相互独立,每个单元格都有几个可选的显示(想象一个Kakuro板、jeopardy板、ext.) 这是我第一次尝试荡秋千。经过大量阅读,我决定我的方法将是首先使用卡片布局(这部分我很满意)独立设计每个单元,然后将其“包装”到网格布局中。 这可能就是我对基本Swing缺乏理解的原因: 设计每个单元时,我会创建一个框架并向其中添加一个面板: import javax.swing.*; import java.awt.*; import ja

目标是显示一个单元格表,其中所有单元格相互独立,每个单元格都有几个可选的显示(想象一个Kakuro板、jeopardy板、ext.)

这是我第一次尝试荡秋千。经过大量阅读,我决定我的方法将是首先使用卡片布局(这部分我很满意)独立设计每个单元,然后将其“包装”到网格布局中。 这可能就是我对基本Swing缺乏理解的原因:

设计每个单元时,我会创建一个框架并向其中添加一个面板:

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

    public class Cell extends Component{

    JFrame frame = new JFrame();

    /* we'll use a card layout with a panel for each look of the cell */
    CardLayout cardLayout = new CardLayout();
    JPanel containterPanel = new JPanel();
    JPanel firstPanel = new JPanel();
    JPanel secondPanel = new JPanel();
    JPanel thridpanel = new JPanel();

    public  Cell(){

        /* assign the card layout to the container panel */
        containterPanel.setLayout(cardLayout);

        /* assign objects to the different panels - details not important for the sake of the question */
        //....

        /* add the different panels to the container panel and show the initial one */
        containterPanel.add(firstPanel, "firstPanel");
        containterPanel.add(secondPanel, "secondPanel");
        containterPanel.add(thridpanel, "thridpanel");
        cardLayout.show(containterPanel, "firstPanel");

        /* add the container to the frame and display it*/
        frame.add(containterPanel);
        frame.setVisible(true);
    }
}
这表现得很好。 但我试图将其包装在网格布局中,其中每个单元格的行为如下所示,这是非常笨拙的:

import java.awt.*;


public class Board{

    private static final int COLUMNS_NUM = 3;
    private static final int ROWS_NUM = 3;

    JFrame frame = new JFrame();
    JPanel panel = new JPanel();
    Cell cells[] = new Cell[COLUMNS_NUM * ROWS_NUM];

    public Board(){

        panel.setLayout(new GridLayout(ROWS_NUM, COLUMNS_NUM));
        for (int i = 0; i <ROWS_NUM * COLUMNS_NUM; i++)
        {
            cells[i] = new Cell();
            panel.add(cells[i]);
        }

        frame.add(panel);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        new Board();
    }

}
import java.awt.*;
公共班级委员会{
私有静态final int COLUMNS_NUM=3;
私有静态final int ROWS_NUM=3;
JFrame=新JFrame();
JPanel面板=新的JPanel();
单元格[]=新单元格[列数*行数];
公共委员会(){
setLayout(新的GridLayout(行数,列数));

对于(int i=0;i如果要将单元格添加到电路板,请将其设置为JPanel,而不是JFrame


举个例子:

import java.awt.CardLayout;
import javax.swing.JLabel;
import javax.swing.JPanel;

//make it a sub class of JPanel for easier implementation. 
public class Cell extends JPanel{

    public  Cell(){

        JPanel firstPanel = new JPanel();
        //add a lable just so something is displayed
        firstPanel.add(new JLabel(("Panel 1"))); 
        JPanel secondPanel = new JPanel();
        JPanel thridpanel = new JPanel();

        CardLayout cardLayout = new CardLayout();
        /* assign the card layout */
        setLayout(cardLayout);
    
        /* add the different panels to the container panel and show the initial one */
        add(firstPanel, "firstPanel");
        add(secondPanel, "secondPanel");
        add(thridpanel, "thridpanel");
        cardLayout.show(this, "firstPanel");
    }
}
以及一块板,用于固定电池:

    import java.awt.Dimension;
import java.awt.GridLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;


//make it a sub class of JFrame for easier implementation.
public class Board extends JFrame{

    private static final int COLUMNS_NUM = 3;
    private static final int ROWS_NUM = 3;

    Cell cells[] = new Cell[COLUMNS_NUM * ROWS_NUM];

    public Board(){

        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setPreferredSize(new Dimension(800, 800));

        JPanel panel = new JPanel();
        add(panel);  //or better    getContentPane().add(panel);
        panel.setLayout(new GridLayout(ROWS_NUM, COLUMNS_NUM));

        for (int i = 0; i <(ROWS_NUM * COLUMNS_NUM); i++)
        {
            cells[i] = new Cell();
            panel.add(cells[i]);
        }

        pack();
        setVisible(true);
    }

    public static void main(String[] args) {
        new Board();
    }
}
导入java.awt.Dimension;
导入java.awt.GridLayout;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.WindowConstants;
//使其成为JFrame的子类,以便于实现。
公共类板扩展JFrame{
私有静态final int COLUMNS_NUM=3;
私有静态final int ROWS_NUM=3;
单元格[]=新单元格[列数*行数];
公共委员会(){
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
设置首选尺寸(新尺寸(800800));
JPanel面板=新的JPanel();
添加(面板);//或者更好的getContentPane()。添加(面板);
setLayout(新的GridLayout(行数,列数));

对于(inti=0;i1)“包含卡片布局的网格布局-可以完成吗?”是。2)为了更快地获得更好的帮助,请发布一个or。谢谢@AndrewThompson,这里相对较新-我做了一些小的编辑,我相信它现在满足了“最小、完整和可验证”的要求。如果没有,请让我知道。如果要将单元格添加到棋盘上,请将其制作为JPanel,而不是JFramel。通常,您绘制一个游戏板,其中的单元格可以具有不同的功能值。请参阅和我的Swing文章。谢谢,这让我找到了方向。在你的建议中,卡片布局包含三个面板,没有父容器-如果我理解正确,拥有这样的容器面板是支持卡片之间转换的正确方法。因此,我所做的是:panel.add(cells[I].containterPanel);而不是这个:panel.add(cells[i]);这就是它所做的一切-添加容器面板,而不是单元格本身(在我的版本中,单元格本身并没有扩展Jpanel)。我很高兴它有帮助。向上投票给您的问题,因为它是格式良好的。