2016-09-04 13 views
0

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

ご意見はありますか?

enter image description here

コードJavaで:ヤンスコードとタイピング "" sowly 3回を編集した後

enter image description here

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

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パネル=新しいJPanel();' 'val'とは何ですか?もっと早く助けを求めるには、[MCVE]または[短く、自己完結型の正しい例](http://www.sscce.org/)を投稿してください。 –

+0

梱包: フレーム。パッケージ - >アプリケーション用 popup.pack - > JWindowポップアップ用 val:私が書いたコードはScalaで書かれています。 – Andras

+0

'' KeyEvent'が検出されるまで 'popup'はパックされていないようです。それは見えるようになる前に**パックされるべきです! –

答えて

1

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

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

可能であれば、代わりにMigLayoutをお試しください。 MigLayoutは、 FormLayoutに触発され、大幅に改善されました。たとえば、MigLayoutではギャップを1回設定し、FormLayoutではを使用して、レイアウトを行う際に間違いなくギャップを考慮します。

訂正:

1)setVisible()メソッドの前pack()メソッドを呼び出します。

2)レイアウトを作成するために不要なパネルを使用しないでください。おそらく、レイアウトを作成するためにパネルが使用されたいくつかの例があります。これは、BoxLayoutのような管理者が非常に単純で、私たちが を必要としたためです。 FormLayoutMigLayoutでは、これは必要ありません。

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( "Middle")、CC.xy(2、4)); // new line frame.add(tf、CC.xywh 4、4、1、1)); //新しい制約 – Andras

+0

どのようなエラー?私はエラーを見ない。 –

+0

こんにちは1月、行の後の質問の新しいスクリーンショットを参照してください: Jansコードを編集し、3回sowlyを入力した後 – Andras

関連する問題