如何让我的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();
}
}
答案 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)
你有几个问题:
不要使用魔法值。 “东方”,“西方”......都是没有在任何地方定义的神奇值。而是使用API提供的变量。 BorderLayout.EAST,BorderLayout.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,而是将组件添加到面板,然后将面板添加到框架中。我建议您阅读How to Use Labels上的Swing教程,了解演示此方法的工作代码。