-3

一个 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

4 回答 4

2

你从来没有调用过你的init()方法。

因此,您永远不会将任何东西放入框架中。

于 2013-09-03T14:28:48.643 回答
1

你不调用你的初始化方法。添加构造函数

public SwingAll () {
   init();
}
于 2013-09-03T14:36:45.423 回答
1

正如其他答案中提到的那样,init()没有被调用。OTOH,如果是,则仅显示一个组件。此变体解决了这两个问题。

示例 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 应该在 Event Dispatch Thread 上启动和更新 - 留给用户作为练习。
  2. 框架的默认布局是BorderLayout. 此布局有 5 个可能的区域,可以由约束指定,每个区域只能容纳一个组件。通过将组件添加到无约束的边框布局中,它们都默认为BorderLayout.CENTER.
  3. 不设置GUI的大小,pack()添加组件后调用即可。
  4. 如果这些复选框应该是“一次只有一个”,请查看JRadioButtonButtonGroup
于 2013-09-03T14:52:24.220 回答
1

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

super("window name"); 

 setDefaultCloseOperation(EXIT_ON_CLOSE);
于 2013-09-03T14:41:45.827 回答