JPanel没有出现

时间:2015-04-15 03:24:45

标签: java swing jframe jpanel

我直接从书中复制了这些例子。代码应该在JFrame上绘制几个东西,但没有任何东西出现(除了JFrame)这是带有main方法的类

import java.awt.BorderLayout;
import javax.swing.JFrame;

public class JavaApplication24 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
    JFrame frame = new JFrame("Window");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    frame.setSize(480,270);

    frame.setVisible(true);
    NewClass panel = new NewClass();

    frame.add(BorderLayout.CENTER, panel);

    }

这是JPanel的子类

import java.awt.Graphics;
import java.awt.Color;
import javax.swing.JPanel;


public class NewClass extends JPanel {

    @Override
    public void paintComponent(Graphics g){
        g.setColor(Color.BLUE);
        g.fillRect(0,0,100,100);

        g.setColor(Color.GREEN);
        g.drawRect(50,50,100,100);

        g.setColor(Color.RED);
        g.drawString("Hello",200,200);

        g.setColor(Color.RED);
        g.fillOval(240,40,100,30);

    }
}

1 个答案:

答案 0 :(得分:1)

问题#1

您的NewClass应该提供尺寸提示,布局管理员(在这种情况下为BorderLayout)可以决定如何最好地布置您的组件。

在进行任何自定义绘制之前,您还应该调用super.paintComponent,否则最终会出现渲染工件的结尾

public class NewClass extends JPanel {

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(400, 400);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.BLUE);
        g.fillRect(0, 0, 100, 100);

        g.setColor(Color.GREEN);
        g.drawRect(50, 50, 100, 100);

        g.setColor(Color.RED);
        g.drawString("Hello", 200, 200);

        g.setColor(Color.RED);
        g.fillOval(240, 40, 100, 30);

    }
}
  

我直接从书中复制了这些例子

我希望你犯了一些小错误,否则我会担心这本书的有效性:P

您还应该从事件调度线程的上下文中启动您的UI,这往往会解决可能出现在不同平台上的问题......

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            try {
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                ex.printStackTrace();
            }

            JFrame frame = new JFrame("Testing");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(new NewClass());
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
    });
}

有关详细信息,请参阅Initial Threads

问题#2

在您建立之前,不应该让UI可见,而不是

frame.setVisible(true);
NewClass panel = new NewClass();

frame.add(BorderLayout.CENTER, panel);

使用更像......

的东西
NewClass panel = new NewClass();
frame.add(BorderLayout.CENTER, panel);    
frame.setVisible(true);

有一些方法可以在框架可见后触发和更新,但这只是最简单的修复