2017-02-20 27 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