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;
+ }
+
+}