简体   繁体   English

在CardLayout中设置JTextFields和JButtons位置

[英]Set JTextFields and JButtons position in CardLayout

This is a java template i found about Card Layout 这是我发现的关于卡片布局的java模板

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class Main {

    private static final String CARD_JBUTTON =  "Card JButton";
    private static final String CARD_JTEXTFIELD = "Card JTextField";    
    private static final String CARD_JRADIOBUTTON = "Card JRadioButton";

    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame("Card Layout Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);

        // This JPanel is the base for CardLayout for other JPanels.
        final JPanel contentPane = new JPanel();
        contentPane.setLayout(new CardLayout(200, 200));

        /* Here we be making objects of the Window Series classes
         * so that, each one of them can be added to the JPanel 
         * having CardLayout. 
         */
        Window1 win1 = new Window1();
        contentPane.add(win1, CARD_JBUTTON);
        Window2 win2 = new Window2();
        contentPane.add(win2, CARD_JTEXTFIELD);
        Window3 win3 = new Window3();
        contentPane.add(win3, CARD_JRADIOBUTTON);

        /* We need two JButtons to go to the next Card
         * or come back to the previous Card, as and when
         * desired by the User.
         */
        JPanel buttonPanel = new JPanel(); 
        final JButton previousButton = new JButton("PREVIOUS");
        previousButton.setBackground(Color.BLACK);
        previousButton.setForeground(Color.WHITE);
        final JButton nextButton = new JButton("NEXT");
        nextButton.setBackground(Color.RED);
        nextButton.setForeground(Color.WHITE);

        buttonPanel.add(previousButton);
        buttonPanel.add(nextButton);

        /* Adding the ActionListeners to the JButton,
         * so that the user can see the next Card or
         * come back to the previous Card, as desired.
         */
        previousButton.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent ae)
            {   
                CardLayout cardLayout = (CardLayout) contentPane.getLayout();
                cardLayout.previous(contentPane);
            }
        });
        nextButton.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent ae)
            {
                CardLayout cardLayout = (CardLayout) contentPane.getLayout();
                cardLayout.next(contentPane);   
            }
        });

        // Adding the contentPane (JPanel) and buttonPanel to JFrame.
        frame.add(contentPane, BorderLayout.CENTER);
        frame.add(buttonPanel, BorderLayout.PAGE_END);

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

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowGUI();
            }
        });
    }

And this is my Window1.java 这是我的Window1.java

import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;



class Window1 extends JPanel
{
    /*
     * Here this is our first Card of CardLayout, which will
     * be added to the contentPane object of JPanel, which
     * has the LayoutManager set to CardLayout.
     * This card consists of Two JButtons.
     */  
    private ActionListener action;

    public Window1() 
    {
        init();
    }

    private void init() 
    {
        final JButton clickButton = new JButton("Click ME");
        final JButton dontClickButton = new JButton("DON\'T CLICK ME");     

        final JTextField title = new JTextField(12);

        action = new ActionListener()
        {
            public void actionPerformed(ActionEvent ae)
            {
                if (ae.getSource() == clickButton)
                {
                    String myString = title.getText();
                    System.out.println(myString);
                }
                else if (ae.getSource() == dontClickButton)
                {
                    JOptionPane.showMessageDialog(null, "I told you not to click me!"
                                                        , "Wrong Button", JOptionPane.PLAIN_MESSAGE);
                }
            }
        };

        clickButton.addActionListener(action);
        dontClickButton.addActionListener(action);

        add(clickButton);
        add(dontClickButton);
        add(title);

    }
}

Now my problem is that how do i set the position of the textfields and buttons in Window1? 现在我的问题是如何在Window1中设置文本字段和按钮的位置?

With this code they are set in the center of the view aligned horizontally. 使用此代码,它们被设置在水平对齐的视图的中心。

I tried to use title.setLocation(5,5); 我试着使用title.setLocation(5,5); but it's not working. 但它不起作用。 Any suggestions? 有什么建议么?

Now my problem is that how do i set the position of the textfields and buttons in Window1? 现在我的问题是如何在Window1中设置文本字段和按钮的位置? Rows like Jlabel - JTextField then new row ,and in the end of the page the button 行像Jlabel - JTextField然后新行,并在页面的最后按钮

The thing is you're not using any layout managers. 问题是你没有使用任何布局管理器。 The default layout manager for JPanel is FlowLayout , which will do exactly what you're experiencing (horizontal layout of the components). JPanel的默认布局管理器是FlowLayout ,它将完全符合您的体验(组件的水平布局)。

Getting vertical alignment could be achieved by using different layout managers. 通过使用不同的布局管理器可以实现垂直对齐。 You could use a GridBagLayout for all the component, or a GridLayout , or you could nest JPanel with different layout managers. 您可以对所有组件或GridLayout使用GridBagLayout ,或者可以使用不同的布局管理器嵌套JPanel The possibilities are endless. 可能性是无止境。 It just comes down to the exact look you want. 它只是归结为你想要的确切外观。

See Laying out Components Within a Container to learn how to use different layout managers. 请参阅在容器中布置组件以了解如何使用不同的布局管理器。 I'll give you an example, but don't let it stop you from looking at the tutorials. 我会给你一个例子,但不要让它阻止你看这些教程。 You need to learn them. 需要学习它们。

Also besides just positioning of the components layout managers use dynamic sizing either by respecting the preferred of components are not respecting them. 此外,除了组件布局管理器的定位之外,通过尊重组件的优选组件来使用动态大小调整并不尊重它们。 You can see a picture in this answer of some of the layout managers that do and don't respect preferred sizes. 您可以在一些布局管理器的答案中看到一张图片, 这些图片管理器确实不尊重首选尺寸。

在此输入图像描述

import java.awt.FlowLayout;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class LayoutManagers extends JPanel{

    public LayoutManagers() {
        JLabel label = new JLabel("Text Field");
        JTextField textField = new JTextField(20);
        JRadioButton rb1 = new JRadioButton("Radio 1");
        JRadioButton rb2 = new JRadioButton("Radio 2");
        JButton button = new JButton("Button");

        JPanel panel1 = new JPanel();
        panel1.add(label);
        panel1.add(textField);

        JPanel panel2 = new JPanel();
        panel2.add(rb1);
        panel2.add(rb2);

        JPanel panel3 = new JPanel(new FlowLayout(FlowLayout.TRAILING));
        panel3.add(button);

        JPanel panel4 = new JPanel(new GridLayout(3, 1));
        panel4.add(panel1);
        panel4.add(panel2);
        panel4.add(panel3);

        setLayout(new GridBagLayout());
        add(panel4);     
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new LayoutManagers());
                frame.pack();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLocationByPlatform(true);
                frame.setVisible(true);
            }
        });
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何正确定位 JButton 并调整 JTextField 的大小? - How to correctly position JButtons and size JTextFields? 使用JButton清除JTextField - Using JButtons to clear JTextFields 如何在cardlayout中使用JButton - How to use JButtons with cardlayout 如何将 CardLayout 与多个 JButton 一起使用? - How to use CardLayout with multiple JButtons? 将通用ActionListener添加到许多JButton或JComponents或JTextFields - Add a generic ActionListener to many JButtons or JComponents or JTextFields 为JTextField设置不同的inputVerifier - Set different inputVerifier for JTextFields 是否可以在JFrame中使用JButtons,JTextField等“可移动”/“可拖动”组件? - Is it possible to have “movable”/“draggable” components like JButtons, JTextFields in a JFrame? 如何使用内部ActionListener类向多个JButton和JTextfields添加动作? - How to add actions to multiple JButtons en JTextfields with inner ActionListener classes? JButton需要使用一个数组修改8个JTextField。 听按钮还是文本? - JButtons need to modify 8 JTextFields using an Array. Listen to Buttons or Text? 在绘制的背景上的JPanel中使用JButtons,JLabels和JTextFields - Using JButtons, JLabels, and JTextFields within a JPanel over a painted background
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM