话题:关于GroupLayout布局管理器的组件不完全显示的问题
最近在设计一个围棋的界面框架,分成了几个轻量级的jpanel类(QiPang,Player,PlayerPane,Chatroom)和一个主框架GameFrame类,但是一组合起来左边的QiPang的界面却不能完全显示,只显示了一部分,布局管理器是使用了GroupLayout,想了很久,还是不知道问题的所在,由于本人才刚接触布局管理器,不是很清楚,也有可能是其它一些常识的问题,请高手指点指点。贴出下面的源码,粘贴在eclipse上直接运行就行,代码是多了点,但已经删除了很多了。
import java.awt.BorderLayout;layout 布局管理器 组件显示 GroupLayout 布局
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.util.Vector;
import javax.swing.GroupLayout;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
public class GameFrame extends JFrame {
public final int GAMEWIDTH = 800;
public final int GAMEHEIGHT = 800;
public GameFrame() {
this.init();
this.setBounds(new Rectangle(GAMEWIDTH, GAMEHEIGHT));
this.setTitle("围棋天地");
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.pack();
this.setVisible(true);
}
public void init() {
// 创建各个组件
PlayerPane player1 = new PlayerPane(new Player());
PlayerPane player2 = new PlayerPane(new Player());
Chatroom chat = new Chatroom();
QiPang qipang = new QiPang();
// 布置各个组件
GroupLayout layout = new GroupLayout(this.getContentPane());
this.setLayout(layout);
layout.setAutoCreateGaps(true);
layout.setAutoCreateContainerGaps(true);
// 水平布置
GroupLayout.SequentialGroup sga = layout.createSequentialGroup()
.addComponent(player1)
.addComponent(player2);
GroupLayout.ParallelGroup hp1 = layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addGroup(sga)
.addComponent(chat);
GroupLayout.SequentialGroup hGroup = layout.createSequentialGroup()
.addComponent(qipang)
.addGroup(hp1);
layout.setHorizontalGroup(hGroup);
// 垂直布置
GroupLayout.ParallelGroup vpa = layout.createParallelGroup()
.addComponent(player1)
.addComponent(player2);
GroupLayout.SequentialGroup sgb = layout.createSequentialGroup()
.addGroup(vpa)
.addComponent(chat);
GroupLayout.ParallelGroup vp1 = layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(qipang)
.addGap(5)
.addGroup(sgb);
layout.setVerticalGroup(vp1);
}
public class QiPang extends JPanel {
public static final int SPACE = 26;
public static final int QIPANGSPACE = 20;
public static final int QIPANGWIDTH = SPACE * 18 + QIPANGSPACE * 2;
public static final int QIPANGHEIGHT = SPACE * 18 + QIPANGSPACE * 2;
public static final int MOUSESPACE = 10;
public static final int POINTCOUNT = 19 * 19;
public QiPang() {
super();
this.setBounds(new Rectangle(QIPANGWIDTH, QIPANGHEIGHT));
this.setPreferredSize(new Dimension(550, 550));
this.setVisible(true);
}
// 画棋盘面版
public void drawBoard(Graphics g) {
g.setColor(new Color(254, 215, 124));
g.fillRect(0, 0, QIPANGWIDTH, QIPANGHEIGHT);
}
public void paint(Graphics g) {
drawBoard(g);
}
}
public class Player {
private String name = null;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class PlayerPane extends JPanel {
public final int FRAMEWIDTH = 130;
public final int FRAMEHEIGHT = 200;
public final int IMAGEWIDTH = 120;
public final int IMAGEHEIGHT = 110;
private Player player;
public PlayerPane(Player p) {
player = p;
this.setBounds(new Rectangle(FRAMEWIDTH, FRAMEHEIGHT));
this.setLayout(new BorderLayout());
this.init();
this.setVisible(true);
}
// 初始化工作
public void init() {
JLabel jName = new JLabel("对局者:"+player.getName());
jName.setHorizontalAlignment(SwingConstants.CENTER);
this.add(jName, BorderLayout.SOUTH);
}
}
public class Chatroom extends JPanel {
public final int WIDTH = 100;
public final int HEIGHT = 500;
public Chatroom() {
this.init();
this.setBounds(new Rectangle(WIDTH, HEIGHT));
}
public void init() {
Vector<String> names = new Vector<String>();
String[] strs = new String[]{"a", "b", "c"};
for(int i=0; i<strs.length; i++) {
names.add(strs[i]);
}
// 1:当前棋友标签
JLabel label1 = new JLabel("当前棋友:");
// 2:棋友名单Pane
JPanel listPane = new JPanel();
JList playerList = new JList(names);
JScrollPane scroll = new JScrollPane(listPane);
listPane.setLayout(new BorderLayout());
listPane.add(playerList, BorderLayout.WEST);
listPane.setBackground(Color.white);
scroll.setBounds(WIDTH - 50, 20, WIDTH - 50, 200);
listPane.setPreferredSize(new Dimension(scroll.getWidth()/2, 800));
// 3:聊天室标签
JLabel label2 = new JLabel("聊天室");
// 4:聊天室显示信息
JTextArea textArea = new JTextArea(50, 100);
// 5:棋友下拉列表
JComboBox listBox = new JComboBox(names);
// 6:输入对话信息
JTextField textField = new JTextField(50);
// 设置布局
GroupLayout layout = new GroupLayout(this);
this.setLayout(layout);
layout.setAutoCreateGaps(true);
layout.setAutoCreateContainerGaps(true);
// 水平布置
GroupLayout.SequentialGroup hsp = layout.createSequentialGroup()
.addComponent(listBox)
.addComponent(textField);
GroupLayout.ParallelGroup hp1 = layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(label1)
.addComponent(scroll)
.addComponent(label2)
.addComponent(textArea)
.addGroup(hsp);
layout.setHorizontalGroup(hp1);
// 垂直布置
GroupLayout.ParallelGroup vp1 = layout.createParallelGroup()
.addComponent(listBox)
.addComponent(textField);
GroupLayout.SequentialGroup vGroup = layout.createSequentialGroup()
.addComponent(label1)
.addComponent(scroll)
.addComponent(label2)
.addComponent(textArea)
.addGroup(vp1);
layout.setVerticalGroup(vGroup);
}
}
public static void main(String[] args) {
GameFrame a = new GameFrame();
}
}
[解决办法]
今天回答的最后一个问题。。回答完睡觉。
却不能完全显示,
恕我愚钝。没懂这句话的意思
这句话很关键,是一点都不显示,还是显示一部分呢?
我感觉不显示就两种可能。
一种是被别的组件给阻挡了。。所以不显示。
第二种就是你给设置成了不可见的模式。
