0

现在正在处理一项任务,我实际上是在编写我的第一个 GUI。除了我的滚动条之外,一切都运行良好——添加它后不仅不会显示,而且即使在我将其注释掉之后,添加的最后一个元素(通过 .add 函数调用)也会覆盖整个 GUI。将布局设置为 null 似乎可以解决这个问题,但我不确定这是否会帮助或阻碍第一个问题。我已经浏览过 Oracle 的文档和示例,但没有看到我需要什么。这是相关代码(似乎在空间中浮动的变量 ag 是单独部分的一部分,我没有粘贴它以隔离 GUI 代码):

    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);
    }
 }

我敢肯定这很简单,但感谢任何反馈。

4

3 回答 3

3

BorderLayout有五个定义的位置可以添加组件...

在此处输入图像描述

默认位置是CENTER

基本上发生了什么,当您将每个组件添加到框架/内容窗格时,它会删除最后一个并将其放置在中间,因为在给定位置中只能存在一个组件。

首先更改布局管理器。查看A Visual Guide to Layout Managers了解一些想法

于 2013-03-07T05:18:37.117 回答
1

使用 BorderLayout 时 setBounds() 方法没有任何效果。使用 BorderLayout,
您只能将组件固定在五个位置North、South、East、West 和 Center
如果您不指定位置 like add(comp, BorderLayout.EAST),它将
随机渲染您的组件。添加更多组件而不指定位置将重叠,并且不会提供清晰的视图。

您使用了五个以上的组件并且您没有指定位置,因此滚动窗格
不会出现。

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

于 2013-03-07T05:59:40.840 回答
-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);
    }
}
于 2013-03-07T05:18:33.187 回答