2013-03-07 3 views
0

Работа над заданием прямо сейчас, и я в основном пишу свой первый графический интерфейс. Все работает отлично, за исключением моей полосы прокрутки - при добавлении не только она не отображается, но даже после того, как я прокомментировал это, добавленный элемент LAST (через вызов функции .add) охватывает ENTIRE GUI. Установка макета на нуль, похоже, исправила это, но я не уверен, что это поможет или помешает первой проблеме. Я уже прошел через документацию и примеры Oracle и не видел, что мне нужно. Здесь уместен код (переменные аги, которые кажутся парящими в пространстве является частью отдельного раздела, и я не вставил его так, чтобы изолировать код GUI):JScrollPane не отображается, элементы переполнены

import java.awt.*; 
    import java.awt.event.*; 
    import javax.swing.*; 

    public class Example 
     { 
     public static void main(String[] args) 
     {  

    JFrame mygui = new JFrame(); 
    mygui.getContentPane(); 
    mygui.setBounds(100, 100, 700, 500); 
    mygui.setLayout(new BorderLayout()); //playing with layout here 

    JLabel first = new JLabel("integer:"); 
    JLabel second = new JLabel("float:"); 
    JLabel third = new JLabel("short:"); 
    JLabel fourth = new JLabel("long:"); 
    JLabel fifth = new JLabel("byte:"); 
    JLabel sixth = new JLabel("double:"); 
    JLabel seventh = new JLabel("boolean:"); 
    JTextField myint = new JTextField("" + a); 
    JTextField myfloat = new JTextField("" + b); 
    JTextField myshort = new JTextField("" + c); 
    JTextField mylong = new JTextField("" + d); 
    JTextField mybyte = new JTextField("" + e); 
    JTextField mydbl = new JTextField("" + f); 
    JTextField mybool = new JTextField("" + g); 
    JTextArea myarea = new JTextArea(); 
    JScrollPane scrolla = new JScrollPane(myarea); 

    first.setOpaque(true); 
    first.setBounds(20, 20, 50, 20); 
    second.setOpaque(true); 
    second.setBounds(20, 70, 50, 20); 
    third.setOpaque(true); 
    third.setBounds(20, 120, 50, 20); 
    fourth.setOpaque(true); 
    fourth.setBounds(20, 170, 50, 20); 
    fifth.setOpaque(true); 
    fifth.setBounds(20, 220, 50, 20); 
    sixth.setOpaque(true); 
    sixth.setBounds(20, 270, 50, 20); 
    seventh.setOpaque(true); 
    seventh.setBounds(20, 320, 50, 20); 

    myint.setBounds(70, 20, 50, 20); 
    myint.setOpaque(true); 
    myfloat.setBounds(70, 70, 50, 20); 
    myfloat.setOpaque(true); 
    myshort.setBounds(70, 120, 50, 20); 
    myshort.setOpaque(true); 
    mylong.setBounds(70, 170, 80, 20); 
    mylong.setOpaque(true); 
    mybyte.setBounds(70, 220, 50, 20); 
    mybyte.setOpaque(true); 
    mydbl.setBounds(70, 270, 50, 20); 
    mydbl.setOpaque(true); 
    mybool.setBounds(70, 320, 50, 20); 
    mybool.setOpaque(true); 

    myarea.setBounds(200, 50, 250, 200); 
    myarea.setOpaque(true); 
    scrolla.setPreferredSize(new Dimension(250, 200)); 

    mygui.add(first); 
    mygui.add(second); 
    mygui.add(third); 
    mygui.add(fourth); 
    mygui.add(fifth); 
    mygui.add(sixth); 
    mygui.add(seventh); 

    mygui.add(myint); 
    mygui.add(myfloat); 
    mygui.add(myshort); 
    mygui.add(mylong); 
    mygui.add(mybyte); 
    mygui.add(mydbl); 
    mygui.add(mybool); 
    mygui.add(scrolla); 

    myarea.append("" + errcheck + "\n"); 
    myarea.append("" + valcheck + "\n"); 

    while(y < 2) 
    { 
    myarea.append("" + a + "\n"); 
    myarea.append("" + b + "\n"); 
    myarea.append("" + c + "\n"); 
    myarea.append("" + d + "\n"); 
    myarea.append("" + e + "\n"); 
    myarea.append("" + f + "\n"); 
    myarea.append("" + g + "\n"); 
    myarea.append("" + w + "\n"); 
    myarea.append("" + u + "\n"); 
    myarea.append("" + v + "\n"); 
    myarea.append("" + secondary + "\n"); 
    myarea.append("" + whilecount + "\n");; 
    y++; 
    a--; 
    } 

    mygui.setVisible(true); 
    mygui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
} 

Я уверен, что это что-то простой, но любая обратная связь приветствуется.

ответ

3

BorderLayout имеет пять определенных мест, на которые могут быть добавлены компоненты ...

enter image description here

Расположение по умолчанию является CENTER.

В основном, что происходит, когда вы добавляете каждый компонент в рамку/область содержимого, он удаляет последний и помещает его самостоятельно посередине, так как только один компонент может существовать в месте указания.

Начать сменить диспетчер компоновки. Посмотрите на A Visual Guide to Layout Managers для некоторых идей.

-2

Удалить эту строку:

mygui.getContentPane(); 

потому что это не вещь. Кроме того, изменение

mygui.setLayout(new BorderLayout()); //playing with layout here 

в

mygui.getContentPane().setLayout (null); // playing with layout here 

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

myarea.setBounds(200, 50, 250, 200); 

в

scrolla.setBounds(200, 50, 250, 200); 

и удалите следующую строку:

scrolla.setPreferredSize(new Dimension(250, 200)); 

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

mygui.add(first); 
mygui.add(second); 
mygui.add(third); 
mygui.add(fourth); 
mygui.add(fifth); 
mygui.add(sixth); 
mygui.add(seventh); 

mygui.add(myint); 
mygui.add(myfloat); 
mygui.add(myshort); 
mygui.add(mylong); 
mygui.add(mybyte); 
mygui.add(mydbl); 
mygui.add(mybool); 
mygui.add(scrolla); 

к

mygui.getContentPane().add(first); 
mygui.getContentPane().add(second); 
mygui.getContentPane().add(third); 
mygui.getContentPane().add(fourth); 
mygui.getContentPane().add(fifth); 
mygui.getContentPane().add(sixth); 
mygui.getContentPane().add(seventh); 

mygui.getContentPane().add(myint); 
mygui.getContentPane().add(myfloat); 
mygui.getContentPane().add(myshort); 
mygui.getContentPane().add(mylong); 
mygui.getContentPane().add(mybyte); 
mygui.getContentPane().add(mydbl); 
mygui.getContentPane().add(mybool); 
mygui.getContentPane().add(scrolla); 

вызывают компоненты не должны быть добавлены непосредственно в JFrame, но только его содержимого панели. После этих изменений он должен работать нормально. Вы увидите полосы прокрутки, когда у вас будет достаточно текста в текстовой области. Здесь фиксируется Verion вашего кода, который работает для меня:

import java.awt.Color; 
import java.awt.Dimension; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.JTextField; 

public class Example 
{ 
    public static void main (String [] args) 
    { 

     JFrame mygui = new JFrame(); 
     mygui.getContentPane(); 
     mygui.setBounds (100, 100, 700, 500); 
     mygui.getContentPane().setLayout (null); // playing with layout here 

     JLabel first = new JLabel ("integer:"); 
     JLabel second = new JLabel ("float:"); 
     JLabel third = new JLabel ("short:"); 
     JLabel fourth = new JLabel ("long:"); 
     JLabel fifth = new JLabel ("byte:"); 
     JLabel sixth = new JLabel ("double:"); 
     JLabel seventh = new JLabel ("boolean:"); 
     JTextField myint = new JTextField ("a"); 
     JTextField myfloat = new JTextField ("b"); 
     JTextField myshort = new JTextField ("c"); 
     JTextField mylong = new JTextField ("d"); 
     JTextField mybyte = new JTextField ("e"); 
     JTextField mydbl = new JTextField ("f"); 
     JTextField mybool = new JTextField ("g"); 
     JTextArea myarea = new JTextArea(); 
     JScrollPane scrolla = new JScrollPane (myarea); 

     first.setOpaque (true); 
     first.setBounds (20, 20, 50, 20); 
     second.setOpaque (true); 
     second.setBounds (20, 70, 50, 20); 
     third.setOpaque (true); 
     third.setBounds (20, 120, 50, 20); 
     fourth.setOpaque (true); 
     fourth.setBounds (20, 170, 50, 20); 
     fifth.setOpaque (true); 
     fifth.setBounds (20, 220, 50, 20); 
     sixth.setOpaque (true); 
     sixth.setBounds (20, 270, 50, 20); 
     seventh.setOpaque (true); 
     seventh.setBounds (20, 320, 50, 20); 

     myint.setBounds (70, 20, 50, 20); 
     myint.setOpaque (true); 
     myfloat.setBounds (70, 70, 50, 20); 
     myfloat.setOpaque (true); 
     myshort.setBounds (70, 120, 50, 20); 
     myshort.setOpaque (true); 
     mylong.setBounds (70, 170, 80, 20); 
     mylong.setOpaque (true); 
     mybyte.setBounds (70, 220, 50, 20); 
     mybyte.setOpaque (true); 
     mydbl.setBounds (70, 270, 50, 20); 
     mydbl.setOpaque (true); 
     mybool.setBounds (70, 320, 50, 20); 
     mybool.setOpaque (true); 

     myarea.setOpaque (true); 
     myarea.setBackground (Color.yellow); 
     scrolla.setBounds (200, 50, 250, 200); 
     scrolla.setPreferredSize (new Dimension (250, 200)); 

     mygui.getContentPane().add (first); 
     mygui.getContentPane().add (second); 
     mygui.getContentPane().add (third); 
     mygui.getContentPane().add (fourth); 
     mygui.getContentPane().add (fifth); 
     mygui.getContentPane().add (sixth); 
     mygui.getContentPane().add (seventh); 

     mygui.getContentPane().add (myint); 
     mygui.getContentPane().add (myfloat); 
     mygui.getContentPane().add (myshort); 
     mygui.getContentPane().add (mylong); 
     mygui.getContentPane().add (mybyte); 
     mygui.getContentPane().add (mydbl); 
     mygui.getContentPane().add (mybool); 
     mygui.getContentPane().add (scrolla); 

     myarea.append ("sdfgsdfgsdfgsf\n"); 

     mygui.setVisible (true); 
     mygui.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 
    } 
} 
+4

Пожалуйста, никогда не предлагайте новичкам использовать «нулевой» макет, им достаточно иметь дело, не имея дело с этим. Это плохая практика, и в этой ситуации не приносит никакой пользы, кроме того, чтобы путать их дальше. – MadProgrammer

+1

-1, Когда вы добавляете компонент в фрейм, он добавляет компонент в область содержимого для вас, поэтому использование getContentPane() не требуется и не будет исправлять/изменять проблему. Кроме того, использование пустого макета - плохая идея и не должно использоваться для создания такой формы. Лучший способ сделать это - создать JPanel с соответствующим LayoutManager (ов) и добавить панель в фрейм. – camickr

+0

@MadProgrammer В чем проблема с нулевой компоновкой? Менеджеры макетов - довольно сложная область, и конкретные ограничения для всех компонентов явно могут быть хорошим способом для начинающих упростить работу. –

1

При использовании метода BorderLayout setBounds() не имеет никакого эффекта.Использование BorderLayout,
вы можете исправить свои компоненты только в пяти положении Север, Юг, Восток, Запад и Центр
Если вы не определяет позицию как add(comp, BorderLayout.EAST), это будет сделать ваши компоненты
случайным образом. Добавление большего количества компонентов без указания позиции будет перекрываться, и оно не даст четкого представления.

Вы используете более пяти компонентов, и вы не указываете положения, поэтому scrollpane
не подходит.

Используйте GridBagLayout, чтобы получить правильный результат. Refer http://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html

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