private void setUpUIComponent()
{
setSize(400, 300);
setResizable(false);
JMenuBar menuBar = new JMenuBar(); JMenu fileMenu = new JMenu("File");
menuNew = new JMenuItem("New");
menuNew.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,
InputEvent.CTRL_MASK));

menuOpen = new JMenuItem("Open PVD...");
menuOpen.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,
InputEvent.CTRL_MASK)); menuBuild = new JMenuItem("Build PVD...");
menuBuild.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_B,
InputEvent.CTRL_MASK)); menuClose = new JMenuItem("Quit");
menuClose.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q,
InputEvent.CTRL_MASK));

fileMenu.add(menuNew);
fileMenu.add(menuOpen);
fileMenu.add(menuBuild);
fileMenu.addSeparator();
fileMenu.add(menuClose); JMenu aboutMenu = new JMenu("About");
menuAbout = new JMenuItem("About PVD Builder");
aboutMenu.add(menuAbout); menuBar.add(fileMenu);
menuBar.add(aboutMenu);
setJMenuBar(menuBar);

Container contentPane = getContentPane();
setLayout(new BoxLayout(contentPane,BoxLayout.Y_AXIS));

lblSummary = new JLabel("Summary:");
lblDescription = new JLabel("Description");

contentPane.add(lblSummary);

txtSummary = new JTextArea();
txtSummary.setFont(new Font("微软雅黑", Font.PLAIN, 16));
txtSummary.setLineWrap(true);
JScrollPane panel = new JScrollPane(txtSummary,
ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER,
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
contentPane.add(panel); txtDescription = new JTextArea();
txtDescription.setFont(new Font("微软雅黑", Font.PLAIN, 16));
txtDescription.setLineWrap(true);
JScrollPane panel2 = new JScrollPane(txtDescription,
ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
contentPane.add(lblDescription);
contentPane.add(panel2); stateBar = new JLabel("New");
stateBar.setHorizontalAlignment(SwingConstants.LEFT);
stateBar.setBorder(BorderFactory.createEtchedBorder());
contentPane.add(stateBar); }我想从上倒下, 左对齐排列lblSummary, txtSummary, lblDescription, txtDescription, stateBar这5个控件, 其中txtSummary的宽度是txtDescription的1/3, 且限制输入字符为20个. 但以上代码的结果和我需要的不太一致, 麻烦帮我改一下. 
  我是用Eclipse开发的, 虽然NetBeans做GUI很方便也美观但是还不习惯. 所以不要给出什么换个IDE的答非所问的答案. 布局只要能满足需要就可以了, 不限制.

解决方案 »

  1.   

    我写了下 你看看是不是这个意思
    我也是想学习才试着弄了弄  呵呵 gui设计没怎么学  里面还有几个问题不清楚 我再去问问别人
    反正就是用setbounds这个方法设置位置,还有就是那个20个字的可以用行数和列数确定,不过要是确定总数得另写KeyListener
    代码 如下package test;import java.awt.event.*;
    import javax.swing.*;
    import java.awt.*;
    public class test extends JFrame {    public test() {
            int width = 400;
            int height = 300;
            
            setLocationRelativeTo(null);        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setSize(width, height);
            setResizable(true);        JMenuBar menuBar = new JMenuBar();        JMenu fileMenu = new JMenu("File");        JMenuItem menuNew = new JMenuItem("New");
            menuNew.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,
                    InputEvent.CTRL_MASK));        JMenuItem menuOpen = new JMenuItem("Open PVD...");
            menuOpen.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,
                    InputEvent.CTRL_MASK));        JMenuItem menuBuild = new JMenuItem("Build PVD...");
            menuBuild.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_B,
                    InputEvent.CTRL_MASK));        JMenuItem menuClose = new JMenuItem("Quit");
            menuClose.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q,
                    InputEvent.CTRL_MASK));
            fileMenu.add(menuNew);
            fileMenu.add(menuOpen);
            fileMenu.add(menuBuild);
            fileMenu.addSeparator();
            fileMenu.add(menuClose);        JMenu aboutMenu = new JMenu("About");
            JMenuItem menuAbout = new JMenuItem("About PVD Builder");
            aboutMenu.add(menuAbout);        menuBar.add(fileMenu);
            menuBar.add(aboutMenu);
            setJMenuBar(menuBar);        Container contentPane = this.getContentPane();        JLabel lblSummary = new JLabel("Summary:");
            lblSummary.setBounds(0, 0, 80, 25);        JTextArea txtSummary = new JTextArea();
            txtSummary.setFont(new Font("微软雅黑", Font.PLAIN, 16));
            txtSummary.setLineWrap(true);
            JScrollPane panel = new JScrollPane(txtSummary,
                    ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER,
                    ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
            panel.setBounds(0, 30, 80, 25);        JLabel lblDescription = new JLabel("Description");
            lblDescription.setBounds(0, 60, 240, 25);        JTextArea txtDescription = new JTextArea();
            txtDescription.setFont(new Font("微软雅黑", Font.PLAIN, 16));
            txtDescription.setLineWrap(true);
            JScrollPane panel2 = new JScrollPane(txtDescription,
                    ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
                    ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
            panel2.setBounds(0, 90, 240, 50);        JLabel stateBar = new JLabel("New");
            stateBar.setBounds(10, 150, 80, 25);
            JLabel stateBar1 = new JLabel("");
            stateBar.setBounds(0, 150, 80, 25);        contentPane.add(lblSummary);
            contentPane.add(panel);
            contentPane.add(lblDescription);
            contentPane.add(panel2);
            contentPane.add(stateBar);
            contentPane.add(stateBar1);
            this.setVisible(true);
        }    public static void main(String[] args) {
            new test();
        }
    }
      

  2.   

    contentPane.add(lblSummary);改为:this.add(lblSummary);一个简单的例子import java.awt.Dimension;import javax.swing.BoxLayout;
    import javax.swing.JFrame;
    import javax.swing.JLabel;public class TestLayout extends JFrame{
    public TestLayout() {
    this.setLayout(new BoxLayout(this.getContentPane(),BoxLayout.Y_AXIS));
    this.setSize(new Dimension(600,400));
    JLabel label1 = new JLabel("1");
    this.add(label1);
    JLabel label2 = new JLabel("2");
    this.add(label2);
    JLabel label3 = new JLabel("3");
    this.add(label3);
    JLabel label4 = new JLabel("4");
    this.add(label4);
    this.setVisible(true);
    }
    public static void main(String[] args){
    TestLayout tl = new TestLayout();
    }
    }
      

  3.   

    还是用图来说吧, 图1是我用NB做的界面原型, 而图2是我那段代码最后生成的结果.
      楼上的那段代码如果在加入一个text组件的话, 标签和text组件就不是左对齐了. 标签会往east方向漂移.
      

  4.   


    搞定了, 散分.
      还是用的2楼的使用绝对坐标的方法, 没使用布局管理器了.
      限制输入的问题靠setDocument(new PlainDocument()解决.
      
    private void setUpInsertListener()
    {
      txtSummary.setDocument(new PlainDocument()
      {  
                  public void insertString(int offset,String str,AttributeSet as)  
                   throws   BadLocationException{  
                      if(this.getLength()+str.length() >= 26)
                      {  
                          java.awt.Toolkit.getDefaultToolkit().beep();
                          JOptionPane.showMessageDialog(null, "Summary should less than 20 characters!",
                         "Error",JOptionPane.WARNING_MESSAGE);
                      }  
                      else  
                          super.insertString(offset,str,as);  
                  }  
              });   
    }