2013-08-30 80 views
1

我有一個新的要求來更改我的顯示。需要「非矩形卡布局面板」或「透明組件」

目前我有一排3個單選按鈕坐在面板上方的卡片佈局。按鈕控制顯示卡布局面板的哪個卡。但是,這似乎浪費了寶貴的屏幕房地產。

可以使用面板上的GridLayout(4,1)將它們及其標題標籤輕鬆地轉換爲一列按鈕。理論上這個面板可以放置在卡片佈局面板中顯示的每張卡片的左上角,並且每張卡片的最上一行可以移動到按鈕面板的右側,從而爲更多的空間來下面。

但是,這是什麼遏制模型?在這種變體中,按鈕面板必須出現在每張卡上。誰擁有它?從邏輯上講,它需要通過上這一切坐在父面板所擁有,但它不會顯示在卡片上,這將覆蓋過來 - 除非我能

  1. 按鈕面板的添加到每個卡它的顯示時刻,可能會混亂,也可能導致閃爍。
  2. 使每張卡片的左上角是透明的,允許它顯示其父母擁有的左上角按鈕面板。但我該怎麼做?

其他解決方案?

也許

  1. 有由單選按鈕控制的兩個卡布局面板。右上方包含除按鈕面板和位於其下方的下部組件之外的所有東西。

回答

2

聽起來好像您可以使用JLayeredPane作爲兩者的父組件,包含單選按鈕和卡面板的面板。

JLayeredPane允許其子組件重疊,每個子組都屬於一個圖層。

要指定圖層,可以將Integer常量作爲約束參數傳遞給JLayeredPane的add(Component,Object)方法。整型常量在JLayeredPane類本身中定義。您可以使用JLayeredPane.DEFAULT_LAYER作爲卡面板,使用JLayeredPane.PALETTE_LAYER作爲單選按鈕面板。

設置了圖層後,您仍然必須在x,y空間中正確放置兩個面板。我建議只是用這樣的東西重寫JLayeredPane的doLayout()方法(未經測試):

public void doLayout() 
{ 
    cardPanel.setBounds(new Rectangle(getSize())); 
    radioButtonPanel.setBounds(new Rectangle(radtioButtonPanel.getPreferredSize())); 
} 
+0

我喜歡這個,設置起來很簡單,而且看起來很好用。 –

+0

它確實有效。絕對是這裏介紹的最簡單的想法。 –

+0

+1不錯的選擇;另請參閱此相關的[示例](http://stackoverflow.com/a/9629892/230513)。 – trashgod

1

我會忘記透明度的想法。只需將選項作爲卡片面板左側(或右側,或上方/下方)的列表即可。我肯定不會把控制面板放在CardPanel上。它應該在外面。

選擇列表可能是收音機,按鈕,或者在此示例中,JList中的項目可以增長而不會混亂佈局。例如:

/* 
* CardLayoutDemo.java 
*/ 
import java.awt.*; 

import javax.swing.*; 
import javax.swing.event.*; 

@SuppressWarnings("unchecked") 
public class CardLayoutDemo implements Runnable 
{ 
    final static String CARD1 = "Gray Panel"; 
    final static String CARD2 = "Blue Panel"; 
    final static String CARD3 = "Green Panel"; 

    JPanel cards; 
    CardLayout cl; 

    public static void main(String[] args) 
    { 
    SwingUtilities.invokeLater(new CardLayoutDemo()); 
    } 

    public void run() 
    { 
    final JList jList = new JList(new String[]{CARD1, CARD2, CARD3}); 
    jList.setPrototypeCellValue("XXXXXXXXXXXX"); 
    jList.setVisibleRowCount(5); 
    jList.setSelectedIndex(0); 
    jList.addListSelectionListener(new ListSelectionListener() 
    { 
     @Override 
     public void valueChanged(ListSelectionEvent e) 
     { 
     String name = jList.getSelectedValue().toString(); 
     cl.show(cards, name); 
     } 
    }); 

    JScrollPane scroll = new JScrollPane(jList); 
    scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 

    Dimension dim = new Dimension(300, 300); 

    JPanel card1 = new JPanel(); 
    card1.setBackground(Color.GRAY); 
    card1.setPreferredSize(dim); 

    JPanel card2 = new JPanel(); 
    card2.setBackground(Color.BLUE); 
    card2.setPreferredSize(dim); 

    JPanel card3 = new JPanel(); 
    card3.setBackground(Color.GREEN); 
    card3.setPreferredSize(dim); 

    cl = new CardLayout(); 
    cards = new JPanel(cl); 
    cards.add(card1, CARD1); 
    cards.add(card2, CARD2); 
    cards.add(card3, CARD3); 

    JFrame f = new JFrame("CardLayout Demo"); 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    f.add(scroll, BorderLayout.WEST); 
    f.add(cards, BorderLayout.CENTER); 
    f.pack(); 
    f.setLocationRelativeTo(null); 
    f.setVisible(true); 
    } 
} 

如果你想要一個標籤的選擇,才使包含的JLabel和JScrollPane的一個「選擇面板」(或使用您的按鍵面板的網格),並把它放在Borderlayout.WEST (而不是直接添加JScrollPane)。

另外,請查看JTabbedPane作爲替代。

+0

透明性是一個蠕蟲的罐頭,是的。我同意這些按鈕不屬於該卡。但user2734169的解決方案比較簡單。儘管如此,謝謝。 –