0

一日中解決できないスイングの問題があります。JWindow誰かが入力した場合にポップアップを表示したいJTextField. FormLayoutしかし、レイアウトが 1 つの行により多くのコンポーネントを含むJGoodies を使用すると、表示が崩れます。

あなたはなにか考えはありますか?

2 番目のテキスト フィールドに文字を入力した後のスクリーンショット:

ここに画像の説明を入力

Jans コードを編集して「a」を 3 回入力した後:

ここに画像の説明を入力

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

1 に答える 1

1

レイアウトに関するヘルプを得る最良の方法は、UI のスケッチを画像または ASCII として提供することです。ここでは、あなたが何を考えていたかを推測しているだけです。

まず、FormLayout良いレイアウトです。移植可能なレイアウトを作成します。BoxLayoutやのような古いレイアウトとは異なりGridBagLayout、ピクセルではなくダイアログ単位を使用します。このようにして、さまざまな画面サイズに移植可能なレイアウトを作成できます。実際、FormLayout真にポータブルな UI の作成を可能にした最初の Java レイアウト マネージャーです。それを行うことができる他の2つはMigLayoutGroupLayout.

MigLayout可能であれば、代わりに使用してみてください。MigLayoutに触発され FormLayout、大幅に改善されました。たとえば、 ではMigLayoutギャップを 1 回設定しますが、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);
            }
        });
    }
}

スクリーンショット:

ここに画像の説明を入力

于 2016-09-04T15:30:04.027 に答える