2014-01-22 28 views
0

如附件屏幕截图所示 - 黄线来自底层的BoxLayout,面向JPanel。更改为BorderLayout删除黄线:BoxLayout在底部留下像素线

Basic BorderLayout display, coloured for convenience

代码示例如下:

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 JPanels设置边界,但它似乎并没有做太多。 Swing为什么要这样做?它可以修复吗?

备注:无论我是否使用setPreferredSize(),它都会显示。

回答

3

Swing为什么要这样做?

加入到中央面板的每个面板的优选高度为20的BoxLayout需要扩展 每个板的以填充可用然后整个空间。看起来这种缩放完成后会出现某种舍入问题。

它可以修复吗?

不确定你确切的要求是什么?

如果您试图使每个组件的高度相同,则可以使用Relative Layout。它有一个属性,允许您指定如何处理残留像素作为舍入的结果。

编辑:

你的代码接过定睛一看,问题是:

//mainframe.setPreferredSize(new Dimension(800, 600)); 

请勿将帧的大小。这是布局经理的工作。您手动设置的大小包括标题栏和边框,因此所有面板都比您希望的小,并且它们不能被10整除。

// mainframe.setPreferredSize(new Dimension(800,600));

+0

我会理解是否有舍入误差,但数字全部除以10.我可以理解,如果这是剩余的数量,但它实际上是1像素深。感谢代码,我会考虑它。我对这种明显的差异感到恼火。如果没有其他人提出任何问题,将会标记为已回答:) – Gorbles

+1

@gorb,请参阅编辑。 – camickr

+0

辉煌,固定。从现在起将铭记这一点! – Gorbles

相关问题