package com.jdhr.view;import java.awt.BorderLayout;
import java.awt.Cursor;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTable;
import javax.swing.SwingConstants;import com.jdhr.model.UserModel;public class MainWindows extends JFrame implements ActionListener,MouseListener
{
JMenu jm1, jm2, jm3, jm4, jm5, jm6, jm7, jm8;
JMenuItem jmi1, jmi2, jmi3;
JMenuBar jmb;
JPanel jp1, jp2, jp3,jp4;
JLabel jl1, jl2;
JScrollPane jsp1;
JSplitPane jsp;
JTable jt;
JButton jb1,jb2,jb3,jb4;
UserModel um;
Cursor cs;
Font font = new Font("微软雅黑", Font.PLAIN, 36);
Font font2 = new Font("微软雅黑", Font.PLAIN, 14);
int w = Toolkit.getDefaultToolkit().getScreenSize().width;
int h = Toolkit.getDefaultToolkit().getScreenSize().height;
int w1 = (int) (w * 0.08); public static void main(String[] args)
{
new MainWindows();
} // 菜单栏
public void MainMenu()
{
jm1 = new JMenu("国家机构");
jm1.setFont(font2);
jmi1 = new JMenuItem("新增(N)");
jmi1.setFont(font2);
jmi2 = new JMenuItem("合并(U)");
jmi2.setFont(font2);
jmi3 = new JMenuItem("撤销(R)");
jmi3.setFont(font2);
jm1.add(jmi1);
jm1.add(jmi2);
jm1.add(jmi3);
jm2 = new JMenu("人员管理");
jm2.setFont(font2);
jm3 = new JMenu("合同管理");
jm3.setFont(font2);
jm4 = new JMenu("人事异动");
jm4.setFont(font2);
jm5 = new JMenu("培训管理");
jm5.setFont(font2);
jm6 = new JMenu("绩效管理");
jm6.setFont(font2);
jm7 = new JMenu("考勤休假");
jm7.setFont(font2);
jm8 = new JMenu("薪酬管理");
jm8.setFont(font2); jmb = new JMenuBar(); jmb.add(jm1);
jmb.add(jm2);
jmb.add(jm3);
jmb.add(jm4);
jmb.add(jm5);
jmb.add(jm6);
jmb.add(jm7);
jmb.add(jm8);
this.setJMenuBar(jmb);
} // 主面板
public void MainPanel()
{
cs = new Cursor(Cursor.HAND_CURSOR); jp1 = new JPanel();
jp1.setLayout(new GridLayout(5, 1));

jl1 = new JLabel("国家管理",SwingConstants.CENTER);
jl1.setCursor(cs);
jl1.setEnabled(false);
jl1.addMouseListener(this); jl2 = new JLabel("人员管理",SwingConstants.CENTER);
jl2.setCursor(cs);
jl2.setEnabled(false);
jl2.addMouseListener(this); jp1.add(jl1);
jp1.add(jl2);
jt = new JTable();

jsp1 = new JScrollPane(jt);
jsp1.setSize(800, 600);
jp3 = new JPanel(new BorderLayout());

jp3.add(jsp1);
jsp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, jp1, jp3);
jsp.setEnabled(false);
jsp.setDividerSize(5);
jsp.setDividerLocation(w1);
this.add(jsp);

jp4 = new JPanel();
jb1 = new JButton("添加");
jb1.addActionListener(this);
jb2 = new JButton("修改");
jb2.addActionListener(this);
jb3 = new JButton("删除");
jb3.addActionListener(this);
jp4.add(jb1);
jp4.add(jb2);
jp4.add(jb3);
this.add(jp4,"South");

} // 主方法
public MainWindows()
{
this.MainPanel();
this.MainMenu();
this.setTitle("灰太郎管理系统"); Image image = Toolkit.getDefaultToolkit().createImage("/image/htl.jpg");
this.setIconImage(image);
this.setSize(w , h  - 28);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
} @Override
public void actionPerformed(ActionEvent e)
{ } @Override
public void mouseClicked(MouseEvent e)
{
if (e.getSource() == jl1)
{
String sql = "select * from nation";
String[] pars = {};
um = new UserModel();
um.queryNation(sql, pars);
jt.setModel(um);
}
else if (e.getSource() == jl2)
{
String sql = "select * from heros order by heroid";
String[] pars = {};
um = new UserModel();
um.queryHeros(sql, pars);
jt.setModel(um);
} } @Override
public void mouseEntered(MouseEvent e)
{
if (e.getSource() == jl1)
{
jl1.setEnabled(true);
jl1.setCursor(cs); }
else if (e.getSource() == jl2)
{
jl2.setEnabled(true);
jl2.setCursor(cs);
} } @Override
public void mouseExited(MouseEvent e)
{
if (e.getSource() == jl1)
{
jl1.setEnabled(false);
jl1.setCursor(cs);
}
else if (e.getSource() == jl2)
{
jl2.setEnabled(false);
jl2.setCursor(cs);
} } @Override
public void mousePressed(MouseEvent e)
{
// TODO Auto-generated method stub } @Override
public void mouseReleased(MouseEvent e)
{
// TODO Auto-generated method stub }}
问题:当光标移动到jl1和jl2上面时,并没有出现手的形状,这是怎么回事
该怎样处理

解决方案 »

  1.   

    解决方法是把这样一行给注解掉jsp.setEnabled(false);
    原因就是jl1 jl2都被加入到jp1当中,而jp1又被加入到jsp这样一个分割面板当中,而你把jsp.setEnabled(false),导致jl1 jl2的光标效果不起作用。另外,建议你把鼠标侦听里面的设置光标的代码去掉,完全冗余,就在最开始jl1 jl2设置一次 jl1.setCursor(cs); jl2.setCursor(cs);就能解决问题
      

  2.   

    public void mouseEntered(MouseEvent e)
        {
            if (e.getSource() == jl1)
            {
                jl1.setEnabled(true);
                jl1.setCursor(cs);        }
      public void mouseExited(MouseEvent e)
        {
            if (e.getSource() == jl1)
            {
                jl1.setEnabled(false);
                jl1.setCursor(cs);
            }
    纯属多次一举。你鼠标不进入这个控件的范围,你再怎么设置也看不到。
    直接在构造函数或者其他初始化方法中设置,就可以了
      

  3.   

    那只能你自己基础SWING的JSplitPane自己实现你想要既能setEnable(false),又能让光标变形的效果了,这个难度我想非常大,需要看懂很多SWING代码,沿着这个思路,CSDN估计没人能做到。想要固定分隔条,那需要让窗口都得固定才行,否则拖动右边窗口就会很明显挤压空间,导致右边的主区域无法正常显示(为了保持分隔条是固定),因此我有必要提醒你,这个固定的想法是否符合SWING编程的现实。要么你就放弃用JSplitPane分割面板的方式,用BordLayout或者GridBagLayout的方法。
      

  4.   

    我寻找了一种折中的解决方案,代码贴出来,你试一下可不可以
    import java.awt.BorderLayout;
    import java.awt.Cursor;
    import java.awt.Dimension;
    import java.awt.Font;
    import java.awt.GridLayout;
    import java.awt.Image;
    import java.awt.Toolkit;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JMenu;
    import javax.swing.JMenuBar;
    import javax.swing.JMenuItem;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JSplitPane;
    import javax.swing.JTable;
    import javax.swing.SwingConstants;import com.jdhr.model.UserModel;
    public class MainWindows extends JFrame implements ActionListener,MouseListener
    {
        JMenu jm1, jm2, jm3, jm4, jm5, jm6, jm7, jm8;
        JMenuItem jmi1, jmi2, jmi3;
        JMenuBar jmb;
        JPanel jp1, jp2, jp3,jp4;
        JLabel jl1, jl2;
        JScrollPane jsp1;
        JSplitPane jsp;
        JTable jt;
        JButton jb1,jb2,jb3,jb4;
        UserModel um;
        Cursor cs;
        Font font = new Font("微软雅黑", Font.PLAIN, 36);
        Font font2 = new Font("微软雅黑", Font.PLAIN, 14);
        int w = Toolkit.getDefaultToolkit().getScreenSize().width;
        int h = Toolkit.getDefaultToolkit().getScreenSize().height;
        int w1 = (int) (w * 0.08);
        
        float weight=0.2f;//ioe_gaoyong添加
            public static void main(String[] args)
        {
            new MainWindows();
        }    // 菜单栏
        public void MainMenu()
        {
            jm1 = new JMenu("国家机构");
            jm1.setFont(font2);
            jmi1 = new JMenuItem("新增(N)");
            jmi1.setFont(font2);
            jmi2 = new JMenuItem("合并(U)");
            jmi2.setFont(font2);
            jmi3 = new JMenuItem("撤销(R)");
            jmi3.setFont(font2);
            jm1.add(jmi1);
            jm1.add(jmi2);
            jm1.add(jmi3);
            jm2 = new JMenu("人员管理");
            jm2.setFont(font2);
            jm3 = new JMenu("合同管理");
            jm3.setFont(font2);
            jm4 = new JMenu("人事异动");
            jm4.setFont(font2);
            jm5 = new JMenu("培训管理");
            jm5.setFont(font2);
            jm6 = new JMenu("绩效管理");
            jm6.setFont(font2);
            jm7 = new JMenu("考勤休假");
            jm7.setFont(font2);
            jm8 = new JMenu("薪酬管理");
            jm8.setFont(font2);        jmb = new JMenuBar();        jmb.add(jm1);
            jmb.add(jm2);
            jmb.add(jm3);
            jmb.add(jm4);
            jmb.add(jm5);
            jmb.add(jm6);
            jmb.add(jm7);
            jmb.add(jm8);
            this.setJMenuBar(jmb);
        }    // 主面板
        public void MainPanel()
        {
            cs = new Cursor(Cursor.HAND_CURSOR);        jp1 = new JPanel();
            jp1.setLayout(new GridLayout(5, 1));
            
            jl1 = new JLabel("国家管理",SwingConstants.CENTER);
            jl1.setCursor(cs);
            jl1.setEnabled(false);
            jl1.addMouseListener(this);        jl2 = new JLabel("人员管理",SwingConstants.CENTER);
            jl2.setCursor(cs);
            jl2.setEnabled(false);
            jl2.addMouseListener(this);        jp1.add(jl1);
            jp1.add(jl2);
            
            
            jt = new JTable();
            
            jsp1 = new JScrollPane(jt);
            jsp1.setSize(800, 600);
            jp3 = new JPanel(new BorderLayout());
            
            jp3.add(jsp1);
            
            //ioe_gaoyong 添加
            int a=(int)(w*weight);
            jp1.setMinimumSize(new Dimension((int)(w*weight),500));
            jp3.setMinimumSize(new Dimension(w-a-10,500));
            //添加结束
            
            jsp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, jp1, jp3);
            //这行代码导致了光标效果不能看到
    //        jsp.setEnabled(false);
            jsp.setDividerSize(5);
            jsp.setDividerLocation(w1);//这行代码根本没起任何作用,建议删掉
            this.add(jsp);
            
            jp4 = new JPanel();
            jb1 = new JButton("添加");
            jb1.addActionListener(this);
            jb2 = new JButton("修改");
            jb2.addActionListener(this);
            jb3 = new JButton("删除");
            jb3.addActionListener(this);
            jp4.add(jb1);
            jp4.add(jb2);
            jp4.add(jb3);
            this.add(jp4,"South");
            
        }    // 主方法
        public MainWindows()
        {
            this.MainPanel();
            this.MainMenu();
            this.setTitle("灰太郎管理系统");        Image image = Toolkit.getDefaultToolkit().createImage("/image/htl.jpg");
            this.setIconImage(image);
            this.setSize(w , h  - 28);
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            this.setVisible(true);        jsp.setDividerLocation(weight);//added by ioe_gaoyong
        }    @Override
        public void actionPerformed(ActionEvent e)
        {    }    @Override
        public void mouseClicked(MouseEvent e)
        {
            if (e.getSource() == jl1)
            {
                String sql = "select * from nation";
                String[] pars = {};
                um = new UserModel();
                um.queryNation(sql, pars);
                jt.setModel(um);
            }
            else if (e.getSource() == jl2)
            {
                String sql = "select * from heros order by heroid";
                String[] pars = {};
                um = new UserModel();
                um.queryHeros(sql, pars);
                jt.setModel(um);
            }    }    @Override
        public void mouseEntered(MouseEvent e)
        {
            if (e.getSource() == jl1)
            {
                jl1.setEnabled(true);
                jl1.setCursor(cs);        }
            else if (e.getSource() == jl2)
            {
                jl2.setEnabled(true);
                jl2.setCursor(cs);
            }    }    @Override
        public void mouseExited(MouseEvent e)
        {
            if (e.getSource() == jl1)
            {
                jl1.setEnabled(false);
                jl1.setCursor(cs);
            }
            else if (e.getSource() == jl2)
            {
                jl2.setEnabled(false);
                jl2.setCursor(cs);
            }    }    @Override
        public void mousePressed(MouseEvent e)
        {
            // TODO Auto-generated method stub    }    @Override
        public void mouseReleased(MouseEvent e)
        {
            // TODO Auto-generated method stub    }}
    其原理是设置组件的最小大小,如果JSplitPane的左右两个组件加上分隔条的最小大小就充满屏幕,那么分隔条也不能被用户移动了,加了四五行代码,在注释当中标记了