0

これが私の現在の GUI のスクリーンショットです。

現在の GUI

メイン フレームのコンテンツ ペインに使用する LayoutManager がわかりません。この図では、メイン ウィンドウが論理的に左右のセクションに分割されていることがわかります。左側のセクションには検索コンポーネントがあり、右側のセクションは出力です。

私が読んだことから、BorderLayout または GridBagLayout のいずれかが機能するように見えますが、この MigLayout についてさらに読むと、それも機能するようです。また、各側で内部的に使用する LayoutManagers についても混乱しています。基本的に、私は情報過多に混乱しており、何を使用すればよいか分からないので、プロのプログラマーにこの場合は何を使用するかを尋ねようと思いました。

4

2 に答える 2

4

メイン フレームのコンテンツ ペインにはどのレイアウト マネージャーを使用すればよいですか?

それは簡単な質問です。ほとんどの Swing GUI には main が 1 つあるはずなので、FlowLayoutまたはを使用する必要があります。BorderLayoutJPanel

複雑な GUI

あなたの本当の質問は少し難しいです。複雑な GUI レイアウトがあり、JPanel複数のレイアウト マネージャーが必要です。

以下のコメントは私の第一印象です。GUI の実際のコーディングのテストに基づいて変更を行う権利を留保します。

右側

GUI の右側にはJTabbedPane. JPanelの の1 つしか見えませんJTabbedPane。そのためのレイアウト マネージャーJPanelGridBagLayout.

左側

GUI の左側では、JPanel内に 4 秒必要JPanelです。左側のレイアウト マネージャーJPanelBoxLayout、Y 軸です。

左側JPanelの 4 sのトップは a を使用します。JPanelGridBagLayout

上部中央JPanelは 2 つJPanelの で構成されます。1 つ目JPanelBoxLayout、Y 軸を使用して aJLabelと aを保持しJListます。2 つ目JPanelは、a を使用しGridBagLayoutて 3 つのボタンを保持します。ボタンのGridBagLayout間隔を取得するために必要です。

下中央JPanelは aとFlowLayoutを保持するために a を使用します。JLabelJTextField

下部にJPanelは 2 つのボタン グループがあります。最初のグループにはタイトルがありますが、2 番目のグループにはありません。 のレイアウト マネージャーはJPanelXBoxLayout軸です。

結論

これがすべて理解できたなら、すばらしいことです。JPanelJava クラスごとに GUIを作成し、テストして Swing コンポーネントが期待どおりにレイアウトされていることを確認します。ウィンドウのサイズを最大化し、手動で変更してJFrame、GUI が期待どおりに変化するかどうかを確認します。

この GUI を組み立てるのに 32 時間から 40 時間かかると思います。ウィンドウ ビルダーを使用すると、この GUI を組み立てるのにおそらく 400 ~ 600 時間かかるでしょう。

ウィンドウビルダーを使用しないでください。Swing コンポーネントの接続が複雑になるだけです。

私のコメントを理解していない場合は、これを読むために私の回答の一番下までたどり着いたかどうかわかりません. :-)

Oracle Swing チュートリアルを学習してください。何もスキップしないでください。Swing を理解できるように、チュートリアル全体を必要に応じて複数回実行してください。学習には時間がかかります。

于 2013-07-19T08:14:38.110 に答える
2

すでに述べたように、私はネスト パネルの大ファンではありません (強力でありながらマスターしやすいサードパーティ マネージャーを発見したので、もうそうではありません :-) 私の現在のお気に入りは MigLayout です。バージョン:

ここに画像の説明を入力

垂直線は、ネストされたレイアウトが持つ悪名高い問題を強調しています: パネル間の位置合わせはサポートされていません (それを達成するためのトリックはありますが)。私のお勧めは、3 つの主要なレイアウト (MigLayout、JGoodies FormLayout、DesignGridbagLayout) のうちの 1 つを習得してから、ほとんどのレイアウトをネストせずに行うことです。

MigLayout layout = new MigLayout(
        // auto-wrap after 4 columns
        "wrap 5", 
        // 5 columns:
        // 1. labels, 2./3. radiobuttons, 
        // 4. buttons, 5. tabbedPane
        "[][fill, sg][fill, sg]u[fill]para[fill, grow]",
        // 7 rows:
        // 1. - 6. default for combos/buttons, 
        // 7. growing table
        // > 7 default 
        // unrelated gaps before/after the table
        "[][][]u[][][][grow, fill]u[]r[]");

JComponent content = new JPanel(layout);
JTabbedPane tabbedPane = new JTabbedPane();
tabbedPane.addTab("SomeTab", new JPanel()); 
String[] labels = { "Company:", "Product Type:", "Product:" };
for (String string : labels) {
    JLabel label = new JLabel(string);
    JComboBox combo = new JComboBox();
    content.add(label);
    if (string.equals(labels[0])) {
        content.add(combo, "span 2");
        // make span all rows, 
        // force a min width 
        content.add(tabbedPane, "skip 1, spany, grow, wmin 500");
    } else {
        content.add(combo, "span 2, wrap");
    }
};
// JXTable supports specifying the visibleRowCount
JXTable table = new JXTable(0, 1);
table.setVisibleRowCount(10);
content.add(new JScrollPane(table), "span 3, spany 4, grow");
String[] buttons = {"Add", "Remove", "Edit"};
for (String string : buttons) {
    content.add(new JButton(string));
}
content.add(new JLabel("Search:"), "newline, skip 2");
JTextField field = new JTextField(12);
content.add(field, "span 2");
content.add(new JLabel("Show only:"), "newline");
String[] checks = {"A", "B", "C"};
String skip = "";
for (String string : checks) {
    content.add(new JCheckBox(string), skip);
    content.add(new JRadioButton(string.toLowerCase()), "wrap");
    skip = "skip";
}
// decorate to show vertical alignment line
DebugLayerUI ui = new DebugLayerUI(field);
JLayer layer = new JLayer(content, ui);

// just for fun, a layerUI which can be used to debug component alignement
public class DebugLayerUI extends LayerUI {
    private Map<JComponent, Integer> markThem;

    public DebugLayerUI(JComponent child) {
        markThem = new HashMap<>();
        markThem.put(child, SwingConstants.VERTICAL);
    }

    public void add(JComponent child, int direction) {
        markThem.put(child,  direction);
    }
    @Override
    public void paint(Graphics g, JComponent c) {
        super.paint(g, c);
        g.setColor(Color.MAGENTA);
        for ( Entry<JComponent, Integer> entry : markThem.entrySet()) {
           JComponent child = entry.getKey(); 
           if (SwingConstants.VERTICAL == entry.getValue()) {
               Point p = SwingUtilities.convertPoint(child, 
                       new Point(0, 0),
                       c);
               g.drawLine(p.x, 0, p.x, c.getHeight());
           } else if (SwingConstants.HORIZONTAL == entry.getValue()) {
               int baseline = child.getBaseline(child.getWidth(), child.getHeight());
               if (baseline > 0) {
                   Point p = SwingUtilities.convertPoint(child, 
                           new Point(0, baseline), c);
                   g.drawLine(0, p.y, c.getWidth(), p.y);
               }
           }
        }
    }

}
于 2013-07-21T09:51:15.020 に答える