SWING布局高手帮忙改段代码

MatrixKnight 2008-09-05 05:10:13

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的答非所问的答案. 布局只要能满足需要就可以了, 不限制.
...全文
111 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
MatrixKnight 2008-09-06
  • 打赏
  • 举报
回复

搞定了, 散分.
还是用的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);
}
});
}
MatrixKnight 2008-09-06
  • 打赏
  • 举报
回复
才看了一下2楼的方法, 基本可以了, 我再修改一下.
MatrixKnight 2008-09-06
  • 打赏
  • 举报
回复


还是用图来说吧, 图1是我用NB做的界面原型, 而图2是我那段代码最后生成的结果.
楼上的那段代码如果在加入一个text组件的话, 标签和text组件就不是左对齐了. 标签会往east方向漂移.
huoyin 2008-09-06
  • 打赏
  • 举报
回复
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();
}
}

crystal555 2008-09-06
  • 打赏
  • 举报
回复
我写了下 你看看是不是这个意思
我也是想学习才试着弄了弄 呵呵 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();
}
}

MatrixKnight 2008-09-05
  • 打赏
  • 举报
回复
在线等答案...

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧