如何让我的标签和文本字段显示在java的borderlayout中?

时间:2015-11-27 12:44:38

标签: java swing jframe jpanel border-layout

如何让我的Jtextfiels,Jlabels和JtextArea出现在borderlayout中?我想在北方制作label1,在东方制作textarea,在西方制作其余的。问题是它们不会出现,我的文本区域似乎被挤压在左边。

这是我的代码:

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();
    }
}

2 个答案:

答案 0 :(得分:1)

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);

请注意,我在GridLayout中添加了JPanel。您可以使用最适合您的LayoutManager。我只是去了最简单的例子

答案 1 :(得分:1)

你有几个问题:

  1. 不要使用魔法值。 “东方”,“西方”......都是没有在任何地方定义的神奇值。而是使用API​​提供的变量。 BorderLayout.EAST,BorderLayout.WEST ...

  2. 变量名称不应以大写字母开头。你的一些变量是正确的,有些则不是。保持一致!!!

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

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

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

  6. 因此,代码的更好结构可能类似于:

    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,而是将组件添加到面板,然后将面板添加到框架中。我建议您阅读How to Use Labels上的Swing教程,了解演示此方法的工作代码。