2013-03-07 52 views
0

现在正在处理作业,我基本上正在编写我的第一个GUI。除了我的滚动条之外,一切都工作正常,添加它不仅不会显示,而且即使在我将它注释掉之后,添加的LAST元素(通过.add函数调用)也会覆盖整个GUI。将布局设置为null似乎解决了这个问题,但我不确定这是否有助于或阻碍第一个问题。我已经通过Oracle的文档和例子,并没有看到我需要什么。下面是相关的代码(即似乎在太空中漂浮的变量AG是一个单独的部分的一部分,我还没有贴上它,以便隔离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中,但只是其内容窗格中。这些更改后,它应该可以正常工作。一旦在文本区域中有足够的文本,您将看到滚动条。下面是对我的作品你的代码的优化版本固定:

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

请不要建议新手使用'null'布局,他们有足够的处理,而不必处理。这是一种不好的做法,在这种情况下,除了进一步混淆它们之外别无其他。 – MadProgrammer 2013-03-07 05:20:07

+1

-1,将组件添加到框架时,它会将组件添加到内容窗格中,因此使用getContentPane()不是必需的,并且不会修复/更改问题。此外,使用空布局是一个坏主意,不应该用于创建像这样的表单。更好的方法是使用适当的LayoutManager创建JPanel并将面板添加到框架。 – camickr 2013-03-07 05:23:29

+0

@MadProgrammer null布局有什么问题?布局管理器是相当复杂的领域,明确指定所有组件的边界可能是新手轻松实现工作的好方法。 – 2013-03-07 05:23:56

1

使用的BorderLayout的setBounds()方法不会产生任何影响。使用BorderLayout的,
就可以解决您的组件,仅在五个位置北,南,东,西和中心
如果不指定像add(comp, BorderLayout.EAST)位置,它会使你的组件
随机。添加更多组件而不指定位置将会重叠,并且不会给出清晰的视图。

您正在使用超过五个组件,并且您没有指定位置,因此不会显示滚动窗格

使用GridBagLayout来产生正确的结果。请参考http://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html