【问题标题】:Gui trouble with button layoutGui 按钮布局的问题
【发布时间】:2016-04-13 23:10:08
【问题描述】:

我正在尝试使用流布局来制作一个以单列定向的菜单屏幕,但是每当我添加一个按钮时,它都会将其添加到单行中。

import java.awt.CardLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Proj 
{
    JPanel card1,card2; 
    ActionListener listener;
    JFrame menu;
    JFrame catagories;
    JButton menu1,addOrTake,cata,payd,showd;
    //JButton 
    public Proj(){


        card2=new JPanel();


        menu = new JFrame("Card Layout");
        catagories = new JFrame();

        //final Container contentPane = menu.getContentPane();
        final CardLayout layout = new CardLayout();
        menu.setLayout(layout);
        card1=new JPanel();

        menu1 = new JButton("");
        menu1.setIcon(new ImageIcon("C:/Users/sabar/Menu.jpg"));
        menu1.setSize(60,600);
        menu1.setVisible(true);

        addOrTake = new JButton();
        addOrTake.setIcon(new ImageIcon("C:/Users/Public/Pictures/Sample       Pictures/Penguins.jpg"));

        cata = new JButton("");
        cata.setIcon(new ImageIcon("C:/Users/Public/Pictures/Sample Pictures/Penguins.jpg"));

        showd = new JButton("");
        showd.setIcon(new ImageIcon("C:/Users/Public/Pictures/Sample Pictures/Penguins.jpg"));

        payd = new JButton("");
        payd.setSize(60, 600);
        payd.setIcon(new ImageIcon("C:/Users/Public/Pictures/Sample Pictures/Penguins.jpg"));
        payd.setVisible(true);

        card1.add(menu1);
        card1.add(addOrTake);
        card1.add(cata);
        card1.add(showd);
        card1.add(payd);

        menu1.addActionListener(listener);
        addOrTake.addActionListener(listener);
        cata.addActionListener(listener);
        showd.addActionListener(listener);
        payd.addActionListener(listener);

        listener = new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg0) {}};
            // TODO Auto-generated method stub



            menu.setSize(60, 600);
            menu.setVisible(true);
            JButton poo=new JButton("Poo");
            poo.setSize(60,600);
            card2.add((poo));
            card2.add(new JButton("Pee"));
            card2.add(new JButton("Per"));
            card2.add(new JButton("POt"));
            card2.setVisible(false);
            menu.add(card2);

            menu.add(card1);
            catagories.pack();
            menu.pack();
            card1.setVisible(false);


    }
    public static void main(String[]args)
    {
        Proj poop =new Proj();
    }
}

【问题讨论】:

  • 也许使用GridBagLayout 代替

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


【解决方案1】:

问题:

  • 您正在将组件添加到菜单,即使用 CardLayout 的容器,而不使用第二个参数字符串常量。没有这个,可能很难轻松交换“卡片”(组件)。
  • 如果您想要单列类型的布局,则需要使用允许这样做的布局管理器,而 JPanel 默认布局不是这样。更好的选择:
    • GridLayout(0, 1) 用于可变行数,一列
    • BoxLayout(Container, BoxLayout.PAGE_AXIS)
    • GridBagLayout 具有正确的 GridBagConstraint gridx 和 gridy 属性。

【讨论】:

  • 我对 java 还很陌生。是否可以同时进行卡片布局和网格布局?我需要在菜单屏幕之间切换。
  • @KenM:当然。只需在“卡片”JPanel 之一中使用 GridLayout,然后使用 JPanel 将其添加到 CardLayout。但是您的问题和代码告诉我们您根本没有阅读布局管理器教程,并且您想先这样做。
  • @KenM 每个布局将负责一个单独的容器,因此CardLayout 将负责card1card2 组件,GridBagLayout 将负责按钮
【解决方案2】:

首先使用能够实现您的结果的布局管理器。

首先查看Laying Out Components Within a ContainerHow to Use GridLayoutHow to Use GridBagLayout 以获得一些想法。

import java.awt.CardLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Proj {

    JPanel card1, card2;
    ActionListener listener;
    JButton menu1, addOrTake, cata, payd, showd;
    //JButton 

    JFrame menu;

    public Proj() {

        menu = new JFrame("Card Layout");

        //final Container contentPane = menu.getContentPane();
        final CardLayout layout = new CardLayout();
        menu.setLayout(layout);
        card1 = new JPanel(new GridBagLayout());
        card2 = new JPanel(new GridBagLayout());

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridwidth = GridBagConstraints.REMAINDER;
        gbc.fill = GridBagConstraints.HORIZONTAL;

        menu1 = new JButton("Mneu");
        menu1.setVisible(true);

        addOrTake = new JButton("Add or take");
        cata = new JButton("Cata");
        showd = new JButton("ShowD");
        payd = new JButton("payd");

        card1.add(menu1, gbc);
        card1.add(addOrTake, gbc);
        card1.add(cata, gbc);
        card1.add(showd, gbc);
        card1.add(payd, gbc);

        menu1.addActionListener(listener);
        addOrTake.addActionListener(listener);
        cata.addActionListener(listener);
        showd.addActionListener(listener);
        payd.addActionListener(listener);

        listener = new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg0) {
            }
        };
        // TODO Auto-generated method stub

        JButton poo = new JButton("Poo");
        card2.add((poo), gbc);
        card2.add(new JButton("Pee"), gbc);
        card2.add(new JButton("Per"), gbc);
        card2.add(new JButton("POt"), gbc);

        menu.add(card2, "Card2");
        menu.add(card1, "Card1");

        layout.show(menu.getContentPane(), "Card1");

        menu.pack();
        menu.setLocationRelativeTo(null);
        menu.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                Proj poop = new Proj();
            }
        });
    }
}

我还会仔细查看 How to Use CardLayout 以了解有关其工作原理的更多详细信息,因为您使用错误

【讨论】:

  • 谢谢,这真的很有帮助。我现在正在修复它的路上:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多