即使编译和运行时没有错误,程序输出也不如预期

时间:2013-09-03 14:26:28

标签: java swing jtextfield jcheckbox itemlistener

Java Swing小程序,包括3个复选框和一个TextField。单击时指定的复选框显示分配给给定TextField中相应复选框的标题。问题是即使编译和运行时没有错误,空白帧也会显示为输出.. !!

这是Java代码:

SwingAll类:

package swingall;

import java.awt.Container;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JTextField;


public class SwingAll extends JFrame implements ItemListener {

JTextField t1;
JCheckBox c1,c2,c3;

public void init()
{
    Container cp=getContentPane();
    t1=new JTextField(20);
    c1=new JCheckBox("Arts");
    c2=new JCheckBox("Commerce");
    c3=new JCheckBox("Science");
    add(c1);
    add(c2);
    add(c3);
    add(t1);
    c1.addItemListener(this);
    c2.addItemListener(this);
    c3.addItemListener(this);
}

public void itemStateChanged(ItemEvent e) {

    if (e.getSource()==c1)
    {
        t1.setText("Arts");
    }
    if (e.getSource()==c2)
    {
        t1.setText("Commerce");
    }
    if (e.getSource()==c3)
    {
        t1.setText("Science");
    }
}
}

主要类别是:

package swingall;

public class Main {

public static void main(String[] args) {

    SwingAll sg=new swingAll();
    sg.setSize(500, 500);
    sg.setVisible(true);
}
}

4 个答案:

答案 0 :(得分:2)

您从未调用过init()方法。

因此,你永远不会在框架中放置任何东西。

答案 1 :(得分:1)

你不要调用你的init方法。 添加构造函数

public SwingAll () {
   init();
}

答案 2 :(得分:1)

你需要将你的类init()设置为构造函数,它应该是SwingAll 尝试添加private static final long serialVersionUID = 1L; 我没有看到窗口的标题尝试设置

super("window name"); 

 setDefaultCloseOperation(EXIT_ON_CLOSE);

答案 3 :(得分:1)

正如其他答案所述,init()未被调用。 OTOH,如果是,只显示一个组件。这个变种解决了这两个问题。

Example GUI

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

public class SwingAll extends JFrame implements ItemListener {

JTextField t1;
JCheckBox c1,c2,c3;

public void init()
{
    // end the JVM when frame is closed.
    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    Container cp=getContentPane();
    // set a layout that takes many components without a 
    // constraint and displays them.
    cp.setLayout(new FlowLayout());
    t1=new JTextField(20);
    c1=new JCheckBox("Arts");
    c2=new JCheckBox("Commerce");
    c3=new JCheckBox("Science");
    add(c1);
    add(c2);
    add(c3);
    add(t1);
    c1.addItemListener(this);
    c2.addItemListener(this);
    c3.addItemListener(this);
    // pack the GUI to the size needed to display the content
    pack();
}

public void itemStateChanged(ItemEvent e) {

    if (e.getSource()==c1)
    {
        t1.setText("Arts");
    }
    if (e.getSource()==c3)
    {
        t1.setText("Commerce");
    }
    if (e.getSource()==c3)
    {
        t1.setText("Science");
    }
}

public static void main(String[] args) {
    // should be started on the EDT.
    SwingAll sg= new SwingAll();
    sg.init();
    sg.setVisible(true);
}
}

其他提示

  1. // should be started on the EDT.应该在事件发送线程上启动和更新Swing GUI,作为用户的练习。
  2. 框架的默认布局为BorderLayout。此布局有5个可以由约束指定的可能区域,每个区域可以只包含一个组件。通过在没有约束的情况下将组件添加到边框布局,它们都默认为BorderLayout.CENTER
  3. 不要设置GUI的大小,只需在添加组件后调用pack()即可。
  4. 如果这些复选框应该是“一次只有一个”,请查看JRadioButtonButtonGroup