java swing组件拖动和显示问题

问题描述

java swing组件拖动和显示问题

两个问题(1)做出来的窗体组件运行后点击“添加”按钮,应该再窗体上生成一个JLabel标签,点击后能够生成但显示不出来,改变窗体大小才能显示出来。(2)生成的JLabel能够改变大小和拖动,先拖动到另一个位置,改变窗体大小后,又回到原来的位置去了。求大神知道下。

看了以前的帖子@raistlic说是重绘问题,但是按帖子方法把setVisible放在添加控件后面不起作用。使用getContentPane()invalidate.()总是提示找不到符号。

import java.awt.*;
import java.awt.event.*;
import static java.awt.BorderLayout.*;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.SwingUtilities;
import javax.swing.plaf.ButtonUI;
class Win extends Frame
{
    JButton jb1,jb2,jb3,jb4,jb5;//编辑、添加、修改、删除、调度
    JPanel jp_button;//放置按钮的面板
    JPanel jp_xianlu;//放置线路图的面板
    JTextField jt; //添加 时用的text
    String str1;

    Win()
    {
      super("我的面板");
      setExtendedState( Frame.MAXIMIZED_BOTH );
      setLayout(new BorderLayout(30,5));

      jp_button =new JPanel();
      jp_button.setVisible(true);
      jp_button.setOpaque(true);
          jp_button.setBackground(Color.BLUE);
      add(jp_button,SOUTH);

      jp_xianlu =new JPanel();
      jp_xianlu.setVisible(true);
      jp_xianlu.setOpaque(true);
          jp_xianlu.setBackground(Color.GREEN);
      add(jp_xianlu,CENTER);

      JTextField jt= new JTextField("我的标签");
        jp_button.add(jt);
        jt.setOpaque(true);
        jt.setBackground(Color.RED);

      jb1 = new JButton("编辑");
      jb2 = new JButton("添加");
      jb3 = new JButton("修改");
      jb4 = new JButton("删除");
      jb5 = new JButton("调度");
      jp_button.add(jb1);
      jp_button.add(jb2);
      jp_button.add(jb3);
      jp_button.add(jb4);
      jp_button.add(jb5);

      //Frame上添加windows监听,使之关闭按钮可用
      addWindowListener(new WindowAdapter(){
           public void windowClosing(WindowEvent e){
                System.exit(0);
           }
       });
      //点击“添加”按钮时在jp_xianlu面板上生成JLabel
         jb2.addActionListener(new ActionListener()
         {
              public void actionPerformed(ActionEvent e) {
                                str1 = jt.getText();
                                setLab(str1,100,100);
              }
            });
     }

    public void setLab(String str,int a,int b){
          try
          {
    //        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
                if(str==null)
                {
                    System.out.println("输入不能不能为空");
                    }
                else
                {
                    JLabel lab= new JLabel(str); //输入标签显示内容
                    lab.setOpaque(true);    //label 是透明的
                    lab.setBackground(Color.RED); //设置背景色
                    lab.setBounds(a,b,80,80);

                    //给生成的JLabel添加监听,使之可以自由改变大小并可以拖动
                    DnDAdapter dda =new DnDAdapter();
                    lab.addMouseMotionListener(dda);
                    jp_xianlu.add(lab);
                    }
          }
          catch(Exception e){
              System.out.println(e.getMessage());
          }

    }   

    public static void main(String args[])
   {
            SwingUtilities.invokeLater(new Runnable() {

                  @Override
                  public void run() {
                    Win win=new Win();
                    //win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    win.setLocationRelativeTo(null);
                    win.setVisible(true);
                  }
            });
   }
}

//自定义的可以自由实现组件拖动的监听器(摘自网络,还未完全理解)
class DnDAdapter extends MouseAdapter
{
    //每个组件的信息,在进入组件时获得。
    private JComponent jcom;
    private Point jcomOriginPoint;//组件在容器内的坐标
    private int jcomWidth,jcomHeight;
    //与定位、缩放相关信息
    private int a=10;//鼠标检测边沿大小
    private    Point pointMoved;//移动时,容器内坐标
    private CurType curCuror;//
    private enum  CurType {LeftTop,LeftBottom,RightTop,RightBottom,Top,Bottom,Left,Right,Center}
    //光标区域判断
    private  CurType getCurType(MouseEvent e)
    {
        Point p=e.getPoint();//getPoint返回组件内的坐标
        //左上角 0<x<a,0<y<a
        if((p.x>=0 && p.x<=a)&&(p.y>=0&&p.y<=a))
            return CurType.LeftTop;
        //右下角 w-a<x<w  h-a<y<h
        else if((p.x>=jcomWidth-a&&p.x<=jcomWidth)&&(p.y>=jcomHeight-a&&p.y<=jcomHeight))
            return CurType.RightBottom;
        //右上角w-a<x<w,0<y<a
        else if((p.x>=jcomWidth-a&&p.x<=jcomWidth)&&(p.y>=0&&p.y<=a))
            return CurType.RightTop;
        //左下角0<x<a,h-a<y<h
        else if((p.x>=0&&p.x<=a)&&(p.y>=jcomHeight-a&&p.y<=jcomHeight))
            return CurType.LeftBottom;
        //垂直:w-a<x<w && a<y<h-a 右边
        else if( p.x>=jcomWidth-a && p.x<=jcomWidth && p.y>=a && p.y<=jcomHeight-a)
            return CurType.Right;
        //垂直:0<x<a,a<y<h-a 左边
        else if(p.x>=0 && p.x<=a && p.y>=a && p.y<=jcomHeight-a)
            return CurType.Left;
        //水平 a<x<w-a && 0<y<a  上边
        else if((p.x>=a&&p.x<=jcomWidth-a) &&p.y>=0&&p.y<=a)
            return CurType.Top;
        //水平 a<x<w-a &&h-a<y<h  下边
        else if((p.x>=a&&p.x<=jcomWidth-a) &&p.y>=jcomHeight-a&&p.y<=jcomHeight)
            return CurType.Bottom;
        //中间
        else
            //jcom.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));//没有这句鼠标会一直保持形状
            return CurType.Center;  

    }
    private void setCurType(MouseEvent e)
    {
        switch(getCurType(e))
        {
        case LeftTop:
            jcom.setCursor(Cursor.getPredefinedCursor(Cursor.NW_RESIZE_CURSOR));
            curCuror=CurType.LeftTop;
            break;
        case LeftBottom:
            jcom.setCursor(Cursor.getPredefinedCursor(Cursor.SW_RESIZE_CURSOR));
            curCuror=CurType.LeftBottom;
            break;
        case RightTop:
            jcom.setCursor(Cursor.getPredefinedCursor(Cursor.NE_RESIZE_CURSOR));
            curCuror=CurType.RightTop;
            break;
        case RightBottom:
            jcom.setCursor(Cursor.getPredefinedCursor(Cursor.SE_RESIZE_CURSOR));
            curCuror=CurType.RightBottom;
            break;
        case Top:
            jcom.setCursor(Cursor.getPredefinedCursor(Cursor.N_RESIZE_CURSOR));
            curCuror=CurType.Top;
            break;
        case Bottom:
            jcom.setCursor(Cursor.getPredefinedCursor(Cursor.N_RESIZE_CURSOR));
            curCuror=CurType.Bottom;
            break;
        case Left:
            jcom.setCursor(Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR));
            curCuror=CurType.Left;
            break;
        case Right:
            jcom.setCursor(Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR));
            curCuror=CurType.Right;
            break;
        default:
            jcom.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
            curCuror=CurType.Center;
            break;
        }
    }
    private void setPosition(MouseEvent e)
    {
        Point pointNow=e.getLocationOnScreen();
        int incX=pointNow.x-pointMoved.x;//增量是相对于最后一次移动的点。
        int incY=pointNow.y-pointMoved.y;
        ///
        //System.out.print("PointNow:("+pointNow.x+","+pointNow.y+")t");
        //System.out.println("PointMoved:("+pointMoved.x+","+pointMoved.y+")t");
        Rectangle rect=new Rectangle();
        switch(curCuror)
        {
        case LeftTop:
            rect.x=jcomOriginPoint.x+incX;
            rect.y=jcomOriginPoint.y+incY;
            rect.width=jcomWidth-incX;
            rect.height=jcomHeight-incY;
            break;
        case LeftBottom:
            rect.x=jcomOriginPoint.x+incX;
            rect.y=jcomOriginPoint.y;
            rect.width=jcomWidth-incX;
            rect.height=jcomHeight+incY;
            break;
        case RightTop:
            rect.x=jcomOriginPoint.x;
            rect.y=jcomOriginPoint.y+incY;
            rect.width=jcomWidth+incX;
            rect.height=jcomHeight-incY;
            break;
        case RightBottom:
            rect.x=jcomOriginPoint.x;
            rect.y=jcomOriginPoint.y;
            rect.width=jcomWidth+incX;
            rect.height=jcomHeight+incY;
            break;
            ////////////////////////////////////////////
        case Top:
            rect.x=jcomOriginPoint.x;
            rect.y=jcomOriginPoint.y+incY;
            rect.width=jcomWidth;
            rect.height=jcomHeight-incY;
            break;
        case Bottom:
            rect.x=jcomOriginPoint.x;
            rect.y=jcomOriginPoint.y;
            rect.width=jcomWidth;
            rect.height=jcomHeight+incY;
            break;
        case Left:
            rect.x=jcomOriginPoint.x+incX;
            rect.y=jcomOriginPoint.y;
            rect.width=jcomWidth-incX;
            rect.height=jcomHeight;
            break;
        case Right://右缩放
            rect.x=jcomOriginPoint.x;
            rect.y=jcomOriginPoint.y;
            rect.width=jcomWidth+incX;
            rect.height=jcom.getHeight();
            break;
            ///////////////////////////////////////////////
        case Center://移动
            rect.x=jcomOriginPoint.x+incX;
            rect.y=jcomOriginPoint.y+incY;
            rect.width=jcom.getWidth();//防止出现恢复原大小问题。
            rect.height=jcom.getHeight();
            break;
        default:
            break;
        }
        jcom.setBounds(rect);
    }
    @Override
    public void mouseMoved(MouseEvent e)
    {
        pointMoved=e.getLocationOnScreen();
        jcom=(JComponent)e.getSource();//防止抖动关键在这一点
        jcomOriginPoint=jcom.getLocation();//获取组件在父窗口的位置
        jcomWidth=jcom.getWidth();
        jcomHeight=jcom.getHeight();  

        ///////////////////////////////////////////
        setCurType(e);
        //super.mouseMoved(e);
    }
    public void mouseDragged(MouseEvent e)
    {
        //相对于移动最后一点的增量
        setPosition(e);
        super.mouseDragged(e);
    }
}

解决方案

http://javapub.iteye.com/blog/739194

时间: 2024-12-30 23:26:28

java swing组件拖动和显示问题的相关文章

java swing 组件 图形-java swing组件上绘制直线同时添加组件后 的显示问题

问题描述 java swing组件上绘制直线同时添加组件后 的显示问题 说明:运行后,面板上自动画出14条直线,点击"添加"按钮,生成可以拖动的JTextField控件.问题(1)面板的背景色不显示,(2)拖动JTextField控件时有残影,(3)改变JFrame大小后,残影消失,但是只能显示JTextField控件的一部分.哪位高手指点下. import java.awt.*; import java.awt.event.*; import java.awt.Graphics; i

Java swing组件的串行化和读取

由于JButton和JTree都已经实现了Serializable接口,因此Java swing组件 的串行化和读取是可以做到的. 方法就是使用ObjectInputStream读取文件中的对象,使用 ObjectOutputStream把对象写入文件. 如: import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.I

java swing组件代码问题

问题描述 java swing组件代码问题 private void setupToolBar(){ toolBar = new JToolBar(); JButton button = null; addTool(toolBar,startAction); addTool(toolBar,stopAction); getContentPane().add(toolBar, BorderLayout.NORTH); } public void addTool(JToolBar toolBar,A

Java Swing 组件如何显示嵌套了svg的html?

问题描述 我用的是JavaSwing的JEditorPane组件,但是它只能显示html文件,如果嵌套了svg文件,那么svg文件那块就会显示问号,不能显示出来.如果是显示纯svg文件的话我也有办法,现在的问题就是如何在swing组件中显示嵌套了svg文件的html文件.能有什么办法解决这个问题吗? 谢谢! 解决方案 家里网络访问不了sourceforge的网站--.不然很想尝试在swing中嵌入浏览器哪个djproject,看看是否支持svg.我用JEditorPane时,使用底层的一些api

Java Swing组件全演示

一 抛砖引玉 本文指在利用一个小程序"Swing 组件大全"来引导大家学习Java这门语言,熟悉Java Swing的各个组件.并在学习过程中参考作者设计这一程序的方法和思想,最终形成自己的思维方式和学习方式.你能举一返三是作者最开心的事情.小程序演示了Java Swing大部分组件.最后附上了全部代码及详细的注释说明.希望本文能对大家学习Java有所帮助. 随着Java风潮席卷国内,学习Java的方法和路径越来越多.而在大量的书本前,在Java庞大的类库前大大家都有点迷失方向的感觉,

Java swing 进度条的显示问题

问题描述 最近在做一个C/S的通行软件,其中涉及到文件传输的功能,希望能够显示文件的上传进度,但是遇到一些问题无法解决:当传输文件时,进度条必须不断更新,但是Swing好像是单线程的,而且对Swing界面的更改不能在其他线程中进行(如果有错请指教),结果我现在的问题就是文件传输的过程中进度条不能更新,而且整个界面被阻塞,导致对界面无法进行其他操作,只有文件传输完成后才突然显示100%,下面贴出部分代码:包含进度条的类:publicclassTransmitBarextendsJPanel{pri

java swing实现简单图片显示(测试生成图片快捷方式)

package com.ts.x; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.net.URL; import java.util.Hashtable; import javax.swing.Icon; import javax.swing.ImageIcon; im

Java Swing 如何切换Jpanel显示内容,菜鸟请多指教

问题描述 想要实现点击一个类中的CHECKBOX或者list后,对应的jpanel会变成需要的界面.如:以下三个类,MainJframe是运行主类,--MainJFrame-JList-Jpanel恳请各位指教.

qq-关于java自定义swing组件的问题

问题描述 关于java自定义swing组件的问题 最近想用纯java写一个小程序,就是点击按钮将输入框的文字输出在上方的消息输出框,消息显示的样式就是类似于QQ聊天时的样子,把消息显示类似在QQ气泡上面 解决方案 JAVA Swing自定义JScorllPanel如何给Swing里组件自定义边框用Java Swing实现的自定义日历组件