如附带的屏幕截图所示 - 黄线来自基础BoxLayout
- 面向JPanel
。更改为BorderLayout
会删除黄线:
代码示例如下:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
public class FrameDemo {
private String[] suits = {"hearts", "spades", "diamonds", "clubs", "joker"};
public static void main(String[] args) {
new FrameDemo();
}
public FrameDemo() {
JFrame mainframe = new JFrame();
mainframe.setPreferredSize(new Dimension(800, 600));
mainframe.setLocationByPlatform(true);
mainframe.setTitle("Playing Card Game! v0.1");
mainframe.getContentPane().setLayout(new BorderLayout());
JPanel top = new JPanel();
top.setBackground(Color.BLUE);
top.setPreferredSize(new Dimension(800, 50));
JPanel left = new JPanel();
left.setBackground(Color.RED);
left.setPreferredSize(new Dimension(50, 500));
JPanel centre = new JPanel();
centre.setBackground(Color.YELLOW);
centre.setLayout(new BoxLayout(centre, BoxLayout.Y_AXIS));
JPanel right = new JPanel();
right.setBackground(Color.GREEN);
right.setPreferredSize(new Dimension(50, 500));
JPanel bot = new JPanel();
bot.setBackground(Color.GRAY);
bot.setPreferredSize(new Dimension(800, 50));
for(String suit : suits) {
if(!(suit.equals("joker"))) {
JPanel layer = new JPanel();
layer.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 10));
layer.setBackground(Color.BLACK);
centre.add(layer);
}
}
mainframe.add(top, BorderLayout.NORTH);
mainframe.add(left, BorderLayout.WEST);
mainframe.add(centre, BorderLayout.CENTER);
mainframe.add(right, BorderLayout.EAST);
mainframe.add(bot, BorderLayout.SOUTH);
mainframe.setDefaultCloseOperation(
WindowConstants.DO_NOTHING_ON_CLOSE);
mainframe.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
mainframe.pack();
mainframe.setVisible(true);
}
}
我已尝试在Color.BLACK
JPanel上设置边框,但它似乎没有做太多。为什么Swing这样做?可以修复吗?
注意:无论我是否使用setPreferredSize()
,都会显示。
答案 0 :(得分:3)
为什么Swing这样做?
添加到中心面板的每个面板的首选高度为20. BoxLayout需要缩放 每个面板填充然后可用的整个空间。在完成此缩放时,看起来存在某种舍入问题。
可以修复吗?
不确定您的具体要求是什么?
如果您尝试将每个组件设置为相同的高度,则可以使用Relative Layout。它有一个属性,允许您指定如何舍入剩余像素。
编辑:
仔细查看您的代码,问题是:
//mainframe.setPreferredSize(new Dimension(800, 600));
永远不要设置框架的大小。这是布局管理器的工作。您手动设置的大小包括标题栏和边框,因此所有面板都比您希望的小,并且它们不能被10整除。
// mainframe.setPreferredSize(new Dimension(800,600));