将按钮和文本放在新行上,并将它们移动到java中的屏幕底部

时间:2013-10-27 16:37:54

标签: java swing cardlayout

我最近开始使用Java编程,并且正在尝试创建登录屏幕。但是,我无法弄清楚如何创建一个新行来放置我的按钮和文本。另外,我想将它们移到JPanel的右下角。我为我糟糕的措辞道歉,希望你能从我的代码中看出我的意思。请提前帮助并表示感谢。

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

public class CardLayoutDemo implements ItemListener {
JPanel cards;
final static String BUTTONPANEL = "Card with JButtons";

public void addComponentToPane(Container pane) {

    JPanel card1 = new JPanel();
    card1.add(new JLabel("Username:"));
    card1.add(new JTextField("Username", 10));
    card1.add(new JButton("Login")); //end line here
    //New line
    card1.add(new JLabel("Password:"));
    card1.add(new JTextField("Password", 10));
    card1.add(new JButton("Register")); //end line here
    //New line
    card1.add(new JCheckBox());
    card1.add(new JLabel("Remember credentials"));


    cards = new JPanel(new CardLayout());
    cards.add(card1, BUTTONPANEL);

    pane.add(cards, BorderLayout.BOTTOM_RIGHT);// Add cards to bottom right hand corner.
}

public void itemStateChanged(ItemEvent evt) {
    CardLayout cl = (CardLayout)(cards.getLayout());
    cl.show(cards, (String)evt.getItem());
}

private static void createAndShowGUI() {
    JFrame frame = new JFrame("Login");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    CardLayoutDemo demo = new CardLayoutDemo();
    demo.addComponentToPane(frame.getContentPane());

    frame.pack();
    frame.setVisible(true);
}

public static void main(String[] args) {

    try {

        UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
    } catch (UnsupportedLookAndFeelException ex) {
        ex.printStackTrace();
    } catch (IllegalAccessException ex) {
        ex.printStackTrace();
    } catch (InstantiationException ex) {
        ex.printStackTrace();
    } catch (ClassNotFoundException ex) {
        ex.printStackTrace();
    }

    UIManager.put("swing.boldMetal", Boolean.FALSE);

    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            createAndShowGUI();
        }
    });
}
}

3 个答案:

答案 0 :(得分:5)

如图here所示,您可以将top-level container放置在屏幕的右下方。将您自己的组件替换为getPreferredSize()中提到的占位符。另外,考虑JToolBar,它可以在许多实现上浮动。

附录:我想将按钮移动到 JPanel的右下角,不要将 JPanel 移动到屏幕的底部。

FlowLayout.RIGHT指定card1会显示结果。在内容窗格CardLayout中替换面板BorderLayout.CENTER

image

public void addComponentToPane(Container pane) {

    JPanel card1 = new JPanel(new FlowLayout(FlowLayout.RIGHT));
    …
    pane.add(new JPanel() {
        @Override // placeholder for actual content
        public Dimension getPreferredSize() {
            return new Dimension(800, 200);
        }
    }, BorderLayout.CENTER);
    pane.add(cards, BorderLayout.PAGE_END);
}

附录:这是您的示例的更新。

public void addComponentToPane(Container pane) {
    …
    pane.add(cards, BorderLayout.PAGE_END);
}
…
private static void createAndShowGUI() {
    JFrame frame = new JFrame("Login");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    // Move frame to lower right corner of screen
    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
    GraphicsDevice defaultScreen = ge.getDefaultScreenDevice();
    Rectangle rect = defaultScreen.getDefaultConfiguration().getBounds();
    int x = (int) rect.getMaxX() - frame.getWidth();
    int y = (int) rect.getMaxY() - frame.getHeight();
    frame.setLocation(x, y);

    CardLayoutDemo demo = new CardLayoutDemo();
    demo.addComponentToPane(frame.getContentPane());

    frame.pack();
    frame.setVisible(true);
}

答案 1 :(得分:3)

<强>建议:

  1. BorderLayout没有此类约束BorderLayout.BOTTOM_RIGHT

    • BorderLayout.SOUTH:将组件放在容器底部
    • BorderLayout.EAST:将组件放在容器的右侧
    • BorderLayout.NORTH:将组件放在容器顶部
    • BorderLayout.WEST:将组件放在容器的右侧
    • BorderLayout.CENTER:将组件放在容器的中间

    如果您想根据自己的意愿定位组件,请在哪里定位 组件将按顺序出现,相对于每个组件定位 另外,您需要响应Main Container的重新调整大小 learn about Layout Manager首先。

  2. 了解事件监听器。而不是将ItemListener实现为没有此类侦听器的JPanel / Top级别,而是将其实现为具有命名约定MyItemListener implements ItemListener的新类,并创建要添加{{1}的新实例使用匿名类的方法将它们添加到内联函数中。

    addItemListener(listener)

    checkBox.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { // put your code } }); 适用于与ItemListener合作的组件,即itemCheckBox等。还存在其他类型的偶数侦听器,例如ComboBoxActionListener

  3. 教程资源:

    1. Writing Event Listeners
    2. Using Layout Managers

答案 2 :(得分:1)

我已将您的代码修改为以下内容:

package sandbox;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.GridLayout;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class LoginLayoutDemo
{
    JPanel cards;

    public void addComponentToPane(Container pane)
    {
        // Panel for text and fields
        JPanel textAndFieldsPanel = new JPanel();
        textAndFieldsPanel.setLayout(new GridLayout(2,2));
        textAndFieldsPanel.add(new JLabel("Username ", JLabel.RIGHT));
        textAndFieldsPanel.add(new JTextField("Username", 10));
        textAndFieldsPanel.add(new JLabel("Password ", JLabel.RIGHT));
        textAndFieldsPanel.add(new JPasswordField("password", 10));

        JPanel controlsPanel = new JPanel();
        controlsPanel.setLayout(new BoxLayout(controlsPanel, BoxLayout.PAGE_AXIS));

        controlsPanel.add(textAndFieldsPanel);
        controlsPanel.add(new JCheckBox("Remember credentials"));

        JPanel bottomPanel = new JPanel();

        bottomPanel.add(controlsPanel);
        bottomPanel.add(new JButton("Login")); // end line here

        bottomPanel.add(new JButton("Register")); // end line here

        cards = new JPanel(new BorderLayout());
//      cards.setLayout(new BorderLayout(cards, BoxLayout.LINE_AXIS));
        cards.add(bottomPanel, BorderLayout.LINE_END);

        pane.add(cards, BorderLayout.PAGE_END);   // BOTTOM_RIGHT);// Add cards to bottom right hand
                                                                                                // corner.
    }

    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame("Login");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//      CardLayoutDemo demo = new CardLayoutDemo();
        new LoginLayoutDemo().addComponentToPane(frame.getContentPane());

        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args)
    {

        try
        {

            UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
        } catch (UnsupportedLookAndFeelException ex)
        {
            ex.printStackTrace();
        } catch (IllegalAccessException ex)
        {
            ex.printStackTrace();
        } catch (InstantiationException ex)
        {
            ex.printStackTrace();
        } catch (ClassNotFoundException ex)
        {
            ex.printStackTrace();
        }

        UIManager.put("swing.boldMetal", Boolean.FALSE);

        javax.swing.SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowGUI();
            }
        });
    }
}

你真的需要了解LayoutManagers - Oracle / Java站点有一个不错的,并且还有其他的可用。我认为他们中的大多数做得最不好的事情是整体解释管理者的用途以及如何用他们设计事物 - 他们倾向于直接投入代码。

LayoutManager应用于Container,并告诉它如何处理添加到它的组件。 FlowLayout和BoxLayout倾向于按照您选择的水平或垂直方式排列。 GridLayout在表格中列出了一些内容,网格中的所有“单元格”大小相同。 BorderLayout有一个中心部分和一个部分,分别用于N,S,E和W; N,S水平拉伸,E,W垂直拉伸;所有这四个都从其包含的组件中获取其他维度,并且BorderLayout的中心在两个方向上伸展以填充其容器中的可用空间。有GroupLayout和GridBagLayout等,它们都是为解决UI设计中的一些问题或一组问题而设计的,你需要了解它们为设计Swing UI所做的工作。

某些教程的内容但没有真正解释:每个容器都有一个布局管理器,但容器可以是另一个容器中的组件,封闭容器可以有不同的布局管理器。这就是我们在这里所做的;整个框架的BorderLayout将我们构建的面板放在底部,而我们面板中的右对齐面板将它们放在右边;这就是他们如何到达右下角。

你可能意味着你的其他控件在其他线上;我会把这样做作为锻炼对你...祝你好运。

还有一件事:CardLayout适用于某种情况下,由于某种原因,两个或多个面板排列在彼此的顶部,即一个面板遮挡另一个面板。你在用户界面中没有这样的需求,所以我取消了CardLayout经理。

相关问题