jinlin
2025-03-01 86f02fee03614fef275c6e0c355d73318ca3025e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
package com.example.client;
 
import com.example.client.service.*;
import com.teamdev.jxbrowser.chromium.*;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
 
 
import javax.imageio.ImageIO;
import javax.swing.*;
 
import javax.swing.tree.TreePath;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.math.BigInteger;
 
@Service
public class Main extends JFrame implements MouseListener {
    @Autowired
    private SetUIFontService setUIFontService;
    @Autowired
    private MenuService treeServise;
    private final JPopupMenu menu = new JPopupMenu();
    private Integer height;
    private Integer width;
    private JTree tree;
    @Value("${data.imgDir}")
    private String imgPath;
    JTabbedPane tabbedPane;
    JScrollPane scrollPane;
 
    static {
        try {
            Field e = ba.class.getDeclaredField("e");
            e.setAccessible(true);
            Field f = ba.class.getDeclaredField("f");
            f.setAccessible(true);
            Field modifersField = Field.class.getDeclaredField("modifiers");
            modifersField.setAccessible(true);
            modifersField.setInt(e, e.getModifiers() & ~Modifier.FINAL);
            modifersField.setInt(f, f.getModifiers() & ~Modifier.FINAL);
            e.set(null, new BigInteger("1"));
            f.set(null, new BigInteger("1"));
            modifersField.setAccessible(false);
            //UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e1) {
            e1.printStackTrace();
        }
 
    }
 
    public void Start(Integer role, Long userId) throws HeadlessException {
        //获取屏幕宽高
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        Rectangle rect = ge.getMaximumWindowBounds();
        width = rect.width;
        height = rect.height;
 
        Font font = new Font("宋体", Font.BOLD, 23);
        setUIFontService.setFont(font);
 
        try {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel");
        } catch (Exception e) {
            e.printStackTrace();
        }
 
        JPopupMenu.setDefaultLightWeightPopupEnabled(false);
        
        JFrame frame = new JFrame("进度跟踪");
        frame.setSize(width, height);
        frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        frame.setResizable(true);
        try {
            Image image = ImageIO.read(new File(imgPath + "/frame.png"));
            frame.setIconImage(image);
        } catch (IOException e) {
            e.printStackTrace();
        }
 
        JPanel jLeft = new JPanel(new FlowLayout(FlowLayout.LEFT));
        // 初始化标签页
        tabbedPane = new JTabbedPane();
        tabbedPane.setTabPlacement(JTabbedPane.TOP); // 标签页放置在顶部
 
        //JPanel jTop = new JPanel();
 
        JPanel jLeft_menu = new JPanel();
        //JPanel jLeft_file = new JPanel();
 
 
        int westWidth = width / 7;
        int topHeight = 40;
        int titleHeight = 60;
 
        jLeft.setPreferredSize(new Dimension(westWidth, height));
        jLeft.setLayout(null);
 
        jLeft_menu.setBounds(0, 0, westWidth, height);
 
        tree = treeServise.createTree(width - westWidth, height, frame);
 
        //tree.addMouseListener(this);
        // 创建滚动面板,包裹树(因为树节点展开后可能需要很大的空间来显示,所以需要用一个滚动面板来包裹)
        scrollPane = new JScrollPane(tree, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        scrollPane.setViewportView(tree);
 
        jLeft_menu.add(scrollPane, BorderLayout.WEST);
        // 添加滚动面板到那内容面板
        scrollPane.setPreferredSize(new Dimension(westWidth - 10, height - topHeight - titleHeight));
 
 
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        //frame.add(jTop, BorderLayout.NORTH);
        frame.add(jLeft, BorderLayout.WEST);
        frame.add(tabbedPane, BorderLayout.CENTER);
        jLeft.add(jLeft_menu);
        //jLeft.add(jLeft_file);
 
        JSplitPane hSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
        hSplitPane.setDividerLocation(westWidth);
 
        hSplitPane.setRightComponent(tabbedPane);
        hSplitPane.setDividerSize(10);
        hSplitPane.setOneTouchExpandable(true);
        hSplitPane.setContinuousLayout(true);
 
        frame.getContentPane().add(hSplitPane, BorderLayout.CENTER);
 
        JSplitPane vSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
        frame.getContentPane().add(vSplitPane, BorderLayout.WEST);
        vSplitPane.setDividerLocation(westWidth);
        vSplitPane.setLeftComponent(scrollPane);
        //vSplitPane.setRightComponent(scrolltable);
        vSplitPane.setDividerSize(10);
        vSplitPane.setOneTouchExpandable(true);
        vSplitPane.setContinuousLayout(true);
        hSplitPane.setLeftComponent(vSplitPane);
 
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
 
    @Override
    public void mouseClicked(MouseEvent e) {
 
    }
 
    public void mousePressed(MouseEvent e) {
        TreePath path = tree.getPathForLocation(e.getX(), e.getY()); // 关键是这个方法的使用
        tree.setSelectionPath(path);
        if (e.getButton() == 3) {
            menu.show(tree, e.getX(), e.getY());
        }
    }
 
    @Override
    public void mouseReleased(MouseEvent e) {
 
    }
 
    @Override
    public void mouseEntered(MouseEvent e) {
 
    }
 
    @Override
    public void mouseExited(MouseEvent e) {
 
    }
 
    public void showTab(String title, JPanel panel, JTree tree) {
        tabbedPane.addTab(title, panel);
        Component tabComponent = createTabComponent(title, tree);
        tabbedPane.setTabComponentAt(tabbedPane.getTabCount() - 1, tabComponent);// 设置自定义标签组件//切换到当前页面
        tabbedPane.setSelectedIndex(tabbedPane.getTabCount() - 1);
    }
 
    public Boolean isSelected(String title) {
        int index = tabbedPane.indexOfTab(title);
        if (index != -1) {
            tabbedPane.setSelectedIndex(index);
            return true;
        } else {
            return false;
        }
 
    }
 
    private Component createTabComponent(String title, JTree tree) {
        JPanel tabPanel = new JPanel(new BorderLayout());
        JLabel tabLabel = new JLabel("  " + title + "  ");
        JButton closeButton = new JButton("x");
 
        // 设置关闭按钮的样式
        closeButton.setOpaque(false);
        closeButton.setBorder(null);
        closeButton.setContentAreaFilled(false);
        closeButton.setFocusPainted(false);
        closeButton.setMargin(new Insets(0, 0, 0, 0));
        closeButton.setFont(new Font("Arial", Font.BOLD, 12));
 
 /*       // 鼠标悬停时显示关闭按钮
        MouseListener mouseListener = new MouseAdapter() {
            @Override
            public void mouseEntered(MouseEvent e) {
                closeButton.setVisible(true);
            }
 
            @Override
            public void mouseExited(MouseEvent e) {
                if (!closeButton.getBounds().contains(e.getPoint())) {
                    closeButton.setVisible(false);
                }
            }
        };*/
 
        //tabLabel.addMouseListener(mouseListener);
        //closeButton.addMouseListener(mouseListener);
 
        closeButton.addActionListener(e -> {
            int index = tabbedPane.indexOfTabComponent(tabPanel);
            if (index != -1) {
                tabbedPane.removeTabAt(index);
            }
            tree.getSelectionModel().clearSelection();
        });
 
        tabPanel.setOpaque(false);
        tabLabel.setOpaque(false);
        closeButton.setOpaque(false);
 
        tabPanel.add(tabLabel, BorderLayout.CENTER);
        tabPanel.add(closeButton, BorderLayout.EAST);
        return tabPanel;
    }
}