2017-02-20 6 views
0

は似ているが存在しないJTabbedPaneの、で「タブの行」によってブロックされています。 SSCCEではこのボタンをクリックできません。しかし、この領域からボタンを追加すると、たとえばこのボタンの境界のy0に設定すると、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ので、「タブの行」の空白は、ボタンの後ろになります必要があります。おかしいですね。スイングはちょうど吸う....

+0

'私はOracle DOCを再読み込みし、どこにも記載されていないことを確かめてください! ' - 動作は' Container.setComponentZOrder(...) 'メソッドで定義されています。 – camickr

+0

このメソッドのAPI(詳細はこちら)(http://docs.oracle.com/javase/7/docs/api/java/awt/Container.html#setComponentZOrder(java.awt.Component、% 20int)は、次のように述べています。「zオーダーは、コンポーネントが塗りつぶされる順序を決定します。最も高いzオーダーの塗料が最初にあるコンポーネント、最も低いzオーダーの塗料が最後にあるコンポーネントです。より高いzオーダーのコンポーネントに比べてzオーダーの塗料を低くすることができます。しかし、最初に追加されたコンポーネントのzオーダーが低いことはわかりません – FaithReaper

+0

コンポーネントを追加するとZオーダーが増加することがわかります。あなたが最高のZOrderを最初に割り当てることができないように、いくつのコンポーネントが追加されるのか分かりません。 – camickr

関連する問題