JFrame在JavaSwingGUI上显示为空

JFrame在JavaSwingGUI上显示为空,java,eclipse,swing,Java,Eclipse,Swing,我正在使用的书中说,这段代码应该显示框架,框架内有一个列表,至少还有OK按钮 编译时,我只看到帧名为“Event Object”的帧。 框架内部是空白的 import java.awt.event.ActionListener; import java.text.DateFormat; import java.util.Calendar; import java.util.Date; import java.util.Locale; import javax.swing.DefaultListM

我正在使用的书中说,这段代码应该显示框架,框架内有一个列表,至少还有OK按钮
编译时,我只看到帧名为“Event Object”的帧。
框架内部是空白的

import java.awt.event.ActionListener;
import java.text.DateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;

public class EventObject extends JFrame
{
    private JList list;
    private DefaultListModel model;

    public EventObject()
    {
        setTitle("Event Object");
        JPanel panel = new JPanel();
        panel.setLayout(null);

        model = new DefaultListModel();
        list = new JList(model);
        list.setBounds(150, 30, 220, 150);
        JButton ok = new JButton("Ok");
        ok.setBounds(30, 35, 80, 25);
        ok.addActionListener( new ActionListener () 
        {
            public void actionPerformed(ActionEvent event)
            {
                Locale locale = Locale.getDefault();
                Date date = new Date();
                String s = DateFormat.getTimeInstance(DateFormat.SHORT, locale).format(date);
                if ( !model.isEmpty() )
                    model.clear();
                    if (event.getID() == ActionEvent.ACTION_PERFORMED)
                        model.addElement(" Event Id: ACTION_PERFORMED");
                    model.addElement(" Time: " + s);
                    String source = event.getSource().getClass().getName();
                    model.addElement(" Source: " + source);
                    int mod = event.getModifiers();
                    StringBuffer buffer = new StringBuffer(" Modifiers: ");
                    if ((mod & ActionEvent.ALT_MASK) > 0)
                        buffer.append("Alt ");
                    if ((mod & ActionEvent.SHIFT_MASK) > 0)
                        buffer.append("Shift ");
                    if ((mod & ActionEvent.META_MASK) > 0)
                        buffer.append("Meta ");
                    if ((mod & ActionEvent.CTRL_MASK) > 0)
                        buffer.append("Ctrl ");
                    model.addElement(buffer);
                }
        });
        panel.add(ok);
        panel.add(list);

        setSize(500, 500);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    }

    public static void main (String[] args)
    {
        new EventObject();
    }
}

这是因为您只创建了一些组件,但没有向
EventObject
(扩展了JFrame)添加任何内容。尝试添加:

add(panel);

例如,在
.setSize()之前,它应该可以工作。

因为您只创建了一些组件,但没有向
事件对象添加任何内容(它扩展了JFrame)。尝试添加:

add(panel);
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;

public class EventObject extends JFrame
{
private JList list;
private DefaultListModel model;

public EventObject()
{
    setTitle("Event Object");
    JPanel panel = new JPanel();
    panel.setLayout(null);
    add(panel);

    model = new DefaultListModel();
    list = new JList(model);
    list.setBounds(150, 30, 220, 150);
    JButton ok = new JButton("Ok");
    ok.setBounds(30, 35, 80, 25);
    ok.addActionListener( new ActionListener () 
    {
        public void actionPerformed(ActionEvent event)
        {
            Locale locale = Locale.getDefault();
            Date date = new Date();
            String s = DateFormat.getTimeInstance(DateFormat.SHORT, locale).format(date);
            if ( !model.isEmpty() )
                model.clear();
                if (event.getID() == ActionEvent.ACTION_PERFORMED)
                    model.addElement(" Event Id: ACTION_PERFORMED");
                model.addElement(" Time: " + s);
                String source = event.getSource().getClass().getName();
                model.addElement(" Source: " + source);
                int mod = event.getModifiers();
                StringBuffer buffer = new StringBuffer(" Modifiers: ");
                if ((mod & ActionEvent.ALT_MASK) > 0)
                    buffer.append("Alt ");
                if ((mod & ActionEvent.SHIFT_MASK) > 0)
                    buffer.append("Shift ");
                if ((mod & ActionEvent.META_MASK) > 0)
                    buffer.append("Meta ");
                if ((mod & ActionEvent.CTRL_MASK) > 0)
                    buffer.append("Ctrl ");
                model.addElement(buffer);
            }
    });
    panel.add(ok);
    panel.add(list);

    setSize(500, 500);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setVisible(true);
}

public static void main (String[] args)
{
    new EventObject();
}
}

例如,在
.setSize()之前,它应该可以工作。

试试这段代码,它应该可以工作

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;

public class EventObject extends JFrame
{
private JList list;
private DefaultListModel model;

public EventObject()
{
    setTitle("Event Object");
    JPanel panel = new JPanel();
    panel.setLayout(null);
    add(panel);

    model = new DefaultListModel();
    list = new JList(model);
    list.setBounds(150, 30, 220, 150);
    JButton ok = new JButton("Ok");
    ok.setBounds(30, 35, 80, 25);
    ok.addActionListener( new ActionListener () 
    {
        public void actionPerformed(ActionEvent event)
        {
            Locale locale = Locale.getDefault();
            Date date = new Date();
            String s = DateFormat.getTimeInstance(DateFormat.SHORT, locale).format(date);
            if ( !model.isEmpty() )
                model.clear();
                if (event.getID() == ActionEvent.ACTION_PERFORMED)
                    model.addElement(" Event Id: ACTION_PERFORMED");
                model.addElement(" Time: " + s);
                String source = event.getSource().getClass().getName();
                model.addElement(" Source: " + source);
                int mod = event.getModifiers();
                StringBuffer buffer = new StringBuffer(" Modifiers: ");
                if ((mod & ActionEvent.ALT_MASK) > 0)
                    buffer.append("Alt ");
                if ((mod & ActionEvent.SHIFT_MASK) > 0)
                    buffer.append("Shift ");
                if ((mod & ActionEvent.META_MASK) > 0)
                    buffer.append("Meta ");
                if ((mod & ActionEvent.CTRL_MASK) > 0)
                    buffer.append("Ctrl ");
                model.addElement(buffer);
            }
    });
    panel.add(ok);
    panel.add(list);

    setSize(500, 500);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setVisible(true);
}

public static void main (String[] args)
{
    new EventObject();
}
}

试试这段代码,它应该可以工作

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;

public class EventObject extends JFrame
{
private JList list;
private DefaultListModel model;

public EventObject()
{
    setTitle("Event Object");
    JPanel panel = new JPanel();
    panel.setLayout(null);
    add(panel);

    model = new DefaultListModel();
    list = new JList(model);
    list.setBounds(150, 30, 220, 150);
    JButton ok = new JButton("Ok");
    ok.setBounds(30, 35, 80, 25);
    ok.addActionListener( new ActionListener () 
    {
        public void actionPerformed(ActionEvent event)
        {
            Locale locale = Locale.getDefault();
            Date date = new Date();
            String s = DateFormat.getTimeInstance(DateFormat.SHORT, locale).format(date);
            if ( !model.isEmpty() )
                model.clear();
                if (event.getID() == ActionEvent.ACTION_PERFORMED)
                    model.addElement(" Event Id: ACTION_PERFORMED");
                model.addElement(" Time: " + s);
                String source = event.getSource().getClass().getName();
                model.addElement(" Source: " + source);
                int mod = event.getModifiers();
                StringBuffer buffer = new StringBuffer(" Modifiers: ");
                if ((mod & ActionEvent.ALT_MASK) > 0)
                    buffer.append("Alt ");
                if ((mod & ActionEvent.SHIFT_MASK) > 0)
                    buffer.append("Shift ");
                if ((mod & ActionEvent.META_MASK) > 0)
                    buffer.append("Meta ");
                if ((mod & ActionEvent.CTRL_MASK) > 0)
                    buffer.append("Ctrl ");
                model.addElement(buffer);
            }
    });
    panel.add(ok);
    panel.add(list);

    setSize(500, 500);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setVisible(true);
}

public static void main (String[] args)
{
    new EventObject();
}
}

避免使用
null
布局,像素完美的布局在现代ui设计中是一种错觉。影响零部件单个尺寸的因素太多,您无法控制。Swing的设计初衷是与布局管理器一起工作,丢弃它们将导致无止境的问题,您将花费越来越多的时间试图纠正这些问题。您忘记将
面板
添加到
JFrame
。避免使用
null
布局,像素完美的布局在现代ui设计中是一种幻觉。影响零部件单个尺寸的因素太多,您无法控制。Swing旨在与核心的布局管理器一起工作,丢弃它们将导致无休止的问题,您将花费越来越多的时间试图纠正这些问题您忘记将
面板
添加到
JFrame