Какие-либо ограничения JPanel в Java? - PullRequest
0 голосов
/ 26 марта 2012

В приведенном ниже коде, когда JPanel не добавляется в расширение JFrame, программа работает нормально, но затем я закомментировал JPanel и использовал GridLayout, все правильно и красиво размещается в JFrame. Могут ли быть какие-то ограничения на то, как JPanel отображает объекты? В коде я закомментировал следующие утверждения:

  this.setLayout(new GridLayout(3,2));
   this.add(nameLabel);
   this.add(name);
   this.add(urlLabel);
   this.add(url);
   this.add(typeLabel);
   this.add(type);

и программа отображается неправильно, но если приведенные выше утверждения не прокомментированы, а приведенные ниже прокомментированы:

   //add some panes..
    JPanel panel = new JPanel();
    panel.add(nameLabel);
    panel.add(name);
    panel.add(urlLabel);
    panel.add(url);
    panel.add(typeLabel);
    panel.add(type);
    this.add(panel);

, тогда программа работает нормально .. Ниже приведен фрагмент кода.

[CODE]

public class FeedInfo extends JFrame {
  private JLabel nameLabel = new JLabel("Name:", SwingConstants.RIGHT);
  private JTextField name;
  private JLabel urlLabel = new JLabel("URL",SwingConstants.RIGHT);
  private JTextField url;
  private JLabel typeLabel = new JLabel("Type",SwingConstants.RIGHT);
  private JTextField type;


   public FeedInfo()
      {
         super("Feed Information");
         this.setSize(400,105);
         this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

         String response1 = JOptionPane.showInputDialog(null,"Enter the site name:");
         name = new JTextField(response1,20);
         String response2 = JOptionPane.showInputDialog(null,"Enter the site address:");
         url = new JTextField(response2, 20);

         String[] choices ={"Personal","Commercial","Unkown"};
         int response3 = JOptionPane.showOptionDialog(null, "what type of site is it?",
           "site Type",0, JOptionPane.QUESTION_MESSAGE, null, choices, choices[0]);

        type = new JTextField(choices[response3],20);
        //add some panes..
        JPanel panel = new JPanel();
        panel.add(nameLabel);
        panel.add(name);
        panel.add(urlLabel);
        panel.add(url);
        panel.add(typeLabel);
        panel.add(type);
        this.add(panel);


        /*this.setLayout(new GridLayout(3,2));
       this.add(nameLabel);
       this.add(name);
       this.add(urlLabel);
       this.add(url);
       this.add(typeLabel);
       this.add(type);
       */

       this.setVisible(true);

    }
[/CODE]

Ответы [ 4 ]

3 голосов
/ 26 марта 2012

JPanel не выполняет верстку самостоятельно, она использует LayoutManager.В вашем случае вы хотите переопределить значение по умолчанию FlowLayout и использовать GridLayout (так же, как вы сделали для своего JFrame).Так и сделай!

JPanel panel = new JPanel(new GridLayout(3, 2));
...
2 голосов
/ 26 марта 2012

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

JPanel panel = new JPanel();

По умолчанию, с этой строкой, как вы можете видетьиз JPanel API вы создаете JPanel с макетом FlowLayout. JPanel API сообщает о пустом конструкторе:

JPanel() 
Creates a new JPanel with a double buffer and a flow layout.

Обычно макет потока является простейшим макетом для JPanel, и загрузить содержимое Swing впонятный и простой способ.Используемый вами GridLayout предлагает возможность загружать компоненты в сетке, что хорошо для отображения графического интерфейса приложений Java.

Теперь вы знаете, что программа с базовым FlowLayout не работает.не отображать все ваши компоненты Swing, как ожидалось, как в первом разделе кода, когда вы используете GridLayout.Если вы хотите создать JPanel с GridLayout, просто наберите:

JPanel panel = new JPanel(new GridLayout(3, 2));

На этой странице и здесь есть несколько учебных пособий по JPanel и макетам.

2 голосов
/ 26 марта 2012
JPanel panel = new JPanel();
        panel.add(nameLabel);
        panel.add(name);
        panel.add(urlLabel);
        panel.add(url);
        panel.add(typeLabel);
        panel.add(type);
        this.add(panel);

Когда вы делаете это, вы добавляете JPanel в JFrame, но макет JFrame не изменяется, что означает, что он имеет BorderLayout по умолчанию. Попробуйте изменить последнюю строку на: add(panel, BorderLayout.CENTER); Вы можете прочитать больше о JFrame здесь

Кроме того, JPanel имеет FlowLayout по умолчанию, что означает, что объекты будут добавлены в «плавную линию». Вы должны установить макет на JPanel, чтобы получить желаемый результат

1 голос
/ 26 марта 2012

Есть два важных факта, которые нужно знать. JFrame по умолчанию использует BorderLayout. JPanel по умолчанию использует Flowlayout. Вот почему вы видите различные варианты поведения в зависимости от того, к какому компоненту вы добавляете другие свои компоненты.

FlowLayout почти бесполезен, поэтому при использовании JPanel вы почти всегда хотите изменить его. @Mark Peters покажет вам, как это сделать выше. BorderLayout почти всегда идеально подходит для контейнеров верхнего уровня, и я редко меняю это. Я склонен использовать BoxLayout для своих вложенных JPanels почти исключительно.

...