2013-04-26 5 views
0

Я работаю над приложением, и я застрял в начальной фазе. У меня есть JTextField в JPanel в JFrame. JTextField нет. Если я используюкомпонент поворота не отображается

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(); но почему идентификатор не с 2-го подхода, который я более комфортно? Плюс, таким образом, как добавить вторую панель и как сделать автоматическую компоновку компонентов на каждой панели?

Update:

я понял, что код не работает, в первую очередь, наверное, потому что я не указали координаты/положение ...

+3

для лучшей помощи скорее отправить сообщение [SSCCE] (http://sscce.org/), краткое, выполнимое, компилируемое о JPanel p0 = new JPanel(); f.add (p0); – mKorbel

+0

EDITED. Добавлен код. Я хотел сделать это в первую очередь, но это не позволило мне, заявив, что вопрос не соответствует их стандартам ... – mireazma

+0

'В чем разница между двумя вышеупомянутыми подходами?' - в первом подходе используется стандартный ящик-манипулятор по умолчанию , Второй подход не использует диспетчер компоновки. Не используйте нулевой макет !!! Не используйте setBounds() !!! Почему новички всегда играют с нулевым макетом, а затем жалуются, когда они не работают? Весь код кода, который мы публикуем на этом форуме, использует диспетчер компоновки. Где вы получаете этот код, который показывает вам использовать нулевой макет? Мой совет - игнорировать этот веб-сайт. – camickr

ответ

0

Edit:

У вас нет установить это: -

f.setLayout(new FlowLayout()); 

Вы должны установить макет в кадр также и Comme нт из

//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

+0

проверить его работу ... !! – anshulkatta

+0

Действительно. Я проверил, и макет по умолчанию для JFrame «ограничен», который по какой-либо причине не показывает JTextField. – mireazma

3

сначала вы должны добавить панель в свой layoutmangager.

STH как

add(p0); 

, а затем вам нужно позвонить, чтобы упаковать в JFrame

pack(); 

если вы хотите 2 панели, вы должны дать им позиции в кадре/менеджер макетов.

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

у вас есть 3 possibilites, чтобы установить размер ваших компонентов:

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

+1 для 'pack()'. Хороший совет, какова бы ни была проблема! –

+0

тоже не будет работать. Я хочу, чтобы кадр был размером, который я дал ему не больше, а не меньше. С пакетом() он сжимается до 100 на 10 пикселей вместо 840 x 400. – mireazma

+0

Вы имеете в виду создать объект менеджера компоновки, а затем вызывать smth как mgr.add (p0)? Затем, как добавить его в рамку? Я новичок :) – mireazma

0

относительно разницы между вашими 2 кусками кода: JFrame имеет contentPane, которая на самом деле Панель, где все вещи в окне происходит - в рамке есть только эта панель, а не другие. Позвонив по телефону f.setContentPane(randomJPanel);, вы можете установить contentPane на нужную вам панель. Я настоятельно рекомендую работать в этом contentPane с макетами и не делать ваши вещи прямо в JFrame.

+2

* «Что касается TextField - это видно только в том случае, если вы вызывали свой' .setVisible (логический) '-метод с' true'. "* Мне никогда не приходилось вызывать' .setVisible (true) 'в текстовом поле - ***Когда-либо***! –

+0

Вещь - я хочу 2 панели в рамке. – mireazma

+0

Использование макета - это то, за что они предназначены для – LionC

Смежные вопросы