重拾JAVA之WinForm實戰之(五)

天氣逐漸變冷,老夫學習java的熱情不減。還記得第一篇文章中的主界面中顯示了一個比較可愛的登陸用戶的照片,今天咱們來看一下這個功能的實現以及添加系統參數界面的實現。java

215951405.png

Java主界面顯示以下sql

220036360.png

看着有些差別,是由於沒有精準的計算。不過這個沒關係,要緊的是實現。看一下登陸成功顯示主界面照片的代碼數據庫

private void Init() {
        this.SetLoginUserPhoto();
    }
    private void SetLoginUserPhoto() {
        String sql = "SELECT TOP(1) photo FROM UerInfo WHERE useno='"
                + FrmLogin.user.getUserNo() + "'";
        ResultSet res = JDBCSqlHelper.query(sql);
        try {
            res.next();
            byte[] byts = res.getBytes(1);
            if (byts.length == 0) {
                return;
            }
            Image img = java.awt.Toolkit.getDefaultToolkit().createImage(byts);
            ImageIcon ico = new ImageIcon(img);
            ico = new ImageIcon(ico.getImage().getScaledInstance(
                    internalFrame.getWidth(), internalFrame.getHeight(),
                    Image.SCALE_DEFAULT));
            this.labUserPhoto.setIcon(ico);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

從數據庫讀出圖片的byte數組,而後轉化爲Image,而後賦給jLabel。在轉化出來之後的圖片是原始圖片的大小,並不能縮放顯示在label中,因此咱們用代碼設置圖片的須要縮放的縮放比例。因爲圖片所在的label的外圍是一個JInternalFrame,因此這裏的高度和寬度去的是JInternalFrame的高和寬。這樣圖片就好看多了,作這些仍是要多查JDK API和google。數組

好了,接下來進行咱們的系統參數增長實現app

224204264.png

JAVA版的以下ide

221516737.png

這個界面比較簡單,清除按鈕的實現以下學習

private void ClearComponentContent() {
        txtCName.setText("");
        txtEname.setText("");
        txtRemark.setText("");
        txtData.setText("");
        txtDisplay.setText("");
    }

保存按鈕的邏輯以下ui

private void AddCode() {
        String ename = txtEname.getText().trim();
        String cname = txtCName.getText().trim();
        String data = txtData.getText().trim();
        String display = txtDisplay.getText().trim();
        String remark = txtRemark.getText().trim();
        if (!this.CheckInput(ename, cname, data, display, remark)) {
            return;
        }
        StringBuffer strBuffer = new StringBuffer();
        strBuffer
                .append("INSERT INTO dbo.Codes(ename,cname,data,display_content,remark) Values");
        strBuffer.append("('" + ename + "'");
        strBuffer.append(",'" + cname + "'");
        strBuffer.append(",'" + data + "'");
        strBuffer.append(",'" + display + "'");
        strBuffer.append(",'" + remark + "')");
        JDBCSqlHelper.update(strBuffer.toString());
        MessageHelper.ShowMessage("保存成功!");
        if (chkAutoClose.isSelected() != isAutoClosed) {
            ModifyConfig();
        }
                                                                                                                                                                                                                                                 
        if(chkAutoClose.isSelected()){
            this.WindowClose();
        }
    }

先check輸入,而後構造sql,完了以後判斷複選框的選擇和上次複選框的選擇若是不一致,修改配置文件,記錄該界面的複選框狀態。關於這個記錄複選框,咱們新增了一個配置文件this

221948925.png

OK,咱們看一下是如何修改這個配置來記錄是否保存完成自動關閉這個值的。google

private Element GetElementByName(String name) {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        dbf.setIgnoringElementContentWhitespace(true);
        DocumentBuilder db = null;
        Document doc = null;
        try {
            db = dbf.newDocumentBuilder();
            doc = db.parse(new File(xmlPath));
            Element root = doc.getDocumentElement();
            NodeList nodList = root.getElementsByTagName("AutoCloseFrm");
            for (int i = 0; i < nodList.getLength(); i++) {
                Node nd = nodList.item(i);
                Element elment = (Element) nd;
                String frmName = this.getClass().getSimpleName();
                if (elment.getAttribute("name").equals(frmName)) {
                    return elment;
                }
            }
        } catch (SAXException | IOException | ParserConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }
    private void ModifyConfig() {
        Element elment = this.GetElementByName(this.getClass().getSimpleName());
        if (elment != null) {
            elment.setAttribute("IsAutoClose",
                    chkAutoClose.isSelected() ? "true" : "false");
            this.writeToXml(elment.getOwnerDocument(), xmlPath);
        }
    }

你們都知道java中解析xml有好幾種方式,什麼DOM,JDOM,SAX,咱們仍是採用DOM吧,畢竟咋們的xml不大。OK,咱們先看下xml文件

<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<AutoCloseConfigs>
    <AutoCloseFrm IsAutoClose="true" name="FrmCodeAdd"/>
</AutoCloseConfigs>

在這個xml裏面,咱們可能會把AutoCloseFrm節點配置不少個,因此上面先獲取到AutoCloseFrm這個NodeList,而後循環遍歷,根據他的name屬性來找到對應的element。這裏的name對應着每一個頁面的JFrame的類名,本界面命名爲FrmCodeAdd.java。而後在modifyConfig中對其IsAutoClose屬性進行修改。修改完成以後,刷新數據到xml文件。

private void writeToXml(Document doc, String name) {
        try {
            OutputStream fileoutputStream = new FileOutputStream(name);
            TransformerFactory tFactory = TransformerFactory.newInstance();
            Transformer transformer = tFactory.newTransformer();
            transformer.setOutputProperty(OutputKeys.VERSION,
                    "yes");
            transformer.setOutputProperty(OutputKeys.METHOD, "xml");
            transformer.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1");
            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
            DOMSource source = new DOMSource(doc);
            StreamResult result = new StreamResult(fileoutputStream);
            transformer.transform(source, result);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

OK,這裏的一些SetOutputProperty是設置xml的格式以及編碼等。好了,這就是保存的整個邏輯。

那麼在初始化的時候,咱們會先拿出xml中的配置,進行初始化。

private void Init() {
        boolean isAutoClose = this.GetAutoCloseValue();
        this.chkAutoClose.setSelected(isAutoClose);
        isAutoClosed = isAutoClose;
    }
private boolean GetAutoCloseValue() {
        Element elment = this.GetElementByName(this.getClass().getSimpleName());
        if (elment != null) {
            boolean isAutoClose = Boolean.parseBoolean(elment
                    .getAttribute("IsAutoClose"));
            return isAutoClose;
        }
        return false;
    }

好了,今天的主要亮點仍是DOM解析xml,以及圖片所放顯示在Jlabel。雖然對於長期從事於java開發的人來講這可能不算什麼,可是我以爲初學者仍是能夠看的。好了,有什麼事加羣.net技術衝鋒舟,205217091。

相關文章
相關標籤/搜索