我的框架中有两个面板,我想将它们设置在另一个面板下,并且第一个应该具有9/10 *屏幕框架的尺寸,以及第二个1/10。
我尝试使用GridLayout(2行和1列),但我无法设置它们的具体大小。
我该怎么做?
好吧也许我会写一些我的代码:
我正在写游戏 - pacman,在第一个面板中有一整个游戏,在这第二个我想显示玩家信息(如得分,名称等)这首先我要设置为80%屏幕,第二个20%。
我的框架应该可以调整大小并且全部在其中,当帧的大小发生变化时,我必须改变面板的大小(保持80%到20%)。所以我写了这个InitComponents()。
package pacman;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.Toolkit;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import java.awt.Image;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
public class Pacman extends JFrame implements items
{
Image image;
public Pacman()
{
initComponents();
try {
image = ImageIO.read( Pac.class.getResourceAsStream("/img/Pac02.gif"));
} catch (Exception e) {
System.out.println("Blad prz otwieraniu " + e);
System.exit(0);
}
int screen_width = Toolkit.getDefaultToolkit().getScreenSize().width;
int screen_height = Toolkit.getDefaultToolkit().getScreenSize().height;
this.setLocation(screen_width/3, screen_height/3);
this.setLayout(new BorderLayout());
this.getContentPane().add(panel, BorderLayout.CENTER);
this.getContentPane().add(panel2, BorderLayout.PAGE_END);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setIconImage(image);
setTitle("..::Pacman::..");
setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setPreferredSize(new Dimension(416,438));
this.pack();
setLocationRelativeTo(null);
setVisible(true);
}
private void initComponents() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e) {
int width = e.getComponent().getSize().width;
int height = e.getComponent().getSize().height;
panel.setSize(width, height*8/10) ;
panel2.setSize(width, height*2/10);
}
});
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new Pacman();
}
});
}
}
答案 0 :(得分:3)
如果您需要不同大小的组件,GridLayout是错误的布局。正如javadoc所述:
容器被分成大小相等的矩形和一个 组件放在每个矩形中。
如果您只有JPanel
,则可能需要考虑JSplitPane
- 请参阅javadoc或tutorial。
编辑:基于您的编辑/代码,JSplitPane看起来真的是您的问题的解决方案。然后,您可以在创建后使用setDividerLocation(double)
设置分隔符位置 - 请参阅javadoc - 例如
JSplitPane split = new JSplitPane(JSplitPane.VERTICAL);
split.setTopComponent(topPanel);
split.setBottomComponent(bottomPanel);
split.setDividerLocation(0.8);
或者,由于在不知道您对GUI的意图的情况下很难建议布局,因此您应该考虑查看Visual Guide布局。
答案 1 :(得分:2)
看看这个输出:
以下是代码,当你需要调整GridLayout
的大小时,你不应该使用columns/rows
,在这种情况下GridBagLayout
来救援。
import java.awt.*;
import javax.swing.*;
// http://stackoverflow.com/questions/10968853/two-jpanels-in-jframe-one-under-other
public class GridBagLayoutExample
{
private void displayGUI()
{
JFrame frame = new JFrame("GridBagLayout Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel contentPane = new JPanel();
contentPane.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.anchor = GridBagConstraints.FIRST_LINE_START;
gbc.fill = GridBagConstraints.BOTH;
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weightx = 1.0;
gbc.weighty = 0.9;
JPanel topPanel = new JPanel();
topPanel.setOpaque(true);
topPanel.setBackground(Color.WHITE);
contentPane.add(topPanel, gbc);
gbc.weighty = 0.1;
gbc.gridy = 1;
JPanel bottomPanel = new JPanel();
bottomPanel.setOpaque(true);
bottomPanel.setBackground(Color.BLUE);
contentPane.add(bottomPanel, gbc);
frame.setContentPane(contentPane);
frame.setSize(200, 300);
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String... args)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
new GridBagLayoutExample().displayGUI();
}
});
}
}
答案 2 :(得分:1)
退房,
假设你的意思是一个Jpanel
与另一个重叠!
http://docs.oracle.com/javase/tutorial/uiswing/components/layeredpane.html
喝彩!
答案 3 :(得分:1)
您可以使用边框布局
http://docs.oracle.com/javase/tutorial/uiswing/layout/border.html
将较大的面板设置为CENTER,将较小的面板设置为PAGE_END。设置较大面板的大小,较小的面板将使用剩余的空间。