我正在尝试将维度传递给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;
}
}
StickyNotes()
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();
}
});
}
}
答案 0 :(得分:1)
尝试:
contentPane.setSize(intWidth, intHeight);
我很确定上述内容已足够,但您也可以尝试:
contentPane.setPreferredSize(new Dimension(intWidth, intHeight));
contentPane.setMinimumSize(new Dimension(intWidth, intHeight));
contentPane.setMaximumSize(new Dimension(intWidth, intHeight));
答案 1 :(得分:1)
您的代码中存在一些问题:
首先,如果使用frame.setLayout(new FlowLayout(FlowLayout.LEFT));
( FlowLayout ),那么frame.getContentPane().add(toolBar.createToolBar(), BorderLayout.NORTH);
为什么要指定没有效果的BorderLayout.NORTH
< / p>
再次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
传递不同的值时,您会看到frame
的整个尺寸将受到影响没有在任何地方指定setSize
,原因是
要在屏幕上显示,每个GUI组件都必须是包含层次结构的一部分。包含层次结构是一个组件树,其顶层容器作为其根。我们会向您展示一个。
每个GUI组件只能包含一次。如果组件已经在容器中并且您尝试将其添加到另一个容器中,则该组件将从第一个容器中删除,然后添加到第二个容器中。
每个顶级容器都有一个内容窗格,一般来说,它包含(直接或间接)该顶级容器GUI中的可见组件。
您可以选择将菜单栏添加到顶级容器。按照惯例,菜单栏位于顶级容器内,但位于内容窗格之外。一些外观和感觉,例如Mac OS的外观和感觉,让您可以选择将菜单栏放在更适合外观的其他位置,例如屏幕顶部。
所以结论是指更改contentpane
尺寸会改变frame
尺寸。
由于您的语句 frame.setContentPane(ContentPaneCreator.createContentPane("darkseagreen", 800, 255));
正在将panel
作为contentpane
,所以再次更改的大小就是更改{{ 1}} 尺寸
但另一种方式是:
frame
frame.getContentPane().add(ContentPaneCreator.createContentPane("darkseagreen", 800, 255));
add
到container
然后jframe
组件到add
(在你的情况下为jpanel)< / p>
希望这会有所帮助,并且一件事更多我也会像你为每个小目的创建container
和methods
一样编码,但是有时他们提出复杂性而不是简单,所以我的建议是遵循设计模式,如classes
或任何其他你喜欢的