2016-08-04 100 views
0

我有一个JFrame。当我点击框架时,我想添加一个Component(在这种情况下是Canvas的扩展名)。我添加了一个MouseListener到帧如下:为什么我不能使用MouseListener将组件添加到JFrame?

frame.addMouseListener(new MouseAdapter() { 
     public void mouseClicked(MouseEvent e) { 
      frame.add(canvas); 
      frame.repaint(); 
     } 
    }); 

然而,当点击了帧鼠标上的部件不会被添加。在我的主要方法中添加组件没有问题。在鼠标侦听器中添加打印语句正确打印,正如从框架中删除组件一样。

+0

什么是布局?'revalidate()'也需要 –

+0

尝试在重绘之前添加'frame.pack()'。 – sprinter

+0

使用['CardLayout'](http://download.oracle.com/javase/8/docs/api/java/awt/CardLayout.html)如[本答案]中所示(http://stackoverflow.com /一个/418556分之5786005)。 –

回答

0

像@ sprinter9说的,在重新粉刷之前加frame.pack()。 尝试以下

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 

public class Frame { 
    public static void main(String[] args){ 
     final JFrame frame = new JFrame("Add Component"); 
     final Canvas canvas = new Canvas(); 
     canvas.setBackground(Color.BLACK); 

     frame.addMouseListener(new MouseAdapter() { 
      public void mouseClicked(MouseEvent e) { 
       System.out.println("Clicked"); 
       frame.add(canvas); 
       frame.pack(); 
       frame.repaint(); 
      } 
     }); 


     frame.setMinimumSize(new Dimension(320,240)); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 

演示,http://kurungkurawal.com/gifs/frame-add-component.gif

+0

更好的方法是使用'CardLayout' .. –

0

您直接添加组件到JFrame。你应该使用它的contentPane来代替:

frame.getContentPane().add(canvas); 
+0

从Java 1.5开始就没有必要。 –

相关问题