【问题标题】:Trying to add multiple JPanels into one main JPanel and set the border layout尝试将多个 JPanel 添加到一个主 JPanel 并设置边框布局
【发布时间】:2015-06-02 18:08:48
【问题描述】:

我目前正在构建一台 ATM 机,但在设置多个 JPanel 的边框布局时遇到了问题。基本上我想让我的照片看起来像这样

但是当我运行它时,它看起来像这样:

这是我尝试执行此操作的代码。

public Main() {

    try {
        atmPicture = ImageIO.read(new File("atmpicture.jpg"));
        welcomeScreen = ImageIO.read(new File("Welcome Screen.jpg"));
        enterAccScreen = ImageIO.read(new File("Account Number.jpg"));
        mainButtons = ImageIO.read(new File("Main Screen.jpg"));
        withdrawScreen = ImageIO.read(new File("R2 click.jpg"));
        depositScreen = ImageIO.read(new File("R3 click.jpg"));
        transferScreen = ImageIO.read(new File("R4 click.jpg"));
        accInfoScreen = ImageIO.read(new File("L1 Click.jpg"));
        withdrawScreen2 = ImageIO.read(new File("R2.2 Click.jpg"));
    } catch (IOException ex) {
        System.out.println("The file cannot read2");
        System.exit(1);
    }


    panel1 = new JPanel(new GridLayout(4, 3)); //numpad
    panel2 = new JPanel(new GridLayout(3, 1)); //left three buttons
    panel3 = new JPanel(new GridLayout(3, 1)); // right three buttons
    panelMain = new JPanel(new GridLayout(0, 3)); // textfield


    jtf.setHorizontalAlignment(SwingConstants.LEFT);
    jtf.setPreferredSize(new Dimension(10, 10));
    initButtons();
}

/**
 * Initializes all the buttons and adds them to the 
 */
private void initButtons() {

    panel1.add(b1);
    panel1.add(b2);
    panel1.add(b3);
    panel1.add(b4);
    panel1.add(b5);
    panel1.add(b6);
    panel1.add(b7);
    panel1.add(b8);
    panel1.add(b9);
    panel1.add(ba);
    panel1.add(b0);
    panel1.add(bp);

    panel2.add(l1);
    panel2.add(l2);
    panel2.add(l3);

    panel3.add(r1);
    panel3.add(r2);
    panel3.add(r3);

    Database cData = new Database();
    cData.storeData();

    ButtonListener listener = new ButtonListener(cData);

    b1.addActionListener(listener);
    b2.addActionListener(listener);
    b3.addActionListener(listener);
    b4.addActionListener(listener);
    b5.addActionListener(listener);
    b6.addActionListener(listener);
    b7.addActionListener(listener);
    b8.addActionListener(listener);
    b9.addActionListener(listener);
    b0.addActionListener(listener);
    ba.addActionListener(listener);
    bp.addActionListener(listener);
    l1.addActionListener(listener);
    l2.addActionListener(listener);
    l3.addActionListener(listener);
    r1.addActionListener(listener);
    r2.addActionListener(listener);
    r3.addActionListener(listener);

    setLayout(new BorderLayout());


    panelMain.add(panel1, BorderLayout.PAGE_END);
    panelMain.add(panel2, BorderLayout.LINE_START);
    panelMain.add(panel3, BorderLayout.LINE_END);
    panelMain.add(jtf, BorderLayout.CENTER);

    add(panelMain);

}

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {

            public void run() {

                Image upper = null;
                Image right = null;
                Image left = null;
                Image bottom = null;
                //Image middle = null;
                JFrame frame = new JFrame();
                try {
                    upper = ImageIO.read(new File("upper portion.jpg"));
                    right = ImageIO.read(new File("right portion.jpg"));
                    left = ImageIO.read(new File("left portion.jpg"));
                    bottom = ImageIO.read(new File("bottom portion.jpg"));
                    //middle = ImageIO.read(new File("middle portion.jpg"));
                } catch (IOException ex) {
                    System.out.println("The file cannot read");
                    System.exit(1);
                }

                JLabel labelTop = new JLabel(new ImageIcon(upper));
                JLabel labelRight = new JLabel(new ImageIcon(right));
                JLabel labelLeft = new JLabel(new ImageIcon(left));
                JLabel labelBottom = new JLabel(new ImageIcon(bottom));
                //JLabel labelMiddle = new JLabel(new ImageIcon(middle));

                labelTop.setLayout(new BorderLayout());
                labelRight.setLayout(new BorderLayout());
                labelLeft.setLayout(new BorderLayout());
                labelBottom.setLayout(new BorderLayout());
                //labelMiddle.setLayout(new BorderLayout());

                frame.add(labelTop, BorderLayout.PAGE_START);
                frame.add(labelLeft, BorderLayout.LINE_START);
                frame.add(labelRight, BorderLayout.LINE_END);
                frame.add(labelBottom, BorderLayout.PAGE_END);
                frame.add(new Main(), BorderLayout.CENTER);

                frame.setSize(1041, 1200);
                frame.setVisible(true);
            }
        });

}

【问题讨论】:

  • 使用 JLayer 将“按任意键继续”消息放在布局顶部
  • @Rocketq 我需要 10 声望才能发布图片。
  • @ControlAltDel 谢谢。但我还需要能够将按钮移动到特定位置。
  • 1) 为了尽快获得更好的帮助,请发布MCVE(最小完整可验证示例)或SSCCE(简短、自包含、正确示例)。 2) 例如,获取图像的一种方法是热链接到this Q&A 中看到的图像,但是大多数图像(例如用作图标)对于布局问题不是必需的。

标签: java swing user-interface jpanel layout-manager


【解决方案1】:
panelMain = new JPanel(new GridLayout(0, 3)); 

您将 panelMain 的布局设置为 GridLayout();

panelMain.add(panel1, BorderLayout.PAGE_END);
panelMain.add(panel2, BorderLayout.LINE_START);
panelMain.add(panel3, BorderLayout.LINE_END);
panelMain.add(jtf, BorderLayout.CENTER);

但是你把 panelMain 当作一个 BorderLayout。您不能随意使用 BorderLayout 约束。

如果您希望 panelMain 使用 BorderLayout 则使用 BorderLayout 创建它:

panelMain = new JPanel(new BorderLayoutLayout()); 

【讨论】:

  • 哇,我简直不敢相信我看到了过去。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-09
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多