2016-04-18 158 views
0

我在学习GUI,并尝试将两个面板并排放置在一个框架中。没有给你我所有的代码(这是一个任务)任何人都可以给我任何指示,为什么以下不工作? (ControlPanel只是不显示)我跟着教程,但不知道我要去哪里错了?将两个面板添加到JFrame中

JFrame frame = new JFrame("Software"); 
    MainPanel m = new MainPanel(); 
    ControlPanel c = new ControlPanel(frame); 

    frame.getContentPane().add(m, BorderLayout.WEST); 
    frame.getContentPane().add(c, BorderLayout.EAST); 



    public class MainPanel extends JPanel { 

    ....... 

    public MainPanel(){ 
    super(); 
    setPreferredSize(new Dimension(WIDTH, HEIGHT)); 
    setFocusable(true); 
    requestFocus(); 
    } 
} 

    public ControlPanel(JFrame frame) { 
    super(); 
    setPreferredSize(new Dimension(WIDTH, HEIGHT)); 
    setFocusable(true); 
    requestFocus(); 
    } 
} 

编辑:

休息的代码:

JFrame frame = new JFrame("Software"); 
    MainPanel m = new MainPanel(); 
    ControlPanel c = new ControlPanel(frame); 
    frame.getContentPane().add(c, BorderLayout.WEST); 
    frame.getContentPane().add(m, BorderLayout.EAST); 
    frame.setLayout(new BorderLayout()); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setContentPane(m); 
    frame.pack(); 
    frame.setVisible(true); 
+0

你使用哪种布局? – Hackerdarshi

+0

你的意思是像BorderLayout等?我有的唯一布局是如上,然后我使用ControlPanel中的boxlayout来放置一些按钮。 – javapalava

+0

是的。我的意思是 – Hackerdarshi

回答

4

您需要设置帧的BorderLayout的布局。

使用此:

frame.setlayout(new BorderLayout()); 

此外,如果你的框架分为正好相等的两半,你也可以使用一个网格布局。

frame.setLayout(new GrigLayout(1,2)); // If the panels are side-by-side. 

frame.setLayout(new GrigLayout(2,1)); //If the panels are vertically adjacent. 
+0

注:帧分为两个,JSplitPane(JSplitPane.HORIZONTAL_SPLIT,a,b)也不错 – Exceptyon

+0

嗯......谢谢@Hackerdashi,但仍然不工作:(将复制更多代码在上面...... – javapalava

+0

明白了,基于这个,以及下面的答案 - 非常感谢! – javapalava

4

在代码中,你与你的情况下更换JFrame的内容面板的MainPanel

JFrame frame = new JFrame("Software"); 
    MainPanel m = new MainPanel(); 
    ControlPanel c = new ControlPanel(frame); 
    frame.getContentPane().add(c, BorderLayout.WEST); 
    frame.getContentPane().add(m, BorderLayout.EAST); 
    frame.setLayout(new BorderLayout());// this has no use 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setContentPane(m);// here the content pane becomes the MainPanel 
    frame.pack(); 
    frame.setVisible(true); 

所以,当你已经添加的东西到内容窗格中,不需要重置它(另外,我将setLayout移动到内容窗格,而不是JFrame

JFrame frame = new JFrame("Software"); 
    MainPanel m = new MainPanel(); 
    ControlPanel c = new ControlPanel(frame); 
    frame.getContentPane().setLayout(new BorderLayout()); 
    frame.getContentPane().add(c, BorderLayout.WEST); 
    frame.getContentPane().add(m, BorderLayout.EAST); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.pack(); 
    frame.setVisible(true); 
+0

谢谢@Berger!这导致了我另一个问题....我的主面板,需要键盘输入。现在不工作:(可能是因为我请问主要面板和控制面板的requestfocus()? – javapalava

+0

@javapalava:你可以编辑你的问题关于这个的一些细节,或张贴另一个这个问题? – Berger

+1

当然:)我只是先拖网看看我是否在我必须转向这个之前我可以自己弄清楚它! – javapalava

2

入住这

JFrame frame = new JFrame("Software"); 
    MainPanel m = new MainPanel(); 
    ControlPanel c = new ControlPanel(frame); 
    //getContentPane layout to BorderLayout 
    frame.getContentPane().setLayout(new BorderLayout()); 
    frame.getContentPane().add(c, BorderLayout.WEST); 
    frame.getContentPane().add(m, BorderLayout.EAST); 

    //you don't need it for now 
    //frame.setLayout(new BorderLayout()); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    //frame.setContentPane(m); 
    frame.pack(); 
    frame.setVisible(true); 

编辑:JFrame的contentPane的布局返回JFlowLayout所以这就是为什么下面的部分不工作

.getContentPane().add(c, BorderLayout.WEST); 
frame.getContentPane().add(m, BorderLayout.EAST);