现在正在完成任务,我基本上是在编写我的第一个GUI。一切都工作得很好,除了我的滚动条 - 添加它不仅不会显示,但即使在我评论之后,添加的LAST元素(通过.add函数调用)覆盖了整个GUI。将布局设置为null似乎可以解决这个问题,但我不确定这是否有助于或阻碍第一个问题。我已经浏览过Oracle的文档和示例,但没有看到我需要的东西。这是相关的代码(似乎在空间中浮动的变量a-g是单独部分的一部分,我没有粘贴它以隔离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);
}
}
我确信这很简单,但感谢任何反馈。
答案 0 :(得分:3)
BorderLayout
有五个已定义的位置,可以在其中添加组件......
默认位置为CENTER
。
基本上发生了什么,当您将每个组件添加到框架/内容窗格时,它会移除最后一个组件并将其自身放在中间,因为在给定位置中只能存在一个组件。
首先更改布局管理器。请查看A Visual Guide to Layout Managers了解一些想法
答案 1 :(得分:1)
使用BorderLayout时,setBounds()方法没有任何效果。使用BorderLayout,您只能在五个位置修复您的组件北,南,东,西和中心
如果您没有指定add(comp, BorderLayout.EAST)
之类的位置,它将随机渲染您的组件。添加更多组件而不指定位置将会重叠,并且不会给出清晰的视图。
您使用的是五个以上的组件而您没有指定位置,因此滚动窗格不会出现。
使用GridBagLayout产生正确的结果。请参阅http://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html
答案 2 :(得分:-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);
}
}