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);
}
});
}
}
Скриншот: