0

我正在开发一个应用程序,但我陷入了初始阶段。我有一个JTextField在一个JPanelJFrameJTextField不在那里。如果我使用

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

有用。但不与

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

所以问题是:

  1. 为什么字段不可见?(最重要的q)
  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 不采用第二种方法,我更喜欢哪种方法?另外,这样我如何添加第二个面板以及如何使每个面板中的组件自动排列?

更新:

我意识到代码首先不起作用可能是因为我没有指定任何坐标/位置?...

4

3 回答 3

3

首先,您必须将您的面板添加到您的布局管理器。

喜欢

add(p0);

然后你需要一个调用来打包 JFrame

pack();

如果你想要 2 个面板,你可以在你的框架/布局管理器中给它们一个位置。

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

您有 3 种可能性来设置组件的大小:

setPreferredSize(Dimension D);
setMinimumSize(Dimension D);
setMaximumSize(Dimension D);
于 2013-04-26T11:42:09.320 回答
0

编辑

你还没有设置这个: -

f.setLayout(new FlowLayout());

您还需要将布局设置为框架并注释掉

//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);
于 2013-04-26T11:42:07.077 回答
0

关于您的两段代码之间的区别: AJFrame有一个contentPane实际上是窗口中所有内容发生的面板 - 框架只有这个面板而不是其他面板。通过调用f.setContentPane(randomJPanel);,您实际上可以将 设置为contentPane您想要的某个面板。我强烈建议contentPane使用 Layouts 进行此操作,而不是直接在 JFrame 中执行您的操作。

于 2013-04-26T11:43:27.407 回答