问题描述
netbeans里都是使用的匿名内部类,我想给JPanel这样的面板加个监听器,难不成我从新弄个它的子类,然后手动修改它的代码吗?请问netbeans达人,这些怎么做才更好?谢谢!
解决方案
解决方案二:
你说的什么,不大明白...NB的swing程序生成的代码默认只是监听器是匿名内部类,并且在"工具--选项--其他--gui生成"里可调而一般的组件都生成是类的私有属性啊.并且如果你用其可视化设计界面的话,为某组件设置监听器,只需要点击那个组件,在旁边的属性面板中点击事件,选择相应的事件就好了啊
解决方案三:
新建一个面板类,继承JPanel,如果是写事件监听器,可以直接在设计界面里直接添加,如果要实现接口,就要自己写代码了
解决方案四:
把EventLisnter实现成innerclass是为了方便访问enclosingclass的成员,某个Event发生的时候,你的响应逻辑通常是需要访问这些成员的。当然也可以写一个独立的EventLisnter实现然后用addxxxLisnter方法添加到component上,不过这时候你想访问这component上的成员时,作为eventsource的component要提供足够的public方法。
解决方案五:
哦多谢楼上几位。问题问的却是有点模糊。不是监听器。是让组件实现一个接口。当然了这个接口肯定也是监听器了。只是在它的可视化里没有:如就是这个,看下加粗部分就可以了,比方说就是添加这么个东东。这个接口可视化里可没有。我要实现拖拽的那种程序。如果达人们有更好的实现组件或类库,那更方便。而自己基于swing,那就只有自己写代码啦。publicclassComplexExampleextendsJFrameimplementsDragGestureListener{JPanelpanel;JPanelleft;publicComplexExample(){setTitle("ComplexExample");panel=newJPanel(newFlowLayout(FlowLayout.LEFT,50,15));JButtonopenb=newJButton("ChooseColor");openb.setFocusable(false);left=newJPanel();left.setBackground(Color.red);left.setPreferredSize(newDimension(100,100));openb.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEventevent){JColorChooserclr=newJColorChooser();Colorcolor=clr.showDialog(panel,"ChooseColor",Color.white);left.setBackground(color);}});JPanelright=newJPanel();right.setBackground(Color.white);right.setPreferredSize(newDimension(100,100));newMyDropTargetListener(right);DragSourceds=newDragSource();ds.createDefaultDragGestureRecognizer(left,DnDConstants.ACTION_COPY,this);panel.add(openb);panel.add(left);panel.add(right);add(panel);pack();setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setLocationRelativeTo(null);setVisible(true);}publicvoiddragGestureRecognized(DragGestureEventevent){Cursorcursor=null;JPanelpanel=(JPanel)event.getComponent();Colorcolor=panel.getBackground();if(event.getDragAction()==DnDConstants.ACTION_COPY){cursor=DragSource.DefaultCopyDrop;}event.startDrag(cursor,newTransferableColor(color));}classMyDropTargetListenerextendsDropTargetAdapter{privateDropTargetdropTarget;privateJPanelpanel;publicMyDropTargetListener(JPanelpanel){this.panel=panel;dropTarget=newDropTarget(panel,DnDConstants.ACTION_COPY,this,true,null);}publicvoiddrop(DropTargetDropEventevent){try{Transferabletr=event.getTransferable();Colorcolor=(Color)tr.getTransferData(TransferableColor.colorFlavor);if(event.isDataFlavorSupported(TransferableColor.colorFlavor)){event.acceptDrop(DnDConstants.ACTION_COPY);this.panel.setBackground(color);event.dropComplete(true);return;}event.rejectDrop();}catch(Exceptione){e.printStackTrace();event.rejectDrop();}}}publicstaticvoidmain(String[]args){newComplexExample();}}classTransferableColorimplementsTransferable{protectedstaticDataFlavorcolorFlavor=newDataFlavor(Color.class,"AColorObject");protectedstaticDataFlavor[]supportedFlavors={colorFlavor,DataFlavor.stringFlavor,};Colorcolor;publicTransferableColor(Colorcolor){this.color=color;}publicDataFlavor[]getTransferDataFlavors(){returnsupportedFlavors;}publicbooleanisDataFlavorSupported(DataFlavorflavor){if(flavor.equals(colorFlavor)||flavor.equals(DataFlavor.stringFlavor))returntrue;returnfalse;}publicObjectgetTransferData(DataFlavorflavor)throwsUnsupportedFlavorException{if(flavor.equals(colorFlavor))returncolor;elseif(flavor.equals(DataFlavor.stringFlavor))returncolor.toString();elsethrownewUnsupportedFlavorException(flavor);}}多谢!
解决方案六:
麻烦朋友有时间再来看看,我给出了个例子。这是一个完整的例子,拷过去生成class,就可以运行了。就是想在netbeans里如何实现这一步骤。首先来说netbeans里没有这个侦听器。倒是有监听鼠标拖动的。我想问下,netbeans怎么处理这种情况,是说在哪弄下,它自己能处理,还是说自己改代码。最好给出1、2、3...简短的步骤说明,说出需要做什么就可以了,不用太详细。多谢!