如何使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
。我只是为的例子选择了最简单的一个
您有几个问题:
-
不要使用魔法值。"东方","西方"。。。都是没有在任何地方定义的神奇值。请改用API提供的变量。边框布局.EAST、边框布局.WEST…
-
变量名称不应以大写字符开头。您的一些变量是正确的,有些则不是。始终如一!!!
-
使用不返回您创建的组件的方法不是一个好主意。不需要为所有子面板定义实例变量。它们都应该只是局部变量。
-
您的变量名(row、roww、rowww、rowww、label1、label2)非常糟糕。没有人知道这指的是什么。如果要在整个代码中重用名称,则名称应该是描述性的。
-
在使用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教程中关于如何使用标签来处理演示这种方法的代码。