2013-10-07 2 views
0

У меня проблема в MigLayout при явной установке позиции компонента (с ограничениями id.x и id.y) и изменении размера контейнера, в который добавлен компонент. Вот 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

hmm ... может быть ошибкой. Любопытно: почему бы вам не использовать рост по ограничению столбца (таким образом, устраняя нажатие на ограничение компонента)? – 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); 
      } 
     }); 
    } 
} 

В примере показан ярлык на окне. Нажав на ярлык, мы скроем метку и покажем текстовое поле. Когда мы нажимаем enter в поле, текстовое поле скрыто и отображается метка, копируя новый текст из текстового поля.

В hidemode 3 невидимые компоненты не участвуют в планировке. Таким образом, мы можем динамически показывать компоненты в одной и той же ячейке, где другой компонент всегда скрыт.

Смежные вопросы