1

Java Swing JPanel クリエーター クラスにディメンションを渡そうとしています。これまでのところ運がありません。try / catch ブロックに入れてcontentPane.setPreferredSize(new Dimension(intWidth, intHeight));も、システム出力は得られませんでした。かなり大きな値 を渡してframe.setContentPane(ContentPaneCreator.createContentPane("darkseagreen", 800, 255));いますが、アプリケーションはコンポーネントと同じくらい小さいです。それを修正するために何ができますか?ありがとう。

import java.awt.Container;
import java.awt.Dimension;
import javax.swing.JPanel;

public final class ContentPaneCreator {

    public static Container createContentPane(String color, int intWidth, int intHeight) {

        JPanel contentPane = new JPanel();
        // Pass the colour
        contentPane.setBackground(ColorFactory.getInstance().getColor(color));
        // Pass the dimensions
        try {
        contentPane.setPreferredSize(new Dimension(intWidth, intHeight));
        }
        catch (Exception ex) {
            System.out.println(ex);
        }
        return contentPane;
    }
}

ポストイット()

import java.awt.BorderLayout;
import java.awt.FlowLayout;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;

public class StickyNotes extends JFrame {

    private static final long serialVersionUID = 1L;

    public static String appName;
    public static String fileConfirmSave;
    public static String txtConfirmChange;


    private void createStickyNotesGUI() {

        ConfigProperties config = new ConfigProperties();
        // ConfigProperties config2 = new ConfigProperties().getFileIn();

        appName = config.getConfigProperties("appName").toUpperCase();
        fileConfirmSave = config.getConfigProperties("fileConfirmSave");
        txtConfirmChange = config.getConfigProperties("txtConfirmChange");

        // Create and set up the window.
        JFrame frame = new JFrame();
        frame.setTitle(appName);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new FlowLayout(FlowLayout.LEFT));
        /* BEGIN ROOT Pane: */

        /* BEGIN Layered Pane: */
        // Add Main Menu
        MainMenuBar mainMenu = new MainMenuBar();
        frame.setJMenuBar(mainMenu.createMainMenuBar(frame));

        /* BEGIN CONTENT Pane(s): */

        // Add JPanel Content // can I pass a layout object?
        frame.setContentPane(ContentPaneCreator.createContentPane("darkseagreen", 800, 255));

        // Add Tool Bar /* needs to be run AFTER we .setContentPane() in order for it to be layerd on top */
        ToolBarCreator toolBar = new ToolBarCreator();
        frame.getContentPane().add(toolBar.createToolBar(), BorderLayout.NORTH);


        // TODO
        /*
         * Pass dynamic color values to LabelCreator() once you get
         * newStickyNote() working
         */
        frame.getContentPane().add(
                LabelCreator.createLabel(frame, "Java Swing", "purple"),
                BorderLayout.NORTH);

        // Display the window here with JFrame//
        //frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        // TODO
        /* set configuration to remember frame size */
        frame.pack();
        frame.setVisible(true);
    }

    public void doExit(JFrame frame) {
        boolean fDirty = true;
        if (fDirty)
            switch (JOptionPane.showConfirmDialog(StickyNotes.this,
                    fileConfirmSave, txtConfirmChange,
                    JOptionPane.YES_NO_OPTION)) {
            case JOptionPane.YES_OPTION:
                // if (doSave())
                frame.dispose();
                break;
            case JOptionPane.NO_OPTION:
                frame.dispose();
            }
        else
            frame.dispose();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new StickyNotes().createStickyNotesGUI();
            }
        });
    }
}
4

2 に答える 2

1

コードにいくつかの問題があります:

まず、frame.setLayout(new FlowLayout(FlowLayout.LEFT));FlowLayout)を使用する場合、ここで効果がないframe.getContentPane().add(toolBar.createToolBar(), BorderLayout.NORTH);ものを指定するのはなぜですかBorderLayout.NORTH

再びケースframe.getContentPane().add(LabelCreator.createLabel(frame, "Java Swing", "purple"),BorderLayout.NORTH);

編集:
あなたのcontentpane問題については、最初に次のコードを見てください(デモ):

JFrame frame= new JFrame();
frame.getContentPane().setBackground(Color.red);
frame.getContentPane().setPreferredSize(new Dimension(width, height));
frame.pack();
frame.setVisible(true);

に異なる値を渡すwidthと、どこにも指定していないため、の 全体のサイズが影響を受けるheightことがわかります。これは、framesetSize

  1. 画面に表示するには、すべてのGUIコンポーネントが包含階層の一部である必要があります。包含階層は、最上位のコンテナーをルートとするコンポーネントのツリーです。少しずつお見せします。

  2. 各GUIコンポーネントは1回だけ含めることができます。コンポーネントがすでにコンテナ内にあり、それを別のコンテナに追加しようとすると、コンポーネントは最初のコンテナから削除されてから、2番目のコンテナに追加されます。

  3. 各トップレベルコンテナにはコンテンツペインがあり、一般的に、そのトップレベルコンテナのGUIに表示されるコンポーネントが(直接的または間接的に)含まれています。

  4. オプションで、トップレベルのコンテナにメニューバーを追加できます。メニューバーは、慣例により、トップレベルコンテナ内に配置されますが、コンテンツペインの外側に配置されます。Mac OSのルックアンドフィールなどの一部のルックアンドフィールでは、画面の上部など、ルックアンドフィールにより適した別の場所にメニューバーを配置するオプションがあります。

したがって、結論は、contentpaneサイズを変更するとサイズも変更されるということframeです。

あなたのステートメント frame.setContentPane(ContentPaneCreator.createContentPane("darkseagreen", 800, 255));panelasを作成しているcontentpaneので、サイズを変更することはサイズを変更することですframe

しかし、その逆は次のとおりです。

frame.getContentPane().add(ContentPaneCreator.createContentPane("darkseagreen", 800, 255));

adda containertoにjframe、次にコンポーネントをそれに(addあなたの場合はjpanel)container

これがお役に立てば幸いです。また、があなたのようにコーディングしmethodsclasses、あらゆる小さな目的のために使用したこともありますが、単純さではなく複雑さを引き起こすことがあるので、あなたへの私の提案は、あなたのようなまたは他の好きなデザインパターンに従うことですMVC

于 2012-07-31T16:16:22.473 に答える
1

試す:

contentPane.setSize(intWidth, intHeight);

上記で十分だと確信していますが、次のことも試すことができます。

contentPane.setPreferredSize(new Dimension(intWidth, intHeight));
contentPane.setMinimumSize(new Dimension(intWidth, intHeight));
contentPane.setMaximumSize(new Dimension(intWidth, intHeight));
于 2012-07-31T00:30:19.043 に答える