首页 > 代码库 > 图书管理系统总结——分辨率适应

图书管理系统总结——分辨率适应

界面设计基本容器和控件用法已经大致记录完毕,现在说一说有关高分辨率屏下适应Swing的方式

一、窗口大小,字体大小等的动态调整

1、获取当前屏幕的分辨率:

 //设置跟随分辨率变化窗口
    Toolkit kit = Toolkit.getDefaultToolkit();
    Dimension screenSize = kit.getScreenSize();
    private int screenHeight = (int) screenSize.getHeight();//获取垂直大小
    private int screenWidth = (int) screenSize.getWidth();//获取水平宽度信息
    private double enlargement_x=screenWidth/1920;//水平放大倍数
    private double enlargement_y=screenHeight/1080;//垂直放大倍数,用于适应不同分辨率乘以不同比例系数

2、JFrame窗口大小调整:

setSize(new Dimension(screenSize.width,screenSize.height));   

或者

setSize(new Dimension(screenSize.width,screenSize.height));//前两个参数是左上角位置,后两个是大小

3、相应的只要涉及绝对大小的都要乘以(1)中定义的放大倍数,比如  

setBounds(100,100,(int)( 1800*enlargement_x), (int)(1600*enlargement_y));//设置窗口大小

 又如:

BookTypeDescTxt.setFont(new Font("宋体", Font.PLAIN, 35*enlargement_x));//字体大小设置

 等等,大致方法如此。

二、JFrame窗口居中:

windowWidth = this.getWidth(); //获得当前窗口宽
windowHeight = this.getHeight(); //获得当前窗口高 this.setLocation(screenWidth / 2 - windowWidth / 2, screenHeight / 2 - windowHeight / 2);//设置窗口居中显示

三、关于JInternalFrame

由于这个内部窗口栏的标题栏不知道怎么改变大小,弃置不用,改用JFrame,这样就出现一个问题。如果关闭一个窗口就全部关闭了。采用如下方式:

setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);

表示静止关闭按钮。

setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);//释放当前窗口,不会关闭所有窗口

注:EXIT_ON_CLOSE是默认选项,按下关闭后执行

 System.exit(0);//关闭所有窗口

四、通知窗口的设计:

同样Swing中的

JOptionPane.showMessageDialog(null, "用户名不能为空","Attention", JOptionPane.INFORMATION_MESSAGE);

这一类通知窗口也不能用。太过封装的东西就是这一点不好,不好根据自己的需求改。我只好自己写了几个类

1、出现一段时间自动消失的消息提醒:

技术分享

 具体实现如下:

public class showMessageFrame extends javax.swing.JFrame {
    /**
     * 定义样式选择常量
     */
    public static final int NORMAL=0;
    public static final int NOTE=1;
   //获取当前屏幕分辨率
    Toolkit tk = Toolkit.getDefaultToolkit();
    Dimension screensize = tk.getScreenSize();
    int height = (int)screensize.getHeight();
    int width = (int)screensize.getWidth();
    private double enlargement_x=width/1920;
    private double enlargement_y=height/1080;
    //提示的消息内容
    private String str = null;
    private JLabel text;
    
    public showMessageFrame(Component c,String str,int color) {
        this.str = str;
        new Thread(new Runnable() {
            @Override
            public void run() {
                initGUI(c,color);
            }
        }).start();
    }
//绘制简易窗口
    private void initGUI(Component c,int color) {
        try {
            setUndecorated(true);
            setLocationRelativeTo(c);//设置窗口相对于指定组件的位置
            setVisible(true);
            setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
            {
                text = new JLabel("<html>" + str + "</html>", SwingConstants.CENTER);
                text.setFont(new Font("宋体",Font.BOLD, (int)(40*enlargement_x)));
                getContentPane().add(text, BorderLayout.CENTER);
                text.setBackground(new java.awt.Color(255, 251, 240));
//这里只设置了两种颜色式样,还可以设置更多
                switch(color)
                {
                  case NORMAL:
                    break;
                  case NOTE:
                      getContentPane().setBackground(Color.YELLOW);break;
                }
            }
//自动调整窗口大小
            pack();
 //延时
            try {
                Thread.sleep(3000);//运行3000ms
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }
            dispose();//释放由此 Window、其子组件及其拥有的所有子组件所使用的所有本机屏幕资源
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

使用时候如下:

showMessageFrame note=new showMessageFrame(null,"\n密码不能为空\n",showMessageFrame.NOTE);

2、一般的提示窗口:

技术分享

public class Dialogutil extends JDialog implements ActionListener{
//获取分辨率
     Toolkit tk = Toolkit.getDefaultToolkit();
      Dimension screensize = tk.getScreenSize();
      int height = (int)screensize.getHeight();
      int width = (int)screensize.getWidth();
      private double enlargement_x=width/1920;
      private double enlargement_y=height/1080;
      private JTextField MassageTXt;
      private JButton confirmJb = new JButton();
      
        /**
         * 构造函数,第一个参数为父窗体,第二个参数为对话框标题,第三个参数为所显示的信息
         */
      public  Dialogutil(JFrame prentFrame, String title,String inform) {
            //
           // 调用父类的构造函数,           
            super(prentFrame, title, false);
            int Txtsize=inform.length();
            setTitle(title);
          //建立中间容器
            JPanel contentPane = new JPanel();
            setContentPane(contentPane);
   //放置相应的控件         
            MassageTXt = new JTextField();
            MassageTXt.setEditable(false);
            MassageTXt.setBackground(UIManager.getColor("menu"));
            MassageTXt.setFont(new Font("华文行楷", Font.PLAIN, 35));
            MassageTXt.setText(inform);//具体内容参数传递
            MassageTXt.setColumns(10);
            
            confirmJb = new JButton("\u786E\u8BA4");
            confirmJb.addActionListener(this);
            confirmJb.setFont(new Font("宋体", Font.PLAIN, 35));
            GroupLayout gl_contentPane = new GroupLayout(contentPane);
            gl_contentPane.setHorizontalGroup(
                gl_contentPane.createParallelGroup(Alignment.LEADING)
                    .addGroup(gl_contentPane.createSequentialGroup()
                        .addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING)
                            .addGroup(gl_contentPane.createSequentialGroup()
                                .addGap(123)
                                .addComponent(MassageTXt, GroupLayout.PREFERRED_SIZE,(int)(Txtsize*35*enlargement_x), GroupLayout.PREFERRED_SIZE))
                            .addGroup(gl_contentPane.createSequentialGroup()
                                .addGap(123+(int)(Txtsize/2.7*35*enlargement_x))//置于中间
                                .addComponent(confirmJb)))
                        .addContainerGap(123, Short.MAX_VALUE))
            );
            gl_contentPane.setVerticalGroup(
                gl_contentPane.createParallelGroup(Alignment.LEADING)
                    .addGroup(gl_contentPane.createSequentialGroup()
                        .addGap(55)
                        .addComponent(MassageTXt, GroupLayout.PREFERRED_SIZE, 65, GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(ComponentPlacement.RELATED, 35, Short.MAX_VALUE)
                        .addComponent(confirmJb)
                        .addContainerGap())
            );
            //MassageTXt.setBorder(new LineBorder(new Color(127, 157, 185)));
            MassageTXt.setBorder(new EmptyBorder(0,0,0,0));
            contentPane.setLayout(gl_contentPane);
            setBounds((int)(width / 2-180* enlargement_x),height/2,558,318);
            // 调整对话框布局大小
            pack();    
            setVisible(true);     
        }
        /**
         * 确定按钮事件处理
         */
        @Override
        public void actionPerformed(ActionEvent event)
        {    
            Object source = event.getSource();         
            if ((source == confirmJb))
            {
                setVisible(false);
                dispose();
             return;
            }            
        }
    }

使用方法如下:

Dialogutil attention=new Dialogutil(null,"Attention!","用户信息获取失败!");

3、确认窗口

这个最麻烦,需要将确认消息状态返回(确认还是取消)。由于主界面是一次生成的,不能在打开窗口后立刻赋值,那样主界面中得到的就是初始值。所以必须要开一个线程,等待放回参数。没有想到什么好方法,只能用比较笨的方法。

生成窗口:

public class ShowConfirmDialog extends JDialog implements ActionListener {
//获取分辨率
   Toolkit tk = Toolkit.getDefaultToolkit();
    Dimension screensize = tk.getScreenSize();
    int height = (int)screensize.getHeight();
    int width = (int)screensize.getWidth();
    private double enlargement_x=width/1920;
    private double enlargement_y=height/1080;
    
    JButton setButton; //确定 
    JButton denyButton;//否定
    JButton cancelButton;//取消

    private int result;//返回按什么按钮:是-0;否-1;取消-2
  
    ShowConfirmDialog()
    {
        result=-1;        
    }
    /**
     * 确认框
     * @param prentFrame 父类容器
     * @param title   标题
     * @param inform  提示信息
     */
    public  ShowConfirmDialog(JFrame prentFrame,String title , String inform)
    {
        
        // 调用父类的构造函数,
        super(prentFrame, title, false); // 第三个参数用false表示允许激活其他窗体。为true表示不能够激活其他窗体       
        result=-1;//一定要赋初值以示区分
        //开启一个线程
        new Thread(new Runnable(){
            @Override
            public void run() {
//                synchronized(this)
//                {
                  initGUI(inform);
//                }
            }
        }).start();
    }
//窗口界面设置    
    private void initGUI(String inform)
    {
         //建立中间容器
        JPanel contentPane = new JPanel();
        setContentPane(contentPane);
        contentPane.setLayout(new BorderLayout());//主容器用borderlayout
        
         // 添加Label和输入文本框
        JPanel p1 = new JPanel();
        p1.setLayout(new FlowLayout(FlowLayout.CENTER)); 
        contentPane.add(p1, "Center");
        JLabel label = new JLabel(inform);
        label.setFont(new Font("宋体", Font.PLAIN, 35));
        setBounds((int)(width / 2-180* enlargement_x),height/2,
                (int)(640*enlargement_x),(int)(320*enlargement_y));
        p1.add(label);
        
        //添加按钮
        JPanel p2 = new JPanel();
        p2.setLayout(new FlowLayout(FlowLayout.CENTER));  
        contentPane.add(p2, "South");
        
        setButton = new JButton("确 定");        
        setButton.setFont( new Font("宋体", Font.PLAIN,(int)(20*enlargement_x)) );
        
        setButton.setPreferredSize(new Dimension((int)(85*enlargement_x),(int)(40*enlargement_y)));
        p2.add(setButton);
        
        denyButton = new JButton("否定");
        denyButton.setFont( new Font("宋体", Font.PLAIN,(int)(20*enlargement_x)) );
       
        denyButton.setPreferredSize(new Dimension((int)(85*enlargement_x),(int)(40*enlargement_y)));
        p2.add(denyButton);    
        
        cancelButton = new JButton("取消");
        cancelButton.setFont( new Font("宋体", Font.PLAIN,(int)(20*enlargement_x)) );
       
        cancelButton.setPreferredSize(new Dimension((int)(85*enlargement_x),(int)(40*enlargement_y)));
        p2.add(cancelButton);            
        // 调整对话框布局大小
        pack();
        setVisible(true);  
        setButton.addActionListener(this);//关联动作
        denyButton.addActionListener(this);//关联动作
        cancelButton.addActionListener(this);//关联动作
    }
    /**
     * 事件处理
     */
    @Override
    public void actionPerformed(ActionEvent event) {    
        Object source = event.getSource();         
        if ((source == setButton))
        {
            this.result=0;//确定返回0
            dispose();
            return;
        }  
        else if(source==denyButton)
        {
            this.result=1;//否返回1
            dispose();
            return;
        }        
        else
        {
            this.result=2;//取消返回2
            dispose();
            return;
        }
    }

调用时候开一个线程,等待返回参数:

ShowConfirmDialog confrm=new ShowConfirmDialog(null,"提示","是否退出系统");
                    new Thread(
                        new Runnable() {                             
                            @Override
                        public void run(){
                            do
                            {
                                try {
                                    Thread.sleep(10);//等待,直到按钮被按下
                                } catch (InterruptedException e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                }
                            }while(confrm.getResult()==-1);                            
                    if(confrm.getResult()==0)
                          {
                          //确认按钮按下,该干啥干啥
                            } catch (Exception e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }                                                       
                          }        
                }                        
            }).start();

五、一些边框调整:

 // 设置文本域边框
        BookDescTxt.setBorder(new LineBorder(new Color(127, 157, 185)));

带标题的Jpanel标题的子体设置

//修改表头大小和字体大小
            BookSearchJT.getTableHeader().setPreferredSize(new Dimension((int)(1*enlargement_x),(int)(40*enlargement_y)));//标题栏大小
            BookSearchJT.getTableHeader().setFont(new Font("宋体", Font.PLAIN, (int)(35*enlargement_y)));//字体大小
            BookSearchJT.setRowHeight((int)(80*enlargement_y));

然后各大控件基本都有setFont(new Font("宋体", Font.PLAIN, 35));方法设置字体大小。

图书管理系统总结——分辨率适应