diff --git a/README.md b/README.md index 05b9589..1f64b55 100644 --- a/README.md +++ b/README.md @@ -88,4 +88,8 @@ json文本折叠代码和着色 修正null不显示 2.1.4 -增加压缩按钮 \ No newline at end of file +增加压缩按钮 + +2.1.5 +替换为弹窗 +修复Mac下的背景色 \ No newline at end of file diff --git a/pom.xml b/pom.xml index 92b3e25..4b03b06 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ hi.chyl json - 2.1.4 + 2.1.5 HiJson diff --git a/src/main/java/hi/chyl/json/MainView.java b/src/main/java/hi/chyl/json/MainView.java index af689e2..e8fc0d8 100644 --- a/src/main/java/hi/chyl/json/MainView.java +++ b/src/main/java/hi/chyl/json/MainView.java @@ -24,6 +24,7 @@ import javax.swing.*; import javax.swing.event.ListDataEvent; +import javax.swing.event.TreeSelectionListener; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; @@ -179,7 +180,6 @@ public void actionPerformed(ActionEvent e) { int selIndex = getTabIndex(); if (selIndex >= 0) { tabDataModel.setText(selIndex, textField.getText()); - System.out.println("Modify HashCode : " + getTree(selIndex).hashCode() + " . TabTitle : " + textField.getText() + " !"); } } }); @@ -396,6 +396,7 @@ private void initTabbedContainer() { TabData tabData = newTabData("Welcome!", "This is a Tab!", null); tabDataModel = new DefaultTabDataModel(new TabData[]{tabData}); tabbedContainer = new TabbedContainer(tabDataModel, TabbedContainer.TYPE_EDITOR); + tabbedContainer.setForeground(new Color(238,238,238)); tabbedContainer.getSelectionModel().setSelectedIndex(0); tabbedContainer.setShowCloseButton(true); tabDataModel.addComplexListDataListener(new ComplexListDataListener() { @@ -419,7 +420,6 @@ public void intervalRemoved(ListDataEvent e) { JTree tree = getTree(tbArr[0]); if (tree != null) { jsonEleTreeMap.remove(tree.hashCode()); - System.out.println("Remove HashCode: " + tree.hashCode() + ". Close Tab: " + tbArr[0].getText() + " !"); } } } @@ -430,7 +430,6 @@ public void contentsChanged(ListDataEvent e) { tabbedContainer.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - //System.out.println("@@@:TabbedContainerActionCommand = "+e.getActionCommand()); if ("select".equalsIgnoreCase(e.getActionCommand())) { treePathLst.clear(); } @@ -536,14 +535,13 @@ private JTree newTree() { DefaultMutableTreeNode root = new DefaultMutableTreeNode("o-JSON"); DefaultTreeModel model = new DefaultTreeModel(root); JTree tree = new JTree(model); - tree.addTreeSelectionListener(new javax.swing.event.TreeSelectionListener() { + tree.addTreeSelectionListener(new TreeSelectionListener() { public void valueChanged(javax.swing.event.TreeSelectionEvent evt) { treeSelection(getTree(), getTable()); } }); setNodeIcon(tree); tree.addMouseListener(new TreeMouseListener(tree)); - System.out.println("New HashCode : " + tree.hashCode()); return tree; } @@ -562,7 +560,6 @@ private JTable newTable() { private void treeSelection(JTree tree, JTable table) { DefaultMutableTreeNode selNode = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent(); if (selNode == null) { - //System.out.println("jTree1ValueChanged:selNode is null"); return; } String col[] = {"key", "value"}; @@ -682,7 +679,6 @@ private void formatJson() { //创建树节点 JTree tree = getTree(); - System.out.println("Put HashCode : " + tree.hashCode() + " . TabTitle : " + getTabTitle() + " !"); jsonEleTreeMap.put(tree.hashCode(), jsonEle); DefaultMutableTreeNode root = Kit.objNode("JSON"); DefaultTreeModel model = (DefaultTreeModel) tree.getModel(); @@ -723,7 +719,6 @@ private void sortFormatJson() { //创建树节点 JTree tree = getTree(); - System.out.println("Put HashCode : " + tree.hashCode() + " . TabTitle : " + getTabTitle() + " !"); jsonEleTreeMap.put(tree.hashCode(), jsonEle); DefaultMutableTreeNode root = Kit.objNode("JSON"); DefaultTreeModel model = (DefaultTreeModel) tree.getModel(); @@ -760,7 +755,6 @@ private void zipFormatJson() { //创建树节点 JTree tree = getTree(); - System.out.println("Put HashCode : " + tree.hashCode() + " . TabTitle : " + getTabTitle() + " !"); jsonEleTreeMap.put(tree.hashCode(), jsonEle); DefaultMutableTreeNode root = Kit.objNode("JSON"); DefaultTreeModel model = (DefaultTreeModel) tree.getModel(); @@ -923,18 +917,8 @@ private void showMessageDialog(String title, String msg) { if (index >= 0) { msg = msg.substring(index + ex.length()); } - JDialog dlg = new JDialog(getFrame()); - dlg.setTitle(title); - dlg.setMinimumSize(new Dimension(350, 160)); - BorderLayout layout = new BorderLayout(); - dlg.getContentPane().setLayout(layout); - dlg.getContentPane().add(new JLabel("异常信息:"), BorderLayout.NORTH); - JTextArea ta = new JTextArea(); - ta.setLineWrap(true); - ta.setText(msg); - ta.setWrapStyleWord(true); - dlg.getContentPane().add(new JScrollPane(ta), BorderLayout.CENTER); - MainApp.getApplication().show(dlg); + ToolTips tip = new ToolTips(); + tip.setToolTip(title + "\n异常信息:" + msg); } //[start]自动调列宽 @@ -1352,7 +1336,6 @@ public String copySimilarPathKeyValue(TreeNode treeNode) { private String copyNodeContent(String path, boolean isFormat) { String str = ""; String arr[] = StringUtils.split(path, String.valueOf(dot)); - System.out.println("Get HashCode : " + tree.hashCode() + " . TabTitle : " + getTabTitle()); JsonElement obj = (JsonElement) jsonEleTreeMap.get(tree.hashCode()); if (arr.length > 1) { for (int i = 1; i < arr.length; i++) { diff --git a/src/main/java/hi/chyl/json/ToolTips.java b/src/main/java/hi/chyl/json/ToolTips.java new file mode 100644 index 0000000..05da032 --- /dev/null +++ b/src/main/java/hi/chyl/json/ToolTips.java @@ -0,0 +1,389 @@ +package hi.chyl.json; + +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Font; +import java.awt.GraphicsEnvironment; +import java.awt.Insets; +import java.awt.Rectangle; +import javax.swing.BorderFactory; +import javax.swing.Icon; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JTextArea; +import javax.swing.JWindow; +import javax.swing.border.EtchedBorder; + +public class ToolTips { + + // 气泡提示宽 + private int _width = 300; + + // 气泡提示高 + private int _height = 100; + + // 设定循环的步长 + private int _step = 30; + + // 每步时间 + private int _stepTime = 30; + + // 显示时间 + private int _displayTime = 3000; + + // 目前申请的气泡提示数量 + private int _countOfToolTip = 0; + + // 当前最大气泡数 + private int _maxToolTip = 0; + + // 在屏幕上显示的最大气泡提示数量 + private int _maxToolTipSceen; + + // 字体 + private Font _font; + + // 边框颜色 + private Color _bgColor; + + // 背景颜色 + private Color _border; + + // 消息颜色 + private Color _messageColor; + + // 差值设定 + int _gap; + + // 是否要求至顶(jre1.5以上版本方可执行) + boolean _useTop = true; + + /** + * 构造函数,初始化默认气泡提示设置 + */ + public ToolTips() { + // 设定字体 + _font = new Font("宋体", 0, 12); + // 设定边框颜色 + _bgColor = new Color(255, 255, 225); + _border = Color.BLACK; + _messageColor = Color.BLACK; + _useTop = true; + // 通过调用方法,强制获知是否支持自动窗体置顶 + try { + JWindow.class.getMethod("setAlwaysOnTop", + new Class[]{Boolean.class}); + } catch (Exception e) { + _useTop = false; + } + + } + + /** + * 重构JWindow用于显示单一气泡提示框 + */ + class ToolTipSingle extends JWindow { + private static final long serialVersionUID = 1L; + + private JLabel _iconLabel = new JLabel(); + + private JTextArea _message = new JTextArea(); + + public ToolTipSingle() { + initComponents(); + } + + private void initComponents() { + setSize(_width, _height); + _message.setFont(getMessageFont()); + JPanel externalPanel = new JPanel(new BorderLayout(1, 1)); + externalPanel.setBackground(_bgColor); + // 通过设定水平与垂直差值获得内部面板 + JPanel innerPanel = new JPanel(new BorderLayout(getGap(), getGap())); + innerPanel.setBackground(_bgColor); + _message.setBackground(_bgColor); + _message.setMargin(new Insets(4, 4, 4, 4)); + _message.setLineWrap(true); + _message.setWrapStyleWord(true); + // 创建具有指定高亮和阴影颜色的阴刻浮雕化边框 + EtchedBorder etchedBorder = (EtchedBorder) BorderFactory + .createEtchedBorder(); + // 设定外部面板内容边框为风化效果 + externalPanel.setBorder(etchedBorder); + // 加载内部面板 + externalPanel.add(innerPanel); + _message.setForeground(getMessageColor()); + innerPanel.add(_iconLabel, BorderLayout.WEST); + innerPanel.add(_message, BorderLayout.CENTER); + getContentPane().add(externalPanel); + } + + /** + * 动画开始 + */ + public void animate() { + new Animation(this).start(); + } + + } + + /** + * 此类处则动画处理 + */ + class Animation extends Thread { + + ToolTipSingle _single; + + public Animation(ToolTipSingle single) { + this._single = single; + } + + /** + * 调用动画效果,移动窗体坐标 + * + * @param posx + * @param startY + * @param endY + * @throws InterruptedException + */ + private void animateVertically(int posx, int startY, int endY) + throws InterruptedException { + _single.setLocation(posx, startY); + if (endY < startY) { + for (int i = startY; i > endY; i -= _step) { + _single.setLocation(posx, i); + Thread.sleep(_stepTime); + } + } else { + for (int i = startY; i < endY; i += _step) { + _single.setLocation(posx, i); + Thread.sleep(_stepTime); + } + } + _single.setLocation(posx, endY); + } + + /** + * 开始动画处理 + */ + public void run() { + try { + boolean animate = true; + GraphicsEnvironment ge = GraphicsEnvironment + .getLocalGraphicsEnvironment(); + Rectangle screenRect = ge.getMaximumWindowBounds(); + int screenHeight = (int) screenRect.height; + int startYPosition; + int stopYPosition; + if (screenRect.y > 0) { + animate = false; + } + _maxToolTipSceen = screenHeight / _height; + int posx = (int) screenRect.width - _width - 1; + _single.setLocation(posx, screenHeight); + _single.setVisible(true); + if (_useTop) { + _single.setAlwaysOnTop(true); + } + if (animate) { + startYPosition = screenHeight; + stopYPosition = startYPosition - _height - 1; + if (_countOfToolTip > 0) { + stopYPosition = stopYPosition + - (_maxToolTip % _maxToolTipSceen * _height); + } else { + _maxToolTip = 0; + } + } else { + startYPosition = screenRect.y - _height; + stopYPosition = screenRect.y; + + if (_countOfToolTip > 0) { + stopYPosition = stopYPosition + + (_maxToolTip % _maxToolTipSceen * _height); + } else { + _maxToolTip = 0; + } + } + + _countOfToolTip++; + _maxToolTip++; + + animateVertically(posx, startYPosition, stopYPosition); + Thread.sleep(_displayTime); + animateVertically(posx, stopYPosition, startYPosition); + + _countOfToolTip--; + _single.setVisible(false); + _single.dispose(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + } + + /** + * 设定显示的图片及信息 + * + * @param icon + * @param msg + */ + public void setToolTip(Icon icon, String msg) { + ToolTipSingle single = new ToolTipSingle(); + if (icon != null) { + single._iconLabel.setIcon(icon); + } + single._message.setText(msg); + single.animate(); + } + + /** + * 设定显示的信息 + * + * @param msg + */ + public void setToolTip(String msg) { + setToolTip(null, msg); + } + + /** + * 获得当前消息字体 + * + * @return + */ + public Font getMessageFont() { + return _font; + } + + /** + * 设置当前消息字体 + * + * @param font + */ + public void setMessageFont(Font font) { + _font = font; + } + + /** + * 获得边框颜色 + * + * @return + */ + public Color getBorderColor() { + return _border; + } + + /** + * 设置边框颜色 + * + * @param _bgColor + */ + public void setBorderColor(Color borderColor) { + this._border = borderColor; + } + + /** + * 获得显示时间 + * + * @return + */ + public int getDisplayTime() { + return _displayTime; + } + + /** + * 设置显示时间 + * + * @param displayTime + */ + public void setDisplayTime(int displayTime) { + this._displayTime = displayTime; + } + + /** + * 获得差值 + * + * @return + */ + public int getGap() { + return _gap; + } + + /** + * 设定差值 + * + * @param gap + */ + public void setGap(int gap) { + this._gap = gap; + } + + /** + * 获得信息颜色 + * + * @return + */ + public Color getMessageColor() { + return _messageColor; + } + + /** + * 设定信息颜色 + * + * @param messageColor + */ + public void setMessageColor(Color messageColor) { + this._messageColor = messageColor; + } + + /** + * 获得循环步长 + * + * @return + */ + public int getStep() { + return _step; + } + + /** + * 设定循环步长 + * + * @param _step + */ + public void setStep(int _step) { + this._step = _step; + } + + public int getStepTime() { + return _stepTime; + } + + public void setStepTime(int _stepTime) { + this._stepTime = _stepTime; + } + + public Color getBackgroundColor() { + return _bgColor; + } + + public void setBackgroundColor(Color bgColor) { + this._bgColor = bgColor; + } + + public int getHeight() { + return _height; + } + + public void setHeight(int height) { + this._height = height; + } + + public int getWidth() { + return _width; + } + + public void setWidth(int width) { + this._width = width; + } + +}