8

私はmiglayoutを使用して、JTextFields(短い入力回答)とJTextAreas(長い回答)があるフォームを作成しています。問題は2つあります。

  1. スクロールペインでラップされたテキスト領域の周囲に配置された境界線が、テキストフィールドの境界線と一致しません。
  2. textarea / textfieldの幅と配置が異なるため、正しく整列しません。

代替テキストhttp://grab.by/3O0V

右/左から右/塗りつぶしに変更した後: alt text http://grab.by/3RMk 境界が並んでいることがわかりますが、まだギャップがあります。novisualpaddingを設定しようとしましたが、修正されませんでした。

ソースコード:

package test2;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import net.miginfocom.swing.MigLayout;

public class Test extends JPanel {

private static final int NUM_CHARACTERS_WIDTH = 20;
private static final int NUM_ROWS = 5;
public Test() {

    setLayout(new MigLayout(
            "wrap 2",
            // Align text labels on the so their right edge meets left edge of the text fields
            "[right][left]"
            ));

    add(new JLabel("Text field:"));
    add(new JTextField(NUM_CHARACTERS_WIDTH));

    add(new JLabel("No scrollpane text area:"));
    add(new JTextArea(NUM_ROWS, NUM_CHARACTERS_WIDTH));

    add(new JLabel("Scrollpane text area:"));
    add(new JScrollPane(new JTextArea(NUM_ROWS, NUM_CHARACTERS_WIDTH)));

    add(new JLabel("Text field:"));
    add(new JTextField(NUM_CHARACTERS_WIDTH));

}


public static void main(String[] args) {
    JFrame frame = new JFrame("");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JPanel panel = new Test();
    frame.add(panel);
    frame.pack();
    frame.setVisible(true);
}

}

視覚的な調和を維持しながら、jtextfieldとjtextareasを組み合わせて一致させるための好ましい方法は何ですか?テキスト領域とは対照的に、フォーカスがテキストフィールドにある場合、テキストフィールドの周囲に青いハイライトがあることに気付きました...視覚的な不連続性のもう1つの原因です。

4

6 に答える 6

8

私はこの質問がかなり古いことを知っていますが、aの境界線を:の境界線TextAreaと一致させるためにTextField

(myTextArea).setBorder(new JTextField().getBorder());

TextAreaそれはあなたの周りのような境界線を与えるはずTextFieldです。

于 2014-06-03T20:50:57.103 に答える
3

境界線の問題をどのように修正できるかわかりませんが、レイアウトの状況を修正するには、springlayoutを使用します。Springlayoutは、JPanel内で要素をより適切にレイアウトするための単なる方法です。あなたはそれについてもっと知ることができますJavaSunチュートリアル

具体的には、各要素の北、南、西、東の境界線を設定して使用します。これを行うには、最初にラベル呼び出しを追加から外して、それぞれに名前を付ける必要があります。したがって、代わりに:

add(new JLabel("Text field:"));

行う:

JLabel myLabelName = new JLabel("Text field:");
add(myLabelName);

要素(JLabels、JTextAreas、JTextField)ごとに。これが完了すると、レイアウトを簡単に設定できます。

Springlayout layout = new SpringLayout();
setLayout(layout);

次に、要素ごとに、必要な境界線を設定する必要があります。それらは、南、北、西、東の順に特定の順序である必要があります。必要がなければ、4つの境界線すべてを使用する必要はありませんが。一番上にある最初のテキスト領域を設定する方法の例を次に示します。

layout.putConstraint(SpringLayout.NORTH, FirstTextAreaName, 10, SpringLayout.NORTH, this);
layout.putConstraint(SpringLayout.WEST, FirstTextAreaName, this.getWidth()/2, SpringLayout.WEST, this);
layout.putConstraint(SpringLayout.EAST, FirstTextAreaName, -10, SpringLayout.EAST, this);

この例では、テキストエリアの南を設定していませんが、必要に応じて最初に設定する必要があります。最初の行は、テキスト領域の北側を上から10ピクセル離すように設定します。他のエリアを設定するときは、前の(上記の)エリアにこれの代わりに名前を付け、前のエリアの南から10ピクセル離れていると言います。

layout.putConstraint(SpringLayout.NORTH, SecondTextAreaName, 10, SpringLayout.SOUTH, FirstTextAreaName);

上記の例の2行目は、テキスト領域の東側をメインパネルの途中から開始するように設定しています。最後の3行目は、テキスト領域の東側をメインパネルの東側から10ピクセルに設定します。

于 2010-04-16T17:44:30.307 に答える
2

レイアウトの問題については、の代わりにのcolumnConstraints値を試してください。[right][fill][right][left]

他の問題については、これはルックアンドフィールの不一致であるように見えます。私はあなたのコードをWindowsで実行しました、そして違いもそこにありますが、それほど目立たないものです。私の提案は、テキストフィールドとテキスト領域に明示的に同一の境界線を設定することです。

setLayout(new MigLayout(
        "wrap 2",
        "[right][fill]"
        ));

JTextField textField;
JScrollPane scrollPane;

add(new JLabel("Text field:"));
textField = new JTextField(NUM_CHARACTERS_WIDTH);
textField.setBorder( new EtchedBorder( EtchedBorder.LOWERED ) );
add(textField);

add(new JLabel("No scrollpane text area:"));
add(new JTextArea(NUM_ROWS, NUM_CHARACTERS_WIDTH));

add(new JLabel("Scrollpane text area:"));
scrollPane = new JScrollPane(new JTextArea(NUM_ROWS, NUM_CHARACTERS_WIDTH));
scrollPane.setBorder( new EtchedBorder( EtchedBorder.LOWERED ) );
add(scrollPane);

add(new JLabel("Text field:"));
textField = new JTextField(NUM_CHARACTERS_WIDTH);
textField.setBorder( new EtchedBorder( EtchedBorder.LOWERED ) );
add(textField);

同一の境界線

MigLayoutでコンポーネントを整列させることができない場合は、java.awt.GridBagLayoutの使用を検討してください。

import static java.awt.GridBagConstraints.*;

setLayout( new GridBagLayout() );

GridBagConstraints leftCons = new GridBagConstraints();
leftCons.anchor = NORTHEAST;
leftCons.fill = NONE;
leftCons.weightx = 1.0;
leftCons.gridy = RELATIVE;
leftCons.gridx = 0;
leftCons.insets = new Insets( 4, 8, 4, 8 );

GridBagConstraints rightCons = new GridBagConstraints();
rightCons.anchor = NORTHWEST;
rightCons.fill = HORIZONTAL;
rightCons.weightx = 1.0;
rightCons.gridy = RELATIVE;
rightCons.gridx = 1;
rightCons.insets = leftCons.insets;

add(new JLabel("Text field:"), leftCons);
add(new JTextField(NUM_CHARACTERS_WIDTH), rightCons);

add(new JLabel("No scrollpane text area:"), leftCons);
add(new JTextArea(NUM_ROWS, NUM_CHARACTERS_WIDTH), rightCons);

add(new JLabel("Scrollpane text area:"), leftCons);
add(new JScrollPane(new JTextArea(NUM_ROWS, NUM_CHARACTERS_WIDTH)), rightCons);

add(new JLabel("Text field:"), leftCons);
add(new JTextField(NUM_CHARACTERS_WIDTH), rightCons);
于 2010-04-16T18:37:06.180 に答える
2

MiGLAyout(大好きです、ところで)には、視覚的な位置合わせと厳密なピクセル位置合わせのための特別な処理を行う機能があることを私は知っています。これに遭遇している可能性があります...これには「al」ユニット識別子が使用されますが、私はそれを使用する必要がなかったため、例を提供できません。MiGサンプルプロジェクトをダウンロードして、同じ配置の問題があるかどうかを確認することはおそらく価値があります(あなたと同様のパネルがあると確信しています)。

価値があるので、同じパネル内のテキストフィールドと領域を頻繁に混合し、これに遭遇することはありません...スクロールペインの境界をテキストフィールドの境界と同じに設定する必要があります。 NoelAngによって提案されました。

また、レイアウトコンストラクターで制約を指定する代わりに、通常、各コンポーネントを追加するときに制約を指定します-それが違いを生むかどうかはわかりません...

于 2010-04-17T05:26:06.797 に答える
0

最初にスクリーンショットの+1をオフにします。Macを使用しているので、Quaqua Look And Feelを試しましたか?テキストボックス/エリアを適切にレンダリングします。

于 2010-04-19T19:58:06.773 に答える
0

答えは、MiGLayoutの人々が次のバージョンの修正に取り組んでいるということです。

こんにちは、

Appleには、デフォルトで補償するという厄介な習慣があり、開発者に決定させない。これは、OS Xのように視覚的に見えるように境界線を追加した場合です。これは、レイアウトマネージャーの選択です...

MigLayoutは、このような視覚的な境界を補正できますが、WindowsXPのJTabbedPaneに対してのみ実行されます。ただし、OS Xで100%うまく実行できるかどうかはわかりません。確認する必要があります。テキストフィールドが境界にまで拡大することは望ましくありません。

これを次のバージョンのtodoリストに追加しました。

于 2010-04-22T13:27:07.503 に答える