1

コンテンツ ペインを含む JFrame があります。JMenuBar はペインの北にドッキングされ、JLabel (一種のステータス バー) は南にドッキングされます。

真ん中は JTabbedPane です。各タブは「ドキュメント」です。ビューポートに JScrollBar と JPanel が含まれています。

それは延々と続きます (ビューポートの JPanel にはより多くの JPanel があり、より多くの JPanel を持つことができます...)、しかしこの例では、(ビューポート内の) JPanel がウィンドウスペース (したがって、スクロールバーを画面に表示できない、または強制的に表示できます)。

ウィンドウに収まる場合はすべて問題ありませんが、高さが高すぎてウィンドウ内に収まらないように設定するとすぐに、JMenuBar が上部に押しつぶされます。

私はそれを防ぎたいです (JMenuBar の絶対的な高さを指定する必要がなくても、おそらくうまくいくでしょうが、それはちょっと安いです)。

これが SCCE です (それほど短くはありませんが、37 行目から 117 行目だけを見る必要があります。レイアウトに関係するすべての行を //TODO でマークしています)。また、いつ問題が発生するか、または発生しないかを確認するには、88 行目の高さの値を 2000 から 200 の間で変更します。もちろん、MiG Layout ライブラリも必要です。

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

import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.util.ResourceBundle;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.KeyStroke;
import javax.swing.ScrollPaneConstants;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;
import javax.swing.UnsupportedLookAndFeelException;

import net.miginfocom.swing.MigLayout;

class Menu extends JMenuBar
{
    private static final long serialVersionUID = 1L;

    public Menu()
    {
        JMenu fileMenu = new JMenu("file"); 
        this.add(fileMenu);
    }
}

class DisplayGUI
{
    JTabbedPane documentSelector;

    void addNewDocument(String name)
    {
        Document newDocument = new Document();
        newDocument.addChapter(new Chapter(), 1);
        documentSelector.add(newDocument, name);
    }

    public DisplayGUI()
    {   
        JFrame masterWindow = new JFrame("name");

        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 MigLayout()); //TODO Here is layout set for the content pane of the main JFrame

        Menu menuBar = new Menu();
        rootPanel.add(menuBar, "span, north"); //TODO Here is menu bar added to the JFrame, it's docked north

        JLabel statusBar = new JLabel("Welcome to PLabScript editor! Press File>New to create a new file or go to File>Open to open an existing one.");
        statusBar.setOpaque(true);
        statusBar.setBorder(BorderFactory.createLoweredSoftBevelBorder());
        rootPanel.add(statusBar, "span, south"); //TODO Here is status bar added to the JFrame, it's docked south

        documentSelector = new JTabbedPane(JTabbedPane.NORTH); //TODO JTabbedPane set so the tab chooser is on the top
        rootPanel.add(documentSelector, "grow, push"); //TODO setup so it will take up all the remaining space


        addNewDocument("Brand new document");       


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

class Document extends JScrollPane
{
    private static final long serialVersionUID = 1L;
    JPanel basePanel;

    //methods
    void addChapter(Chapter chapter, int index)
    {
        basePanel.add(chapter, "grow, push, h 2000", index-1); //TODO this here adds a chapter to the basePanel of the JScrollPane which is the a representative of a single document
        //TODO it height is set to 2000 (and the problem occurs), but if you reduce it enough so it fits the window, problem will dissaper 
    }

    //constructors
    public Document()
    {
        super(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        getVerticalScrollBar().setUnitIncrement(20);

        basePanel = new JPanel();
        basePanel.setBackground(Color.RED);
        basePanel.setLayout(new MigLayout("insets 0")); //TODO "insets 0" is so there is no border thingy around all of the child components

        setViewportView(basePanel);
    }

}

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

    //constructors
    Chapter()
    {
        setLayout(new MigLayout("insets 0")); //TODO "insets 0" is so there is no border thingy around all of the child components
        setBackground(Color.MAGENTA);
    }
}


public class Main
{
    public static ResourceBundle language;

    static boolean setUpLAF()
    {
        for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels())
        {
            if ("Nimbus".equals(info.getName()))
            {
                try
                {
                    UIManager.setLookAndFeel(info.getClassName());
                }
                catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e)

                {
                    return false;
                }

                break;
            }
        }
        return true;
    }


    public static void main(String[] args)
    {       
        //SetUpLookAndFeel
        setUpLAF(); 

        //Display actual GUI
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                new DisplayGUI();
            }
        });
    }
}
4

1 に答える 1

1

88 行目は次のようになります。

    basePanel.add(chapter, "grow, push", index-1); //TODO this here adds a chapter to the basePanel of the JScrollPane which is the a representative of a single document

100 行目は次のようになります。

    basePanel.setLayout(new MigLayout("fill,insets 0")); //TODO "insets 0" is so there is no border thingy around all of the child components

これを試して。

于 2013-01-18T19:44:55.110 に答える