1

私は Java とそのスイング コンポーネントに非常に苦労しています。C# でプログラミングしたときの方がはるかに簡単だったと言わざるを得ません。

私がやろうとしているのは、にいくつかのパネルを追加することですanother panel。これは、参加したプロジェクトで実行する必要があるタスクをユーザーに表示するためです。

左側にパネルが表示されます。さらにパネルを追加したいと思います。

Gui の右側にパネルを作成しました。実行時にさらにパネルを追加したいと考えています。パネルを 1 つ追加できましたが、奇妙な動作がいくつかあります。

ここに画像の説明を入力

青いパネルは、newly created実行時にこのコードで追加したパネルです。

  JPanel pnl = new JPanel();
  lpane.setBackground(Color.red);
  lpane.setLayout(new BorderLayout());
  pnl.setBounds(0, 0, 20, 100);
  pnl.setOpaque(true);
  pnl.setBackground(Color.BLUE);
  lpane.add(pnl);
  lpane.validate();

これは単なるテストです。そのため、コードには残りのパネルの for ループなどが含まれていません。ご覧のとおりBorderLayout、インターネットでこれを見つけたので使用しています。BorderLayout がないと何も描画されないためです。また、BorderLayout を .NORTH または .STARTPAGE に設定しようとすると、パネルの上に描画が開始されますが、まだパネルの位置を設定できませんか?

位置や幅と高さを設定できない理由を誰かが知っていますか?

4

3 に答える 3

3

わかりましたので、ここに役立つコードをいくつか示しますが、http://docs.oracle.com/javase/tutorial/uiswing/にある Swing チュートリアルに時間を費やすことをお勧めします。

レイアウト マネージャーは、レイアウトを柔軟かつ動的にするために存在しますが、それらを本当に理解するには、ある程度の時間と練習が必要です。以下のコードは、目的を達成するための 1 つの方法ですが、すべてのユース ケースに適したコードではない可能性があります。

注: これは製品レベルのコードではなく、要点を説明するためのものです。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;

/**
 * Simple app to demonstrate how to use basic layout managers.
 * @author ewald
 */
public class LayoutPanels {

    private JFrame frame = new JFrame("The Top Frame");

    public LayoutPanels() {
        frame.setSize(640, 480);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new BorderLayout());
    }


    /**
     * Sample code - this is not best practice, but it will help
     * you to make some progress.
     */
    public void startUp() {
        JPanel topPanel = new JPanel(new BorderLayout());

        JPanel eastPanel = new JPanel();
        eastPanel.setBackground(Color.BLUE);
        eastPanel.setLayout(new FlowLayout());
        eastPanel.setPreferredSize(new Dimension(150,200));

        JPanel onePanel = new JPanel(new FlowLayout());
        JPanel twoPanel = new JPanel(new FlowLayout());
        JPanel threePanel = new JPanel(new FlowLayout());

        onePanel.setPreferredSize(new Dimension(100,50));
        twoPanel.setPreferredSize(new Dimension(100,50));
        threePanel.setPreferredSize(new Dimension(100,50));

        onePanel.setBackground(Color.RED);
        twoPanel.setBackground(Color.GREEN);
        threePanel.setBackground(Color.YELLOW);

        eastPanel.add(onePanel);
        eastPanel.add(twoPanel);
        eastPanel.add(threePanel);

        topPanel.add(eastPanel, BorderLayout.EAST);

        frame.getContentPane().add(topPanel, BorderLayout.CENTER);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        LayoutPanels app = new LayoutPanels();
        app.startUp();
    }

}
于 2012-06-01T08:50:16.400 に答える
3
  • BorderLayout5.配置エリアを実装しましたJComponents

  • JComponentコンクリート領域に最後に追加されたものは、を使用して表示されますBorderLayout

  • use (pre_implemented in JPanel) FlowLayout、JComponents からの PreferredSize を受け入れる

  • GridLayout画面上で同じサイズの子供向け

  • いくつかのルールSwing LayoutManager の仕組み

于 2012-06-01T08:20:28.983 に答える
2

これにはいくつかのアプローチがあるでしょう。1 つの方法は、親パネルで BoxLayout.Y_AXIS を使用することです。これにより、子パネルが追加されると、それらが互いの下に追加されます。5 つの領域を持つ BorderLayout とは対照的に、このタスクには適切なアプローチではありません。

JPanel pnl = new JPanel();
pnl.setLayout(new BoxLayout(pnl, BoxLayout.Y_AXIS)); // This will cause your new panels to be added below eachother
pnl.setBackground(Color.BLUE);
//and set sizes etc

JPanel newPanel = new JPanel();
newPanel.setLayout(new FlowLayout(FlowLayout.LEFT)); // set layout on your child panel. FlowLayout is default but you might want to read up on the different layoutmanagers to pick the right one.
newPanel.setSize(50, 50); // you can use pnl.getWidth to make your panels to have the same width as it's parent pane, but you probably want the height to be locked
//and add the contents to this panel
pnl.add(newPanel);
于 2012-06-01T08:37:18.750 に答える