2016-09-04 9 views
0

У меня проблема с качелями, которую я не могу решить с целого дня. Я хочу показать всплывающее окно в JWindow, если кто-то вводит JTextField. Но если макет использует JGoodies FormLayout с большим количеством компонентов в одной строке, тогда дисплей будет поврежден.JGoodies FormLayout и JWindow

Есть ли у вас идеи?

Скриншот после ввода нескольких букв во втором текстовом поле:

enter image description here

После редактирования Янс кода и набрав "а" sowly три раза:

enter image description here

код в Java:

package eu.eyan; 

import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 

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

import com.jgoodies.forms.factories.CC; 
import com.jgoodies.forms.layout.FormLayout; 

    public class Snippet { 
     public static void main(String[] args) { 

      JTextField tf = new JTextField(10); 

      JPanel panel = new JPanel(); 
      panel.setLayout(new FormLayout("p", "p,p,p")); 
      panel.add(new JTextField("before"), CC.xy(1, 1)); 
      panel.add(tf, CC.xy(1, 2)); 
      panel.add(new JTextField("after"), CC.xy(1, 3)); 

      JFrame frame = new JFrame(); 
      frame.setLayout(new FormLayout("p,p,p", "p")); 
      frame.add(new JLabel("bef"), CC.xy(1, 1)); 
      frame.add(panel, CC.xy(2, 1)); 
      frame.add(new JLabel("aft"), CC.xy(3, 1)); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.setVisible(true); 
      frame.pack(); 

      JWindow popup = new JWindow(); 
      popup.setLayout(new FormLayout("p", "p")); 
      JLabel l = new JLabel("popup"); 
      popup.add(l, CC.xy(1, 1)); 
      popup.pack(); 

      tf.addKeyListener(new KeyAdapter() { 
       @Override 
       public void keyReleased(KeyEvent e) { 
        popup.setVisible(true); 
       } 
      }); 
     } 
    } 
+0

Где упакована окно? BTW 'val panel = new JPanel();' Что такое 'val'? Чтобы лучше помочь, опубликуйте [MCVE] или [Short, Self Contained, Correct Example] (http://www.sscce.org/). –

+0

Упаковано: рама.pack-> для приложения popup.pack -> для всплывающего окна JWindow val: как я написал код, написан на Scala. – Andras

+0

Кажется, что 'popup' не упакован, пока не обнаружен' KeyEvent'. Это ** должно быть упаковано до того, как оно станет видимым! –

ответ

1

Лучшим способом получения справки по макету является эскиз вашего пользовательского интерфейса, либо как изображение, либо как ASCII. Здесь я только догадываюсь, что вы имели в виду .

Во-первых, FormLayout - хорошая компоновка; он создает макеты, которые переносятся. В отличие от старых макетов, таких как BoxLayout или GridBagLayout, он использует диалоговые блоки вместо пикселей. Таким образом можно создать переносимый макет для разных размеров экрана. Фактически, FormLayout был первым менеджером макетов Java, который позволил создавать действительно портативные интерфейсы. Другие два, которые могут это сделать, - MigLayout и GroupLayout.

Если вы можете, попробуйте вместо этого использовать MigLayout. MigLayout был вдохновлен FormLayout, и это значительно улучшило его. Например, в MigLayout вы используете один раз установить пробелы, тогда как в FormLayout у вас есть , чтобы утомительно принять во внимание пробелы при выполнении макета.

Исправления:

1) Вызвать метод pack() перед методом setVisible().

2) Не используйте ненужные панели для создания макета. Вероятно, вы видели несколько примеров, когда панели были использованы для создания макета. Это было потому, что менеджеры вроде BoxLayout были настолько упрощенны, что нам нужны были . С FormLayout и MigLayout, это не обязательно.

3) Вам также необходимо добавить пробелы в макет в единицах диалогов.

Вот пример того, что я думал, что вы можете достичь:

package com.zetcode.formlayoutex; 

import com.jgoodies.forms.factories.CC; 
import com.jgoodies.forms.layout.FormLayout; 
import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 

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

public class FormLayoutEx { 

    public static void main(String[] args) { 

     JTextField tf = new JTextField(10); 

     JFrame frame = new JFrame(); 
     frame.setLayout(new FormLayout("6dlu, p, 5dlu, p:g, 3dlu", 
       "6dlu, p, 4dlu, p, 4dlu, p, 6dlu")); 
     frame.add(new JLabel("Before"), CC.xy(2, 2)); 
     frame.add(new JTextField("before"), CC.xy(4, 2)); 
     frame.add(tf, CC.xywh(2, 4, 3, 1)); 
     frame.add(new JLabel("After"), CC.xy(2, 6)); 
     frame.add(new JTextField("after"), CC.xy(4, 6)); 


     frame.pack(); 
     frame.setTitle("FormLayout example"); 
     frame.setLocationRelativeTo(null); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 

     JWindow popup = new JWindow(); 
     popup.setLayout(new FormLayout("p", "p")); 
     JLabel l = new JLabel("popup"); 
     popup.add(l, CC.xy(1, 1)); 
     popup.pack(); 

     tf.addKeyListener(new KeyAdapter() { 
      @Override 
      public void keyReleased(KeyEvent e) { 
       popup.setVisible(true); 
      } 
     }); 
    } 
} 

Скриншот:

enter image description here

+0

Привет, спасибо за ответ, но проблема, о которой я упомянул, если в одной строке есть больше компонентов. Если вы измените свой код, как это, то ошибка все еще возникает: frame.add (новый JLabel («Средний»), CC.xy (2, 4)); // новая строка frame.add (tf, CC.xywh (4, 4, 1, 1)); // новое ограничение – Andras

+0

Какая ошибка? Я не вижу ошибки. –

+0

Привет, Jan, см. Новый скриншот в вопросе после строки: После редактирования кода Jans и ввода печально три раза – Andras