如何在java中使标签和文本字段显示在边界布局中



如何使Jtextfiels、Jlabels和JtextArea显示在边界布局中?我想把我的标签1放在北部,文本区放在东部,其余的放在西部。问题是它们没有出现,我的文本字段似乎被挤在了左边。

这是我的代码:

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.io.*;
public class ReliefFrame extends JFrame
{
    ReliefCenter s = new ReliefCenter("JavaCup");
    JPanel row;
    JPanel roww;
    JPanel rowww;
    JPanel rowwww;
    JLabel Label1;
    JLabel Label2;
    JLabel Label3;
    JLabel Label4;
    JButton[] button=new JButton[5];
    JTextField aTextField;
    JTextField bTextField;
    JTextField cTextField;
    JTextArea aTextArea;
    public ReliefFrame() {
        super("ReliefCenter");
        setSize(700, 700);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible( true );
        setLayout( new BorderLayout() );
        Label1= new JLabel("Welcome to JavaCup Relief Center");
        add(Label1);
        createNorthPanel();
        createEastPanel();
        createWestPanel();
        createSouthPanel();
        createaTextField();
        Label2= new JLabel("Relief Good",JLabel.LEFT);
        add(Label2);
        createbTextField();
        Label3= new JLabel("Quantity",JLabel.LEFT);
        add(Label3);
        createcTextField();
        Label4= new JLabel("Unit",JLabel.LEFT);
        add(Label4);
        createButton();
        createBButton();
        createCButton();
        createDButton();
        createEButton();
        createTextArea();
        add( row, "East" );
        add( roww, "West" );
        add( rowww, "North");
        add( rowwww, "South");
    }
    private void createNorthPanel()
    {
        rowww = new JPanel();
        rowww.setLayout( new BorderLayout( ) );
    }
    private void createEastPanel()
    {
        row = new JPanel();
        row.setLayout( new BorderLayout() );
    }
    private void createWestPanel()
    {
        roww = new JPanel();
        roww.setLayout( new GridLayout(6,1) );
    }
    private void createSouthPanel()
    {
        rowwww=new JPanel();
        rowwww.setLayout(new GridLayout(1,5));
    }
    private void createaTextField()
    {
        aTextField = new JTextField( "" );
        roww.add( aTextField );
    }
    private void createbTextField()
    {
        bTextField = new JTextField( "" );
        roww.add( bTextField );
    }
    private void createcTextField()
    {
        cTextField = new JTextField( "" );
        cTextField.setHorizontalAlignment(JTextField.LEFT);
        roww.add( cTextField );
    }
    private void createTextArea()
    {
        aTextArea = new JTextArea("" );
        aTextArea.setEditable(false);
        row.add(aTextArea);
    }   
    private void createButton()
    {
        button[0] = new JButton( "Add Good" );
        class ButtonListener implements ActionListener
        { 
            public void actionPerformed( ActionEvent ae )
            {
                String a = aTextField.getText();
                String b = bTextField.getText();
                String c = cTextField.getText();
                int d=Integer.parseInt(b);
                s.addNewGood(a,d,c);//
                aTextField.setText( "" ); 
                bTextField.setText( "" );
                cTextField.setText( "" );
                aTextArea.append("Added new good: "+a+"n");           
            }
        }
        button[0].addActionListener( new ButtonListener() );
        rowwww.add( button[0] ); 
    }
    private void createBButton()
    {
        button[1] = new JButton( "Receive Goods" );
        class ButtonListener implements ActionListener
        { 
            public void actionPerformed( ActionEvent ae )
            {
                String a = aTextField.getText();
                String b = bTextField.getText();
                int d=Integer.parseInt(b);
                s.receiveGoods(a,d);//
                aTextField.setText( "" ); 
                bTextField.setText( "" );
                aTextArea.append("Received "+a+":"+d+"n");                
            }
        }
        button[1].addActionListener( new ButtonListener() );
        rowwww.add( button[1] ); 
    }
    private void createCButton()
    {
        button[2] = new JButton( "Release Packs" );
        class ButtonListener implements ActionListener
        { 
            public void actionPerformed( ActionEvent ae )
            {
                String a = bTextField.getText();
                int b=Integer.parseInt(a);
                s.releasePacks(b);
                bTextField.setText( "" );           
            }
        }
        button[2].addActionListener( new ButtonListener() );
        rowwww.add( button[2] ); 
    }
    private void createDButton()
    {
        button[3] = new JButton( "Packs Released" );
        class ButtonListener implements ActionListener
        { 
            public void actionPerformed( ActionEvent ae )
            {
                int a=s.getPackCount();
                aTextArea.append("JavaCup has released"+a+"packs. n");         
            }
        }
        button[3].addActionListener( new ButtonListener() );
        rowwww.add( button[3] ); 
    }
    private void createEButton()
    {
        button[4] = new JButton( "Inventory Report" );
        class ButtonListener implements ActionListener
        { 
            public void actionPerformed( ActionEvent ae )
            {
                aTextArea.append("===INVENTORY===n");
                s.printInventory();
                aTextArea.append("===============n");
            }
        }
        button[4].addActionListener( new ButtonListener() );
        rowwww.add( button[4] ); 
    }
    public static void main(String[] arguments) {
    ReliefFrame c = new ReliefFrame();
    }
}

BorderLayout基于preferredSize工作。因此,试试这个来测试一下:

    ...
    add( row, BorderLayout.EAST );
    add( roww, BorderLayout.WEST );
    add( rowww, BorderLayout.NORTH);
    add( rowwww, BorderLayout.SOUTH);
    row.setPreferredSize(new Dimension(100,100));
    roww.setPreferredSize(new Dimension(100,100));
    rowww.setPreferredSize(new Dimension(100,100));
    rowwwww.setPreferredSize(new Dimension(100,100));
}

另外,添加标签时没有指定约束,所以LayoutManager不知道该怎么做

所以,试试你的标签:

labelPanel = new JPanel();
labelPanel.setLayout(new GridLayout());
Label1= new JLabel("Welcome to JavaCup Relief Center");
labelPanel.add(Label1);
createNorthPanel();
createEastPanel();
createWestPanel();
createSouthPanel();
createaTextField();
Label2= new JLabel("Relief Good",JLabel.LEFT);
labelPanel.add(Label2);
createbTextField();
Label3= new JLabel("Quantity",JLabel.LEFT);
labelPanel.add(Label3);
createcTextField();
Label4= new JLabel("Unit",JLabel.LEFT);
labelPanel.add(Label4);
add(labelPanel, BorderLayout.CENTER);

请注意,我在JPanel中放入了一个GridLayout。您可以使用任何最适合您的LayoutManager。我只是为的例子选择了最简单的一个

您有几个问题:

  1. 不要使用魔法值。"东方","西方"。。。都是没有在任何地方定义的神奇值。请改用API提供的变量。边框布局.EAST、边框布局.WEST…

  2. 变量名称不应以大写字符开头。您的一些变量是正确的,有些则不是。始终如一!!!

  3. 使用不返回您创建的组件的方法不是一个好主意。不需要为所有子面板定义实例变量。它们都应该只是局部变量。

  4. 您的变量名(row、roww、rowww、rowww、label1、label2)非常糟糕。没有人知道这指的是什么。如果要在整个代码中重用名称,则名称应该是描述性的。

  5. 在使用pack()和setVisible(true)之前,应该将组件添加到框架中。

因此,更好的代码结构可能是这样的:

add(createNorthPanel(), BorderLayout.NORTH);
add(createWestPanel(), BorderLayout.WEST);
...
pack();
setVisible( true );

那么createNorthPanel()的代码可能类似于:

public JPanel createNorthPanel()
{
    JPanel panel = new JPanel();
    JLabel quantity = new JLabel("Quantity");
    panel.add(quantity);
    JLabel unit = new JLabel("Unit");
    panel.add( unit );
    return panel;
}

现在,创建一个面板的所有逻辑都包含在一个地方。

您也不应该扩展JFrame,而是将组件添加到面板中,然后将面板添加到框架中。我建议您阅读Swing教程中关于如何使用标签来处理演示这种方法的代码。

最新更新