如何在java中对齐不同行中的按钮和复选框

如何在java中对齐不同行中的按钮和复选框,java,layout,Java,Layout,我是一名Java新手,我编写了一个简单的案例转换器程序: import java.awt.*; import java.awt.event.*; import javax.swing.*; public class caseconversion extends JFrame{ private JTextField tf; private JCheckBox boldbox; private JCheckBox italicbox; private JButto

我是一名Java新手,我编写了一个简单的案例转换器程序:

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

public class caseconversion extends JFrame{

    private JTextField tf;
    private JCheckBox boldbox;
    private JCheckBox italicbox;
    private JButton up;
    private JButton low;

    public caseconversion(){

        super ("Case Converter");
        setLayout(new FlowLayout());

        tf=new JTextField("Hello whats up Buddy !!",25);
        tf.setFont(new Font("Segoe Print",Font.PLAIN,15));
        add(tf);
        boldbox = new JCheckBox("Bold");
        italicbox = new JCheckBox("Italic");
        add(boldbox);
        add(italicbox);

        up=new JButton("Upper Case");
        low=new JButton("Lowercase");
        add(up);
        add(low);

        HandlerClass handler = new HandlerClass();
        boldbox.addItemListener(handler);
        italicbox.addItemListener(handler);
        up.addActionListener(
                new ActionListener(){
            public void actionPerformed(ActionEvent event){
                tf.setText(tf.getText().toUpperCase());
            }
        }
                );
        low.addActionListener(
                new ActionListener(){
            public void actionPerformed(ActionEvent event){
                tf.setText(tf.getText().toLowerCase());
            }
        }
       );           
    }

    private class HandlerClass implements ItemListener {
        //For Checkboxes
        public void itemStateChanged(ItemEvent event){
            Font font= null;

            if(boldbox.isSelected()&&italicbox.isSelected())
                font = new Font("Segoe Print",Font.BOLD + Font.ITALIC ,15);
            else if(boldbox.isSelected())
                font = new Font("Segoe Print",Font.BOLD ,15);
            else if(italicbox.isSelected())
                font = new Font("Segoe Print",Font.ITALIC ,15);
            else
                font= new Font("Segoe Print",Font.PLAIN,15);

            tf.setFont(font);

        }
    }
public static void main(String arg[]){

        caseconversion go = new caseconversion();
        go.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        go.setSize(400,250);
        go.setVisible(true);
    }

}

工作正常,但我想在中间显示
JTextField tf
boldbox
italicbok
在中间的下一行,同样地,
JButtons
在中间的第三行,你能告诉我怎么做吗。

如果你使用eclipse,我知道一种帮助我的方法。 JWindowbuilder:

如果不是,你也应该看看这个:

维索里斯你好

我用WindowBuilder更改了它,希望您喜欢:D

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

public class caseconversion extends JFrame {

    private JTextField tf;
    private JCheckBox boldbox;
    private JCheckBox italicbox;
    private JButton up;
    private JButton low;
    private Box verticalBox;
    private Box horizontalBox;
    private Box horizontalBox_1;
    private Box horizontalBox_2;
    private Component horizontalStrut;
    private Component horizontalStrut_1;
    private Component verticalStrut;

    public caseconversion() {

        super("Case Converter");
        HandlerClass handler = new HandlerClass();
        getContentPane().setLayout(
                new BoxLayout(getContentPane(), BoxLayout.X_AXIS));

        verticalBox = Box.createVerticalBox();
        getContentPane().add(verticalBox);

        horizontalBox = Box.createHorizontalBox();
        verticalBox.add(horizontalBox);

        horizontalStrut_1 = Box.createHorizontalStrut(20);
        horizontalBox.add(horizontalStrut_1);

        tf = new JTextField("Hello whats up Buddy !!", 25);
        tf.setMaximumSize(new Dimension(2147483647, 60));
        horizontalBox.add(tf);
        tf.setFont(new Font("Segoe Print", Font.PLAIN, 15));

        horizontalStrut = Box.createHorizontalStrut(20);
        horizontalBox.add(horizontalStrut);

        horizontalBox_1 = Box.createHorizontalBox();
        verticalBox.add(horizontalBox_1);
        boldbox = new JCheckBox("Bold");
        horizontalBox_1.add(boldbox);
        italicbox = new JCheckBox("Italic");
        horizontalBox_1.add(italicbox);
        italicbox.addItemListener(handler);
        boldbox.addItemListener(handler);

        horizontalBox_2 = Box.createHorizontalBox();
        verticalBox.add(horizontalBox_2);

        up = new JButton("Upper Case");
        horizontalBox_2.add(up);
        low = new JButton("Lowercase");
        horizontalBox_2.add(low);

        verticalStrut = Box.createVerticalStrut(20);
        verticalBox.add(verticalStrut);

        low.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                tf.setText(tf.getText().toLowerCase());
            }
        });

        up.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                tf.setText(tf.getText().toUpperCase());
            }
        });

    }

    private class HandlerClass implements ItemListener {
        // For Checkboxes
        public void itemStateChanged(ItemEvent event) {
            Font font = null;

            if (boldbox.isSelected() && italicbox.isSelected())
                font = new Font("Segoe Print", Font.BOLD + Font.ITALIC, 15);
            else if (boldbox.isSelected())
                font = new Font("Segoe Print", Font.BOLD, 15);
            else if (italicbox.isSelected())
                font = new Font("Segoe Print", Font.ITALIC, 15);
            else
                font = new Font("Segoe Print", Font.PLAIN, 15);

            tf.setFont(font);

        }
    }

    public static void main(String arg[]) {

        caseconversion go = new caseconversion();
        go.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        go.setSize(400, 250);
        go.setVisible(true);
    }

}

那么,您可以为JTextField添加BorderLayout,如下所示:

add(tf,BorderLayout.NORTH);
并添加2个JPanel项目:-

private JPanel panel1;
private JPanel panel2;
并将其初始化为构造函数,如下所示:-

panel1  =new JPanel();
panel2  =new JPanel();
并添加此代码

panel1.add(boldbox);
panel1.add(italicbox);
add(panel1,BorderLayout.CENTER);

panel2.add(up);
panel2.add(low);
add(panel2,BorderLayout.SOUTH);
我希望这对您有所帮助。

最简单的解决方案(对原始代码的更改最少)可能是将每一行放入一个JPanel(其中每个JPanel都有一个FlowLayout),并使用GridLayout排列这3个面板

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

public class caseconversion extends JFrame{

    private JTextField tf;
    private JCheckBox boldbox;
    private JCheckBox italicbox;
    private JButton up;
    private JButton low;

    public caseconversion(){

        super ("Case Converter");
        setLayout(new GridLayout(0,1));

        JPanel p = null;

        p = new JPanel();
        tf=new JTextField("Hello whats up Buddy !!",25);
        tf.setFont(new Font("Segoe Print",Font.PLAIN,15));
        p.add(tf);
        add(p);

        p = new JPanel();
        boldbox = new JCheckBox("Bold");
        italicbox = new JCheckBox("Italic");
        p.add(boldbox);
        p.add(italicbox);
        add(p);

        p = new JPanel();
        up=new JButton("Upper Case");
        low=new JButton("Lowercase");
        p.add(up);
        p.add(low);
        add(p);

        HandlerClass handler = new HandlerClass();
        boldbox.addItemListener(handler);
        italicbox.addItemListener(handler);
        up.addActionListener(
            new ActionListener(){
                public void actionPerformed(ActionEvent event){
                    tf.setText(tf.getText().toUpperCase());
                }
            }
            );
        low.addActionListener(
            new ActionListener(){
                public void actionPerformed(ActionEvent event){
                    tf.setText(tf.getText().toLowerCase());
                }
            }
            );           
    }

    private class HandlerClass implements ItemListener {
        //For Checkboxes
        public void itemStateChanged(ItemEvent event){
            Font font= null;

            if(boldbox.isSelected()&&italicbox.isSelected())
                font = new Font("Segoe Print",Font.BOLD + Font.ITALIC ,15);
            else if(boldbox.isSelected())
                font = new Font("Segoe Print",Font.BOLD ,15);
            else if(italicbox.isSelected())
                font = new Font("Segoe Print",Font.ITALIC ,15);
            else
                font= new Font("Segoe Print",Font.PLAIN,15);

            tf.setFont(font);

        }
    }
    public static void main(String arg[]){

        caseconversion go = new caseconversion();
        go.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        go.setSize(400,250);
        go.setVisible(true);
    }

}
请注意,您还必须考虑调整大小的行为。这3行是否应始终横跨框架的整个高度,还是应将其紧凑地推到框架的上边缘


然而,一个普遍的提示(新手似乎低估了这一点)是嵌套:为了实现特定的布局而创建一个新的JPanel没有什么错。通常,实现这一点的更“干净”的解决方案是将几个GUI组件按逻辑分组(而不是重复使用像我在示例中使用的
JPanel p
这样的辅助变量)。

您需要一个LayoutManager。搜索并学习:D