2014-10-17 4 views
2

JTabbedPane의 빈 칸에 추가하려고합니다 (탭 오른쪽과 내용 패널 위). 탭 패널의 추가 공간에 레이블을 추가하는 방법

나는 ( MigLayout를 사용하여)이 SSCCE 매우 가까이 :

public static void main(String[] args) { 
    try { 
     UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); 
    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e) { 
     e.printStackTrace(); 
    } 

    JFrame frame = new JFrame(); 
    frame.setLayout(new MigLayout(new LC().fill().insetsAll("0"))); 

    JTabbedPane jtp = new JTabbedPane(); 
    jtp.add(new JPanel(), "Tab 1"); 
    jtp.add(new JPanel(), "Tab 2"); 

    JLabel label = new JLabel("label"); 

    JPanel panel = new JPanel(new MigLayout(new LC().fill())); 
    panel.add(jtp, "id tabbedpane, grow, span"); 
    panel.add(label, "pos (tabbedpane.w-label.w) 10, id label"); 
    label.setBounds(100, 100, 10, 10); 

    frame.add(panel, "grow, span"); 
    frame.setSize(500, 500); 
    frame.setLocationRelativeTo(null); // Sorry, Andrew Thompson 
    frame.setVisible(true); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
} 

그러나이 불행하게도,이 SSCCE가 MigLayout 버그 (: MigLayout error: "Unstable cyclic dependency in absolute linked values!"를 읽기) 안타. 당신이 WindowsLookAndFeel 코드를 제거하는 경우,이 있습니다 :

WindowsLookAndFeel 부족을 제외하고 내가 원하는 것을 정확하게

enter image description here

(내 응용 프로그램에 대한 요구 사항 인, MigLayout이 아닌). 그래도 MigLayout 없이는이 작업을 수행하는 방법을 알 수 없습니다.

빈 공간에 JLabel을 어떻게 추가 하시겠습니까?

+0

레이아웃과 관련하여 이러한 끔찍한 해결 방법이 필요한 이유는 무엇입니까? 왜 JLayer가 아니겠습니까? –

답변

4

당신은 OverlayLayout에 시도 할 수 있습니다 :

import java.awt.*; 
import javax.swing.*; 
import javax.swing.plaf.*; 

public class TabbedPaneWithComponent 
{ 
    private static void createAndShowUI() 
    { 
     JPanel panel = new JPanel(); 
     panel.setLayout(new OverlayLayout(panel)); 

     JTabbedPane tabbedPane = new JTabbedPane(); 
     tabbedPane.add("1", new JTextField("one")); 
     tabbedPane.add("2", new JTextField("two")); 
     tabbedPane.setAlignmentX(1.0f); 
     tabbedPane.setAlignmentY(0.0f); 

     JCheckBox checkBox = new JCheckBox("Check Me"); 
     checkBox.setOpaque(false); 
     checkBox.setAlignmentX(1.0f); 
     checkBox.setAlignmentY(0.0f); 

     panel.add(checkBox); 
     panel.add(tabbedPane); 

     JFrame frame = new JFrame("TabbedPane With Component"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(panel); 
     frame.setLocationByPlatform(true); 
     frame.setSize(400, 100); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowUI(); 
      } 
     }); 
    } 
} 

편집 : 여기

내가 X를 기반으로하는 방법 레이아웃 작품을 조사하기 위해 함께 넣어 약간의 테스트 프로그램/구성 요소의 Y 정렬 :

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.border.*; 

public class OverlayLayoutTest extends JPanel 
    implements ActionListener 
{ 
    JPanel green; 
    JPanel red; 
    JLabel greenLabel; 
    JLabel redLabel; 
    JComboBox greenAlignmentX; 
    JComboBox greenAlignmentY; 
    JComboBox redAlignmentX; 
    JComboBox redAlignmentY; 

    public OverlayLayoutTest() 
    { 
     setLayout(new BorderLayout(10, 10)); 
     add(createNorthPanel(), BorderLayout.NORTH); 
     add(createCenterPanel(), BorderLayout.CENTER); 
     add(createSouthPanel(), BorderLayout.SOUTH); 
    } 

    private JPanel createNorthPanel() 
    { 
     JPanel panel = new JPanel(); 

     panel.add(new JLabel("Green:")); 
     greenLabel = new JLabel(); 
     panel.add(greenLabel); 

     panel.add(new JLabel("Red:")); 
     redLabel = new JLabel(); 
     panel.add(redLabel); 

     return panel; 
    } 

    private JPanel createCenterPanel() 
    { 

     JPanel panel = new JPanel(); 
     panel.setLayout(new OverlayLayout(panel)); 
     panel.setBackground(Color.ORANGE); 
     panel.setPreferredSize(new Dimension(200, 200)); 

     red = new JPanel(); 
     red.setBackground(Color.RED); 
     red.setPreferredSize(new Dimension(50, 50)); 
     red.setMaximumSize(red.getPreferredSize()); 
     red.setMinimumSize(red.getPreferredSize()); 
     panel.add(red); 

     green = new JPanel(); 
     green.setBackground(Color.GREEN); 
     green.setPreferredSize(new Dimension(100, 100)); 
     green.setMaximumSize(green.getPreferredSize()); 
     green.setMinimumSize(green.getPreferredSize()); 
     panel.add(green); 

     JPanel wrap = new JPanel(); 
     wrap.add(panel); 
     return wrap; 
    } 

    private JPanel createSouthPanel() 
    { 
     JPanel panel = new JPanel(new GridLayout(1, 0, 10, 10)); 

     JPanel green = new JPanel(new GridLayout(0, 2, 5, 5)); 
     green.setBorder(new TitledBorder("Green Alignment")); 
     green.add(new JLabel("X Alignment:")); 
     greenAlignmentX = createComboBox(); 
     green.add(greenAlignmentX); 
     green.add(new JLabel("Y Alignment:")); 
     greenAlignmentY = createComboBox(); 
     green.add(greenAlignmentY); 
     panel.add(green); 

     JPanel red = new JPanel(new GridLayout(0, 2, 5, 5)); 
     red.setBorder(new TitledBorder("Red Alignment")); 
     red.add(new JLabel("X Alignment:")); 
     redAlignmentX = createComboBox(); 
     red.add(redAlignmentX); 
     red.add(new JLabel("Y Alignment:")); 
     redAlignmentY = createComboBox(); 
     red.add(redAlignmentY); 
     panel.add(red); 

     JButton reset = new JButton("Reset Alignment"); 
     reset.addActionListener(this); 
     panel.add(reset); 


     return panel; 
    } 

    public void actionPerformed(ActionEvent e) 
    { 
     green.setAlignmentX(((Float)greenAlignmentX.getSelectedItem())); 
     green.setAlignmentY(((Float)greenAlignmentY.getSelectedItem())); 
     red.setAlignmentX(((Float)redAlignmentX.getSelectedItem())); 
     red.setAlignmentY(((Float)redAlignmentY.getSelectedItem())); 
     JPanel parent = (JPanel)green.getParent(); 
     parent.revalidate(); 

     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       greenLabel.setText(green.getLocation().toString()); 
       redLabel.setText(red.getLocation().toString()); 
      } 
     }); 

    } 

    private JComboBox createComboBox() 
    { 
     JComboBox<Float> comboBox = new JComboBox<Float>(); 

     comboBox.addItem(new Float(0f)); 
     comboBox.addItem(new Float(0.25f)); 
     comboBox.addItem(new Float(0.5f)); 
     comboBox.addItem(new Float(0.75f)); 
     comboBox.addItem(new Float(1.0f)); 
     comboBox.setSelectedItem(0.5f); 

     return comboBox; 
    } 

    private static void createAndShowUI() 
    { 
     JFrame frame = new JFrame("OverlayLayoutTest"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new OverlayLayoutTest()); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowUI(); 
      } 
     }); 
    } 
} 
+0

분명히, 나는 동굴에 살고있었습니다. 나는이 레이아웃에 대해 들어 본 적이 없다. 여기에 나와 있지도 않습니다. http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html 또는 http://docs.oracle.com/javase/tutorial/uiswing/layout/using. html로 보였으 나 최소한 Java 1.4 이후로 주변에 있었습니까? 이제 내가 사용한 모든 엉뚱한 JLayeredPane 코드를 다시 검사해야합니다. – splungebob

+0

@splungebob 왜 레이아웃이 스윙 튜토리얼에서 언급되지 않았는지 모르겠다. X/Y 정렬이 모든 구성 요소에서 동일 할 때 비교적 쉽게 사용할 수 있습니다. 정렬이 다를 때 레이아웃을 이해하는데 약간의 어려움이 있습니다. 예를 들어 방금 추가 한 두 번째 데모를 실행하면 레이아웃이 의미가 있습니다. 그런 다음 Red X Alignment를 1.0으로 변경하십시오. Red가 녹색의 왼쪽 가장자리에 정렬 된 이유는 무엇입니까? 나는 그것이 우익이어야한다고 생각했을지도 모른다. 어쨌든 재미있게 놀고있다 :) – camickr