2013-04-26 65 views
0

我正在研究一个应用程序,我陷入了初期阶段。 我有一个JTextFieldJPanelJFrameJTextField不存在。 如果我使用摆动部件不可见

JPanel p0 = (JPanel) f.getContentPane(); 

它的工作原理。但与

JPanel p0 = new JPanel(); 
f.add(p0); 

所以问题是:

  1. 为什么不在现场可见? (最重要的问题)
  2. 上述两种方法有什么区别?

代码:

import java.awt.*; 
import java.io.*; 
import java.net.*; 
import java.util.*; 
import javax.swing.*; 

public class Main 
{ 

    static Font fontDefault = new Font("arial", Font.PLAIN, 15); 

    public static void main (String [ ] args) 
    { 
     JFrame f = new JFrame("Liquid"); 
     f.setSize(new Dimension(840, 400)); 
     //f.setIconImage(image); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     //JPanel p0 = (JPanel) f.getContentPane();// is it necessary? 
     JPanel p0 = new JPanel(); 
     p0.setLayout(null); 
     JPanel p1 = new JPanel(); 
     p1.setLayout(null); 

     JTextField tfHostName = new JTextField("default text", 20); 
     tfHostName.setBounds(50, 50, 200, 25); 
     tfHostName.setFont(fontDefault); 

     JButton bRequest = new JButton("request"); 
     JButton bReset = new JButton("reset"); 

     JTextArea taTest = new JTextArea("default text", 1, 20); 
     p0.add(tfHostName); 
     f.add(p0); 

     f.add(p1); 

     p0.add(taTest); 
     //f.pack(); 
     f.setResizable(false); 
     f.setVisible(true); 

    } 
} 

在此提醒:

它与JPanel p0 = (JPanel) f.getContentPane(); 但为什么ID不与第二的办法,这我更舒服?此外,如何添加第二个面板以及如何使每个面板中的组件自动排列?

更新:

我意识到,代码没有摆在首位的工作可能是因为我没有指定的任何坐标/位置......

+3

为更好的帮助,尽快发布[SSCCE](http://sscce.org/),关于JPanel p0 = new JPanel(); short,runnable,compilable f.add(p0); – mKorbel 2013-04-26 11:41:15

+0

EDITED。增加了代码。我想首先这样做,但它不会让我说,这个问题不符合他们的标准...... – mireazma 2013-04-26 12:01:59

+0

'上述两种方法有什么区别?' - 第一种方法使用默认的layot manger 。第二种方法不使用布局管理器。不要使用空布局!不要使用setBounds()!为什么初学者总是玩空布局,然后在不起作用时发出抱怨?我们在此论坛发布的所有示例代码都使用布局管理器。你从哪里得到这个代码,显示你使用空布局?我的建议是忽略该网站。 – camickr 2013-04-26 14:56:51

回答

0

编辑

您还没有设置这样的: -

f.setLayout(new FlowLayout()); 

您需要设置布局也帧 和COMME NT出来

//p0.setLayout(null); 
//p1.setLayout(null); 

做这样

JFrame jf=new JFrame(); 
Jpanel jp=new JPanel(); 
jp.add(new TextField()); 
jf.add(jp); 

set jf.setVisible(true); 
+0

我想这与我在代码片段中所做的相同。 – mireazma 2013-04-26 12:05:15

+0

检查它的工作...! – anshulkatta 2013-04-26 12:29:46

+0

确实。我检查了JFrame的默认布局是“有边界”,这是因为某些原因它不会显示JTextField。 – mireazma 2013-04-26 12:53:46

3

首先你要你的面板添加到您的layoutmangager。

某事像

add(p0); 

,然后你需要一个电话,如果你想2个面板收拾的JFrame

pack(); 

,你必须让他们在你的框架的位置/布局经理。

f.add(pane1, BorderLayout.WEST); 
f.add(pane2, BorderLayout.EAST); 

你有3个possibilites设置大小上的组件:

setPreferredSize(Dimension D); 
setMinimumSize(Dimension D); 
setMaximumSize(Dimension D); 
+0

用于'pack()'的+1。好的建议,无论什么问题! – 2013-04-26 11:51:40

+0

它也不会工作。我想我给它的尺寸不是更大,而是更小。使用pack(),它会缩小为100 x 10像素,而不是840 x 400. – mireazma 2013-04-26 12:03:44

+0

您的意思是创建布局管理器对象,然后调用像mgr.add(p0)那样的smth?那么如何将它添加到框架?我是初学者:) – mireazma 2013-04-26 12:20:06

0

关于你的2个代码之间的区别: 一个JFramecontentPane这实际上是在窗口中的所有东西发生的面板 - 框架只是这个面板而不是其他人。 通过调用f.setContentPane(randomJPanel);,您实际上可以将contentPane设置为您需要的某个面板。我强烈建议使用Layouts在contentPane中工作,而不是直接在JFrame中完成你的工作。

+2

*“关于TextField - 只有在您调用了'.setVisible(boolean)' - 方法'true'时才可见。”*我从来不必在文本字段中调用'.setVisible(true) *** ***过! – 2013-04-26 11:48:05

+0

事情是我想在框架中的2个面板。 – mireazma 2013-04-26 12:00:17

+0

使用布局 - 这就是他们为 – LionC 2013-04-26 12:05:13