Swing JPanel未显示

时间:2014-06-12 02:13:24

标签: java swing jpanel

我有一个非常简单的java swing应用程序,我有一个从JPanel扩展的canvas类

public class Canvas extends JPanel 
{

private void doDrawing(Graphics g) 
{

    Graphics2D g2d = (Graphics2D) g;
    g2d.drawString("Java 2D", 50, 50);
}

@Override
public void paintComponent(Graphics g) 
{

    super.paintComponent(g);
    doDrawing(g);
}
}

然后我有我的主要课程

public class SwingCounter extends JFrame {
   private JTextField tfCount;  // Use Swing's JTextField instead of AWT's TextField
   private int count = 0;


   public SwingCounter () {
      Container cp = getContentPane();
      cp.setLayout(new FlowLayout());

      cp.add(new JLabel("Counter"));
      tfCount = new JTextField("0", 10);
      tfCount.setEditable(false);
      cp.add(tfCount);

      JButton btnCount = new JButton("Count");
      cp.add(btnCount);

      Canvas canvas = new Canvas();
      canvas.setSize(150, 150);
      cp.add(canvas);


      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  // Exit program if close-window button clicked
      setTitle("Swing Counter"); // "this" JFrame sets title
      setSize(300, 100);         // "this" JFrame sets initial size
      setVisible(true);          // "this" JFrame shows
   }


   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         @Override
         public void run() {
            new SwingCounter(); // Let the constructor do the job
         }
      });
   }
}

除了JPanel之外,它基本上是教程中的代码。一切都很好,JPanel / Canvas没有。缺少什么?

1 个答案:

答案 0 :(得分:2)

您正在将Canvas类添加到使用FlowLayout的面板中。 FlowLayout尊重所有组件的首选大小。您的组件有preferred size of (0, 0),因此无需绘制任何内容。

您需要覆盖Canvas类的getPreferredSize()方法,为您的面板返回适当的Dimension

阅读Custom Painting上的Swing教程中的部分以获取更多信息以及实现getPreferredSize()方法的工作示例。

另外,不要调用Canvas类,因为它已经是一个AWT组件并且令人困惑。使用更具描述性的名称。