2017-02-20 53 views
0

То, что я хочу, как:Swing - кнопка блокируется «лапок строки» в JTabbedPane, где нет нет вкладки

enter image description here

Но кнопка должна быть интерактивными. Теперь, когда мой SSCCE, эта кнопка не может быть нажата. Но если я добавлю кнопку из этой области, например. установите y границ этой кнопки на 0, она больше не находится за «табуляцией» 10 и, таким образом, можно щелкнуть.

Итак:

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

Мой коллега сказал мне причину.

Это не имеет никакого отношения к макету, а просто к порядку добавления компонентов. Кажется, что ось Z Java Swing ведет себя неинтуитивно: от верхнего слоя до нижнего уровня, что означает, что если вы добавите компонент 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#setComponentZOder (java.awt.Component,% 20int) сказано: «z-порядок определяет порядок окрашивания компонентов, последний компонент с наивысшими красками z-порядка и компонент с наименьшими красками z-порядка. Когда компоненты перекрываются, компонент с более низкие z-порядковые краски над компонентом с более высоким z-порядком. Но мы не знаем, что первый добавленный компонент имеет более низкий z-порядок. – FaithReaper

+0

Имеет смысл для меня, что ZOrder увеличивается по мере добавления компонентов. Не знаете, сколько компонентов будет добавлено, чтобы вы не могли назначить самый высокий ZOrder. – camickr