您的位置:程序门 -> java -> gui 设计



按钮拖放后存在的问题(望高手救人)


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


按钮拖放后存在的问题(望高手救人)
发表于:2007-04-10 17:45:51 楼主
问题(1):在实现了拖放后,按钮的前景色好象会没掉.   变成一个凹块,只有鼠标在上面左键点击放开才能恢复原状.     试过了给按钮   repaint()还是不能解决.小生搞不出啥解决办法了.
      问题(2):按扭都是在jpanel里,动态生成的.   jpanel用了流布局,使其可以随窗口大小而自动排列.但是就不出现垂直滚动条.横的可以.     如果按扭一多,被挤压后成一排,那么没有滚动条下面的都点不到.影响可操作性.

附简单源代码:

import   java.awt.borderlayout;
import   java.awt.dimension;
import   java.awt.flowlayout;
import   java.awt.datatransfer.dataflavor;
import   java.awt.datatransfer.stringselection;
import   java.awt.datatransfer.transferable;
import   java.awt.dnd.dndconstants;
import   java.awt.dnd.draggestureevent;
import   java.awt.dnd.draggesturelistener;
import   java.awt.dnd.draggesturerecognizer;
import   java.awt.dnd.dragsource;
import   java.awt.dnd.dragsourcedragevent;
import   java.awt.dnd.dragsourcedropevent;
import   java.awt.dnd.dragsourceevent;
import   java.awt.dnd.dragsourcelistener;
import   java.awt.dnd.droptarget;
import   java.awt.dnd.droptargetdragevent;
import   java.awt.dnd.droptargetdropevent;
import   java.awt.dnd.droptargetevent;
import   java.awt.dnd.droptargetlistener;
import   java.awt.event.actionevent;
import   java.awt.event.actionlistener;
import   java.awt.event.mouseadapter;
import   java.awt.event.mouseevent;
import   javax.swing.jbutton;
import   javax.swing.jframe;
import   javax.swing.jpanel;
import   javax.swing.jscrollpane;
import   javax.swing.jsplitpane;
import   javax.swing.jtextarea;

public   class   test   extends   jframe   implements   dragsourcelistener,draggesturelistener{

private   jsplitpane   hsplitpane   =   new   jsplitpane();

private   flowlayout   fo   =   new   flowlayout(flowlayout.center,   10,   10);

private   dimension   bdimension   =   new   dimension(60,   40);

private   dimension   tdimension   =   new   dimension(300,100);

private   jpanel   lpanel   =   new   jpanel(fo);

private   jpanel   rpanel   =   new   jpanel(fo);

private   jpopupmenu   panelpopup   =   new   jpopupmenu();

private   jpopupmenu   buttonpopup   =   new   jpopupmenu();

private   jbutton   choicedbutton;

private   int   count=8;


private   dragsource   ds;

private   stringselection   transferable;


public   static   void   main(string   args[])   {
new   test();
}

public   test()   {
super();

buildui();
hsplitpane.setdividerlocation(300);
hsplitpane.setleftcomponent(lpanel);
hsplitpane.setrightcomponent(rpanel);
hsplitpane.setdoublebuffered(true);
hsplitpane.setcontinuouslayout(true);

this.setdefaultcloseoperation(jframe.exit_on_close);
this.getcontentpane().add(hsplitpane,   borderlayout.center);
this.setsize(700,   400);
this.setvisible(true);
}


public   void   buildui()   {

addlpanelbutton(20, " ");

jtextarea   textarea   =   new   jtextarea( "drop   items   into   this   text   area: ");

textarea.setpreferredsize(tdimension);

rpanel.add(new   jscrollpane(textarea));


lpanel.setname( "左键 ");
lpanel.add(panelpopup);
lpanel.setminimumsize(new   dimension(0,   0));
rpanel.setminimumsize(new   dimension(0,   0));
}


//在左边面板上添加按钮

private   void   addlpanelbutton(int   btncount,string   btnname)   {
jbutton[]   buttons   =   new   jbutton[btncount];
for   (int   i   =   0;   i   <   btncount;   i++)   {
if(btncount==1){
buttons[i]   =   new   jbutton(btnname);
}
else{
buttons[i]   =   new   jbutton(string.valueof(i));
}
buttons[i].setpreferredsize(bdimension);
buttons[i].add(buttonpopup);
buttons[i].setactioncommand( "button ");


ds   =   new   dragsource();
draggesturerecognizer   dgr   =   ds.createdefaultdraggesturerecognizer(buttons[i],
dndconstants.action_copy,   this);


lpanel.add(buttons[i]);
lpanel.updateui();
}
}


//下面这几个方法是实现接口的   dragsourcelistener,draggesturelistener

public   void   draggesturerecognized(draggestureevent   dge)   {
system.out.println( "drag   gesture   recognized! ");


jbutton   button=(jbutton)   dge.getcomponent();

string   content=button.gettext();
if(content!=null){
transferable   =   new   stringselection(content);
ds.startdrag(dge,   dragsource.defaultcopydrop,   transferable,   this);
}
}


public   void   dragenter(dragsourcedragevent   dsde)   {
system.out.println( "drag   enter ");
}

public   void   dragexit(dragsourceevent   dse)   {
system.out.println( "drag   exit ");
}

public   void   dragover(dragsourcedragevent   dsde)   {
system.out.println( "drag   over ");
}

public   void   dragdropend(dragsourcedropevent   dsde)   {
system.out.print( "drag   drop   end:   ");
if   (dsde.getdropsuccess())   {
system.out.println( "succeeded ");
}   else   {
system.out.println( "failed ");
}

}

public   void   dropactionchanged(dragsourcedragevent   dsde)   {
system.out.println( "drop   action   changed ");
}

}
发表于:2007-04-10 17:55:211楼 得分:0
up,哈哈!
发表于:2007-04-10 19:44:242楼 得分:0
给按钮   repaint()不能解决   那你试试   jpanel.repaint();

jpanel   设成   gridlayout   布局试试
发表于:2007-04-10 20:02:443楼 得分:0
jpanel   设成   gridlayout   ,那jsplitpane不就没用了。用flowlayout目的就是让它拉动时能重新布局
发表于:2007-04-11 09:48:094楼 得分:0
谢谢秋水回答,但方法还是不能解决问题.     上面代码可运行的,继续等待救世主的出现...
发表于:2007-04-11 10:18:265楼 得分:0
repaint()改为revalidate()试试
发表于:2007-04-11 10:28:236楼 得分:0
按钮可以改成jlabel就可以解决了,但是布局好像没有什么好的方法!
发表于:2007-04-12 15:41:197楼 得分:0
小顶一下..   不瞑目啊,都没人来救俺一命
发表于:2007-04-12 16:50:028楼 得分:0
你把水平滚动条去掉试试
发表于:2007-04-17 10:23:419楼 得分:0
按钮换成label是可以了,但是那个垂直滚动条的问题还是解决不了
发表于:2007-04-17 13:28:4710楼 得分:0
updateui
发表于:2007-04-17 17:10:3011楼 得分:0
谢谢上面几位回答,但还是解决不了问题...   难道flowlayout布局的panel不能有垂直滚动条,或者有其他的处理方式或者方法实现相同的功能?
发表于:2007-04-17 17:54:4912楼 得分:0
import   java.awt.*;

import   javax.swing.jbutton;
import   javax.swing.jframe;
import   javax.swing.jpanel;
import   javax.swing.jscrollpane;

public   class   wraplayout   extends   flowlayout  
{
public   wraplayout()
{
super();
}

public   wraplayout(int   align)  
{
super(align);
}

public   wraplayout(int   align,   int   hgap,   int   vgap)
{
super(align,   hgap,   vgap);
}

public   dimension   preferredlayoutsize(container   container)
{
container   containerparent   =   container.getparent();
if   (containerparent   ==   null)   {
return   super.preferredlayoutsize(container);
}
else   {
container.setbounds(container.getx(),   container.gety(),   containerparent.getwidth(),   100);
layoutcontainer(container);

return   new   dimension(containerparent.getwidth(),   getmaxy(container)   +   getvgap());
}
}

private   int   getmaxy(container   container)
{
int   y   =   getvgap();
int   n   =   container.getcomponentcount();
for   (int   i   =   0;   i   <   n;   i++)   {
component   c   =   container.getcomponent(i);
y   =   math.max(y,   c.gety()   +   c.getheight());
}

return   y;
}

public   dimension   minimumlayoutsize(container   parent)
{
return   new   dimension(10,   10);
}

public   static   void   main(string[]   args)
{
jpanel   p   =   new   jpanel(new   wraplayout());
for   (int   i   =   0;   i   <   50;   i++)   {
p.add(new   jbutton( "button "   +   i));
}
jscrollpane   sp   =   new   jscrollpane(p);

jframe   f   =   new   jframe();
f.getcontentpane().add(sp,   borderlayout.center);
f.setsize(800,   600);
f.setlocationrelativeto(null);
f.setdefaultcloseoperation(jframe.exit_on_close);
f.setvisible(true);
}
}
发表于:2007-04-17 21:53:2613楼 得分:0
楼上的强!
发表于:2007-04-18 19:35:3314楼 得分:0
mark
发表于:2007-04-19 23:00:0315楼 得分:0
建议用gridbaglayout,功能比较强大
发表于:2007-04-24 17:38:3116楼 得分:0
gtlang78()   果然厉害,谢过了
发表于:2007-05-06 15:29:1917楼 得分:0
学习ing...
发表于:2007-05-07 10:54:4218楼 得分:0
xuexi...
发表于:2007-05-13 18:06:1119楼 得分:0
强,学了http://www.dacaiwang.cn


快速检索

最新资讯
热门点击