2016-03-05 222 views
0

我正在学习用java编程的GUI,并试图修改现有的程序,在主框架中添加一个包含按钮的垂直左侧面板。学习用户界面 - setContentPane()方法

主要方法如下。目前,MainPanel类扩展了JPanel并包含程序的主要组件(基本游戏)。我想在游戏的右侧创建一个新面板。

public static void main(String[] args) { 
     JFrame frame = new JFrame("Sokuban"); 
     MainPanel panel = new MainPanel(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLayout(new BorderLayout()); 
     frame.setContentPane(panel); 
     frame.pack(); 
     frame.setVisible(true); 

} 

我明白(我想!)如何添加按钮 - 我没有卡在那里。

我已经试过了诸如:

frame.add(new MyPanel(), BorderLayout.NORTH); 

(MyPanel()是扩展JPanel的一个新的类)

 window.setContentPane(panel, BoxLayout.X_AXIS); 

(不会编译)

我是什么坚持是a)是否应该尝试创建两个包含在我的JFrame中的JPanel,然后使用BoxLayout(??)并排放置它们。或者,b)我是否应该创建第二个JPanel来坐在MainPanel中,并以某种方式重新排列它?

此外,尽管阅读了文献,但我不明白setContentPane()方法在做什么。任何指针将非常感激。

+0

内容窗格是位于窗口内的组件。 – Radiodef

回答

4

默认情况下,JFrame已经有一个JPanel作为使用BorderLayout的ContentPane。 所以,你可以这样做:

frame.add(new ButtonPanel(), BorderLayout.EAST); 
frame.add(new MainPanel(), BorderLayout.CENTER); 

JFrame中的setLayout()和add()方法实际上只是对jFrame.getContentPane.setLayout()和jFrame.getContentPane.add快捷键()。 所以在你的代码中,你在设置默认内容面板(一个JPanel)的布局之前,用MainPanel替换它,所以它没有任何作用。

setContentPane()方法允许您替换JFrame的内容面板,但这很少有必要。

+0

*“但它很少有必要”*这真的取决于你在做什么......有时你必须或想要扩展一个组件,以获得一些行为,使默认的内容窗格不会。但是的确如此,很多时候我看到像'class MyProgram extends JPanel {public static void main ...'这样的东西,扩展了一个包含程序逻辑的组件,这是一种糟糕的风格。 – Radiodef

2

我想创建一个新的面板在游戏的右侧。

没有必要写这样的:

frame.setLayout(new BorderLayout()); 
frame.setContentPane(panel); 

你可以简单地使用这些代码片段:

frame.getContentPane().add(panel1, BorderLayout.EAST); 
frame.getContentPane().add(panel2, BorderLayout.WEST); 

如果你想要的是右边的面板在整个帧中的其余地区蔓延。

frame.getContentPane().add(panel2, BorderLayout.CENTER);