1

我正在尝试将维度传递给 Java Swing JPanel 创建者类。到目前为止没有运气。我什至把它contentPane.setPreferredSize(new Dimension(intWidth, intHeight));放在一个 try/catch 块中,但我没有得到任何系统输出。我传递了一个相当大的价值,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

尝试:

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 回答
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);

当您传递不同的值时widthheight您会看到整个大小都会受到影响,frame因为我没有setSize在任何地方指定,原因是

  1. 要出现在屏幕上,每个 GUI 组件都必须是包含层次结构的一部分。包含层次结构是一棵以顶级容器为根的组件树。我们稍后会向您展示一个。

  2. 每个 GUI 组件只能包含一次。如果一个组件已经在一个容器中,并且您尝试将其添加到另一个容器中,则该组件将从第一个容器中删除,然后添加到第二个容器中。

  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));

add一个containerjframe然后add你的组件到那个container( jpanel 在你的情况下)

希望这会有所帮助,而且还有一件事我也曾经像您一样为每个小目的编写代码,但有时它们会提高复杂性methods而不是简单性,因此我对您的建议是遵循您喜欢的设计模式或任何其他您喜欢的设计模式。classesMVC

于 2012-07-31T16:16:22.473 回答