2013-10-07 41 views
0

當在顯式設置組件的位置(使用id.x和id.y約束)並調整添加組件的容器大小時,我在MigLayout中遇到問題。這裏是一個SSCCE:明確設置位置時發生MigLayout問題

import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 

import net.miginfocom.swing.*; 

public class MigClass extends JFrame { 

    MigClass(String title) { 
     super(title); 
     MigLayout layout = new MigLayout(); 
     setLayout(layout); 
     final JPanel content = new JPanel(new MigLayout()); 

     final JLabel l1 = new JLabel("A label"); 
     content.add(l1, "push, center, top, id l1"); 
     l1.addMouseListener(new MouseListener() { 
      @Override 
      public void mouseClicked(MouseEvent e) { 
       final JTextField editor = new JTextField(5); 
       content.add(editor, "pos l1.x l1.y"); 
       editor.setVisible(true); 
       l1.setVisible(false); 
       editor.addKeyListener(new KeyListener() { 
        @Override 
        public void keyTyped(KeyEvent e) { 
        } 

        @Override 
        public void keyPressed(KeyEvent e) { 
         if(e.getKeyCode() == (KeyEvent.VK_ENTER)) { 
          l1.setText(editor.getText()); 
          editor.setVisible(false); 
          l1.setVisible(true); 
         } 
        } 

        @Override 
        public void keyReleased(KeyEvent e) { 
        }     
       }); 
      } 

      @Override 
      public void mousePressed(MouseEvent e) { 
      } 

      @Override 
      public void mouseReleased(MouseEvent e) { 
      } 

      @Override 
      public void mouseEntered(MouseEvent e) { 
      } 

      @Override 
      public void mouseExited(MouseEvent e) { 
      } 

     }); 
     add(content, "grow, push, span"); 
     pack(); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     MigClass gui = new MigClass(null); 
    } 
} 

JTextField編輯器有沒有合適的位置(應該L1重疊的位置),如果約束"push"被添加到標籤(出現這種情況僅當幀被放大)。我怎麼解決這個問題?

+0

嗯...可能是一個錯誤。好奇:爲什麼不在列約束上使用增長(從而避免推動組件約束)? – kleopatra

回答

0

它沒有在文檔中明確說明,但您不能將 與網格結構混合相對定位。使用 的相對定位或正常的網格結構。

有沒有必要有兩個MigLayout經理設置。 面板可以簡單地添加到 BorderLayout的中心區域。

我想出了一個解決方案,該解決方案利用了hidemode約束。

package com.zetcode; 

import java.awt.EventQueue; 
import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import net.miginfocom.swing.MigLayout; 


public class MigLayoutReplaceEx extends JFrame { 

    public MigLayoutReplaceEx() { 

     initUI(); 

     setSize(300, 250); 
     setTitle("Replace component"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLocationRelativeTo(null); 
    } 

    private void initUI() { 

     JPanel pnl = new JPanel(new MigLayout()); 

     JLabel lbl = new JLabel("A label"); 
     pnl.add(lbl, "cell 0 0, hidemode 3");   

     JTextField field = new JTextField(10); 
     pnl.add(field, "cell 0 0, hidemode 3"); 
     field.addKeyListener(new KeyAdapter() { 

      @Override 
      public void keyPressed(KeyEvent e) { 
       if (e.getKeyCode() == (KeyEvent.VK_ENTER)) { 

        lbl.setText(field.getText()); 
        field.setVisible(false); 
        lbl.setVisible(true); 
       } 
      } 
     }); 

     field.setVisible(false); 

     lbl.addMouseListener(new MouseAdapter() { 
      @Override 
      public void mouseClicked(MouseEvent e) { 

       lbl.setVisible(false); 
       field.setVisible(true); 
      } 
     }); 

     add(pnl); 
    } 

    public static void main(String[] args) { 

     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       MigLayoutReplaceEx ex = new MigLayoutReplaceEx(); 
       ex.setVisible(true); 
      } 
     }); 
    } 
} 

該示例在窗口中顯示標籤。點擊標籤我們隱藏標籤 並顯示一個文本字段。當我們在字段中按回車時,文本字段被隱藏 並顯示標籤,從文本字段複製新文本。

hidemode 3隱形組件不參與佈局。因此,我們可以動態地在其他組件 始終隱藏的同一單元中顯示組件。