JGoodies FormLayout и JWindow

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

Есть ли у вас какие-либо идеи?

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

введите описание изображения здесь

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

введите описание изображения здесь

Код на 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);
                }
            });
        }
    }

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);
            }
        });
    }
}

Скриншот:

введите описание изображения здесь

Другие вопросы по тегам