2017-02-20 44 views
0

我要的是像「選項卡行」受阻。現在用我的SSCCE,這個按鈕不能被點擊。但是,如果我在該區域添加按鈕,例如將此按鈕的邊界的y設置爲0,它不在JTabbedPane的「選項卡行」之後,因此可以點擊。搖擺按鈕通過在JTabbedPane中,在沒有標籤

所以:

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JLayeredPane; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.JTabbedPane; 
import javax.swing.SwingUtilities; 

import net.miginfocom.swing.MigLayout; 

public class MigLayoutWithJTabbedPaneButton extends JFrame { 
    public MigLayoutWithJTabbedPaneButton() { 
     begin(); 
    } 

    private void begin() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JPanel panel = new JPanel(); 
     panel.setLayout(null); 

     JTabbedPane tabsPane = new JTabbedPane(); 
     tabsPane.setBounds(20, 20, 300, 400); 
     panel.add(tabsPane); 


     JLayeredPane tab = new JLayeredPane(); 
     tab.setLayout(new MigLayout("insets 2 2 2 2, fillx, debug", "[]5[]5[]", "[]5[]")); 

     JButton button1 = new JButton("In the grid"); 
     JButton button2 = new JButton("Out of the grid"); 
     ActionListener ls = new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       JOptionPane.showMessageDialog(MigLayoutWithJTabbedPaneButton.this, "This can be clicked. "); 

      } 
     }; 
     button1.addActionListener(ls); 
     button2.addActionListener(ls); 

     tab.add(button1, "cell 0 0, grow"); 

     tabsPane.addTab("This is a tab", tab); 

     button2.setBounds(200, 20, 80, 20); 
     panel.add(button2); 
     getContentPane().add(panel); 

     pack(); 
     setLocationRelativeTo(null); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       MigLayoutWithJTabbedPaneButton frame = new MigLayoutWithJTabbedPaneButton(); 

      } 

     }); 
    } 
} 

爲什麼?這不是理想的行爲。 「標籤行」不應該阻止任何元素,如果他們在標籤的相同高度,但沒有任何實際的標籤在他們面前。

回答

0

我的同事告訴我的原因。

它與佈局無關,只是添加組件的順序。 似乎Java Swing的Z軸以非直覺的方式運行:從頂層到底層,這意味着如果先添加組件A,然後添加組件B,則A將阻止B,如果它們位於相同位置。 我重讀了Oracle DOC,並確信它在任何地方都沒有提及!

所以要讓按鈕工作,我必須先添加按鈕,然後是JTabbedPane,所以「選項卡行」的空白將在按鈕後面。多麼奇怪。 Swing只是太糟糕了......

+0

'我重讀了Oracle DOC,並且確定它沒有被任何地方提及!' - 這個行爲在'Container.setComponentZOrder(...)'方法中定義。 – camickr

+0

根據此方法的API中的詳細信息[here](http://docs.oracle.com/javase/7/docs/api/java/awt/Container.html#setComponentZOrder(java.awt.Component,%它說:「z順序決定了組件的排列順序;具有最高z順序的組件和最低z順序的組件在最後一個組件中重疊,組件與更低z順序的顏料在z-順序更高的組件上。「但我們不知道第一個添加的組件具有更低的z順序。 – FaithReaper

+0

ZOrder隨着添加組件而增加。不知道將添加多少組件,因此您無法首先分配最高的ZOrder。 – camickr