0

テキストバー、プログレスバーなどでステータスバーを作りたいです。しかし、物事はうまく機能していません。

最初はテキスト バーしかなく、ステータス バーは次の例のように表示されていました (親コンテナーは必要ありませんでした)。

import java.awt.BorderLayout;
import java.awt.Dimension;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Main
{   
    public static void main(String[] args)
    {           
        //Display actual GUI
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                new Gui();
            }
        });
    }
}

class Gui
{   
    public Gui()
    {   
        JFrame masterWindow = new JFrame();

        masterWindow.setSize(1100, 800);
        masterWindow.setMinimumSize(new Dimension(400, 400));
        masterWindow.setLocationRelativeTo(null);
        masterWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel rootPanel = new JPanel();
        rootPanel.setLayout(new BorderLayout());

        StatusBar statusBar = new StatusBar();
        rootPanel.add(statusBar, BorderLayout.SOUTH);

        masterWindow.setContentPane(rootPanel);
        masterWindow.setVisible(true);
    }
}

class StatusBar extends JLabel
{
    private static final long serialVersionUID = 1L;

    StatusBar()
    {   
        super("welcomeText");
        add(textBar);

        setOpaque(true);
        setBorder(BorderFactory.createLoweredSoftBevelBorder());
    }
}

それは正常に機能します。ただし、ステータス バーの高さに注意してください。ここで、StatusBar クラスを下のクラスに変更すると、高さがほぼ 2 倍になります。なぜそれが起こっているのですか?

このセットアップでは、より多くの垂直スペースが必要になるわけではありません。

public class StatusBar extends JPanel
{
    private static final long serialVersionUID = 1L;

    StatusBar()
    {
        super();

        JLabel textBar = new JLabel(Main.language.getString("welcomeText"));
        add(textBar);

        setOpaque(true);
        setBorder(BorderFactory.createLoweredSoftBevelBorder());
    }
}

なぜこれが起こっているのですか? どうすれば停止できますか?

編集: BorderLayout は確かに機能しましたが、MigLayout を使用したかったのです。

私はそれを理解しましたが、ここで別の問題が発生します。追加の progresBar は東にドッキングされず、セパレーターも表示されません。

コードは次のとおりです。

public class StatusBar extends JPanel
{
    private static final long serialVersionUID = 1L;
    JLabel textBar;
    JProgressBar progressBar;

    StatusBar()
    {
        setLayout(new MigLayout("insets 0, gap 0!")); //Mig has some gaps inbetween components, this will remove the gaps

        textBar = new JLabel(Main.language.getString("welcomeText"));

        progressBar = new JProgressBar(0, 100);

        JSeparator separator = new JSeparator(SwingConstants.VERTICAL);

        add(textBar);
        add(separator);
        add(progressBar, "east");

        setOpaque(true);
        setBorder(BorderFactory.createLoweredSoftBevelBorder());
    }
}

これを新しい質問にすることはできますが、それだけの価値はないと思います...

4

2 に答える 2

1

その理由は、super()を呼び出すと、スーパークラスの引数なしのコンストラクター(この場合はJPanel)が実行されるためです。javadocによると

JPanel()-ダブルバッファとフローレイアウトを使用して新しいJPanelを作成します。

したがって、を呼び出すとsuper()、とのJPanelFlowLayoutが作成されます。

レイアウトを次のように変更してみてくださいBorderLayout

于 2013-02-13T02:04:56.083 に答える
1

のレイアウトをに設定しJPanelますBorderLayout

   class StatusBar extends JPanel
    {
        private static final long serialVersionUID = 1L;

        StatusBar()
        {
            super();
            this.setLayout(new BorderLayout());  //set layout
            JLabel textBar = new JLabel(Main.language.getString("welcomeText"));
            add(textBar);

            setOpaque(true);
            setBorder(BorderFactory.createLoweredBevelBorder());
        }
    }
于 2013-02-13T01:54:30.650 に答える