2012-05-11 3 views
4

Может кто-нибудь объяснить мне, почему каждый раз, когда я использую диспетчер компоновки FlowLayout , мои текстовые поля отображаются в виде разрезов.JTextField отображается как разрез при использовании FlowLayout ... пожалуйста, объясните

Я столкнулся с этой проблемой в течение некоторого времени, и я не могу представить цифры , почему это происходит неправильно.

У меня такое чувство, что я просто забываю время и раз, поэтому, если бы я сказал, что кто-то, пожалуйста, объяснит мне это явление, я был бы навсегда благодарен.

import java.awt.Container; 
import java.awt.FlowLayout; 

import javax.swing.JFrame; 
import javax.swing.JTextField; 

public class Console 
{ 
    public Console() 
    { 
     makeConsole(); 
    } 

    private void makeConsole() 
    { 
     JFrame console = new JFrame("ArchiveConsole"); 
     Container base = console.getContentPane(); 
     base.setSize(400, 250); 
     console.setSize(base.getSize()); 
     base.setLayout(new FlowLayout(FlowLayout.CENTER, 5,5)); 

     JTextField tf = new JTextField(); 
     tf.setSize(base.getWidth(), 25); 
     base.add(tf); 

     console.setVisible(true); 
    } 
} 

ответ

6

Из макета свинга менеджер учебника

Класса FlowLayout помещает компоненты в ряде, размере в их предпочтительных размерах. Если горизонтальное пространство в контейнере слишком мало, чтобы поместить все компоненты в одну строку, класс FlowLayout использует несколько строк. Если контейнер шире чем необходимо для ряда компонентов, строка, по умолчанию, по центру по горизонтали внутри контейнера

Таким образом, вы должны отрегулировать нужный размер вашего текстового поля, предпочтительно с использованием метода setColumns.

Обратите внимание, что если вы хотите, чтобы текстовое поле, чтобы охватить всю ширину вы можете захотеть использовать другую раскладку, то FlowLayout по той причине, приведенной выше

Например, следующий код дает хороший взгляд JTextField, но я жестко связаны число столбцов

import javax.swing.JFrame; 
import javax.swing.JTextField; 
import java.awt.Container; 
import java.awt.EventQueue; 
import java.awt.FlowLayout; 

public class TextFieldWithFlowLayout { 
    public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
     JFrame console = new JFrame("ArchiveConsole"); 
     Container base = console.getContentPane(); 
     base.setLayout(new FlowLayout(FlowLayout.CENTER, 5,5)); 

     JTextField tf = new JTextField(); 
     tf.setColumns(20); 
     base.add(tf); 
     console.pack(); 
     console.setVisible(true); 
     } 
    }); 
    } 
} 
1

Использование: JTextField тс = новый JTextField (25);

Вместо: JTextField tf = new JTextField(); tf.setSize (base.getWidth(), 25);

1

Когда вы используете LayoutManagers, не пытайтесь установить размер и положение вручную. Вы противоречите тому, что делает LayoutManager. Элементы компоновки и компоновки компоновщика на основе ограничений и предпочтительного/минимального/максимального размера. Большинство компонентов Swing обрабатывают это автоматически, поэтому вы обычно не должны форсировать их предпочтительный размер.

Что касается вашего JTextField, так как он не содержит текста, его предпочтительный размер близок к нулю. Используйте setColumns, чтобы указать предпочтительный размер или код setPreferredSize

+0

Спасибо за указатели, я решил проблему, и я ближе к пониманию менеджеров макетов. – TrashCan

0

Спасибо!

Параметр, который используется в функции JTextField, очень важен!

JPanel panel_buttons = new JPanel(new FlowLayout(FlowLayout.LEFT)); 
panel_buttons.add(...); 
... 
panel_buttons.add(...); 
JTextField txt_search = new JTextField(20); 
panel_buttons.add(txt_search); 

Если изменение 20 до 30 или большой, может быть ты не мог найти it.May быть txt_search в следующей строке.