我写了一个程序,可是不管我怎么调,中间的文本区还是那么小,高手可不可以帮我看下
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;public class FontDemo
{
public static void main(String[] args)
{
FontDemoFrame frame=new FontDemoFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.show();
}
}class FontDemoFrame extends JFrame
{
public FontDemoFrame()
{
setTitle("FontDemo");
setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);

Container contentPane=getContentPane();
GridBagLayout layout=new GridBagLayout();
contentPane.setLayout(layout);

ActionListener listener1=new FontAction();
ActionListener listener2=new AreaAction();

JLabel facelabel=new JLabel("Face:");

face=new JComboBox(new String[]{
"Serif","SansSerif","Monospaced","Dialog","DialogInput"
});
face.addActionListener(listener1);

JLabel sizelabel=new JLabel("Size:");

size=new JComboBox(new String[]{
"8","10","12","15","18","24","36","48"
});
size.addActionListener(listener1);

bold=new JCheckBox("Bold");
bold.addActionListener(listener1);

italic=new JCheckBox("Itatic");
italic.addActionListener(listener1);

sample=new JTextArea();
sample.setText("The quick brown fox jumps over the lazy dog");
sample.setEditable(false);
sample.setLineWrap(true);
sample.setBorder(BorderFactory.createEtchedBorder());

JButton replace=new JButton("Replace");
replace.addActionListener(listener2);

from=new JTextField();
JLabel with=new JLabel("With");
to=new JTextField();

GridBagConstraints constraints=new GridBagConstraints();

constraints.fill=GridBagConstraints.NONE;
constraints.anchor=GridBagConstraints.CENTER;
constraints.weightx=0;
constraints.weighty=0;

add(facelabel,constraints,0,0,1,1);
add(sizelabel,constraints,0,1,1,1);

constraints.fill=GridBagConstraints.HORIZONTAL;
constraints.anchor=GridBagConstraints.CENTER;
    constraints.weightx=100;

add(face,constraints,1,0,2,1);
add(size,constraints,1,1,2,1);

constraints.fill=GridBagConstraints.NONE;
    constraints.weighty=100;

add(bold,constraints,3,0,1,1);
add(italic,constraints,3,1,1,1);

constraints.fill=GridBagConstraints.BOTH;
constraints.anchor=GridBagConstraints.CENTER;
add(sample,constraints,0,2,4,5);

constraints.fill=GridBagConstraints.NONE;
constraints.anchor=GridBagConstraints.CENTER;

add(replace,constraints,0,7,1,1);


constraints.fill=GridBagConstraints.HORIZONTAL;
constraints.anchor=GridBagConstraints.CENTER;
constraints.weightx=100;

add(from,constraints,1,7,1,1);

constraints.fill=GridBagConstraints.NONE;
constraints.anchor=GridBagConstraints.CENTER;
add(with,constraints,2,7,1,1);

constraints.fill=GridBagConstraints.HORIZONTAL;
constraints.anchor=GridBagConstraints.CENTER;
constraints.weightx=100;

add(to,constraints,3,7,1,1);
}

public void add(Component c,GridBagConstraints constraints,int x,int y,int w,int h)
{
constraints.gridx=x;
constraints.gridy=y;
constraints.gridwidth=w;
constraints.gridheight=h;
getContentPane().add(c,constraints);
}

public static final int DEFAULT_WIDTH=300;
public static final int DEFAULT_HEIGHT=400;

private JComboBox face;
private JComboBox size;
private JCheckBox bold;
private JCheckBox italic;
private JTextArea sample;
private JTextField from;
private JTextField to;

private class FontAction implements ActionListener
{
public void actionPerformed(ActionEvent event)
{
String fontFace=(String)face.getSelectedItem();
int fontsize=Integer.parseInt((String)size.getSelectedItem());
int mode=0;
if(bold.isSelected())
mode+=Font.BOLD;
if(italic.isSelected())
mode+=Font.ITALIC;
Font font=new Font(fontFace,mode,fontsize);
sample.setFont(font);
sample.repaint();
}
}

private class AreaAction implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
String f=from.getText();
int n=sample.getText().indexOf(f);
if(n>=0&&f.length()>0)
sample.replaceRange(to.getText(),n,n+f.length());
}
}
}

解决方案 »

  1.   

    你将所有的constraints.weightx=100;都注释掉,
    只在文本域的布局限制中加上constraints.weighty=3;就可以了.
    估计你对weightx和weighty误解了.
      

  2.   

    楼上所说的好象不行啊,请各位高手能帮我解释一下什么是weightx和weighty,我看了书,但还是不怎么理解
      

  3.   

    GridLayout可以理解为行列式布局,GridBagLayout就是不规则行列式布局
    weightx指出该组件跨越几行,weighty指出跨越几列.
      

  4.   

    楼上所说的应该有错把gridwidth,gridheight才是该组件所跨越的行和列把
      

  5.   

    我一直在关注这个贴 因为这也是我不明白的问题 楼主这个程序的源码出自core javaI 我也是看了书之后和楼主有了同样混乱的感觉,这个程序我也改了好几遍,找不到特别清晰的规律
    现在有几个参数要区分,下面是书上的原话:
    gridx,guidy/////////////////单元格的起始行列,左上角从0,0开始
    gridwidth,gridheight////////单元格的行数和列数
    weightx,weighty/////////////单元格放大时的增量
    关于gridwidth和weightx的说法与wulemale(wulemale)说的就有点出入了
    这是怎么回事呀
      

  6.   

    前面我写错了,是gridwidth和gridheight分别表示组件跨越的行数和列数.weightx和weighty规定组件的显示占据首选尺寸外的多少额外空间.
    在你这个例子中,我觉得用BorderLayout比较好,将文本域放到center,用嵌套Panel进行North的布局
      

  7.   

    楼上的意思我明白,但是我刚开始学GridBagLayout,我做这个例子只是想自己熟悉这个布局