2013-06-24 100 views
0

我正在嘗試使用FlowLayout讓我的面板垂直對齊。我想讓右下角朝右上方的底部對齊,而不是該行的底部。交錯頂部對齊JPanels

這裏是我做了什麼:

import java.awt.*; 
    import java.awt.event.*; 
    import javax.swing.*; 



    public class BigPanel extends JPanel { 

    @Override 
    public Component.BaselineResizeBehavior getBaselineResizeBehavior() { 
     return Component.BaselineResizeBehavior.CONSTANT_ASCENT; 
    } 

    @Override 
    public int getBaseline(int width, int height) { 
     return 0; 
    } 

public BigPanel() { 
    FlowLayout layout = new FlowLayout(); 
    layout.setAlignOnBaseline(true); 
    this.setLayout(layout); 
    this.add(new Panel1()); // size: 340x, 160y 
    this.add(new Panel2()); // size: 340x, 120y 
    this.add(new Panel3()); // size: 340x, 160y 
    this.add(new Panel4()); // size: 340x, 300y 
} 

}

我怎麼能簡單地錨定板和組件至一組座標?我有這個上週多次遇到這個問題,用可笑的解決方法我的JLabel等

如何現在看起來:

enter image description here

+0

這是FlowLayout'的'性質。我能想到的唯一佈局就是'GridBagLayout',但這似乎有很大的收穫。另一種選擇是使用類似'GridLayout'的東西,並創建兩個面板,每個列一個,並分別佈局子組件。 – MadProgrammer

回答

0

有可能可以實現這幾方面,但最簡單的就是使用複合佈局。

使用兩個面板作爲列,然後將它們放在主容器上。進入這些你將會給你其他組件。

enter image description here

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.GridLayout; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.border.LineBorder; 

public class CompundLayout { 

    public static void main(String[] args) { 
     new CompundLayout(); 
    } 

    public CompundLayout() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 

      JPanel left = new JPanel(); 
      JPanel right = new JPanel(); 

      setLayout(new GridLayout(0, 2, 2, 2)); 

      left.add(createPane(Color.RED)); 
      left.add(createPane(Color.GREEN)); 
      right.add(createPane(Color.BLUE)); 
      right.add(createPane(Color.MAGENTA)); 

      add(left); 
      add(right); 

     } 

     protected JPanel createPane(Color color) { 

      SimplePane pane = new SimplePane(); 
      pane.setBorder(new LineBorder(color)); 

      return pane; 

     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 
      g2d.dispose(); 
     } 
    } 

    public class SimplePane extends JPanel { 

     private int width; 
     private int height; 

     public SimplePane() { 

      width = 100; 
      height = 50 + (int) Math.round(Math.random() * 100); 

     } 

     @Override 
     public Dimension getPreferredSize() { 

      return new Dimension(width, height); 

     } 

    } 

} 
+0

感謝您的方法。這就是我最終做的。不過,我遇到了很多有複雜面板的問題,這些面板需要多個標籤等,所以我想知道是否有可能將它們的左上角(或中心 - 這只是一個快速調整)錨定到一組的像素座標。 – NovaBear

+0

不建議使用像素位置,因爲您開發的字體屬性很可能不會是客戶端計算機的字體屬性。你會發現tht提供的錨定功能在SSTandard JDK中是唯一的佈局是GridBagLayout,但是我認爲你最終會在夜間母馬試圖讓它按你想要的方式工作 – MadProgrammer

+0

爲什麼字體屬性如果是全部在像JLabel這樣的固定大小的組件中? – NovaBear