2014-01-22 27 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

相關問題