我有一个非常简单的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没有。缺少什么?
答案 0 :(得分:2)
您正在将Canvas类添加到使用FlowLayout
的面板中。 FlowLayout尊重所有组件的首选大小。您的组件有preferred size of (0, 0)
,因此无需绘制任何内容。
您需要覆盖Canvas类的getPreferredSize()
方法,为您的面板返回适当的Dimension
。
阅读Custom Painting上的Swing教程中的部分以获取更多信息以及实现getPreferredSize()方法的工作示例。
另外,不要调用Canvas类,因为它已经是一个AWT组件并且令人困惑。使用更具描述性的名称。