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); 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);// 设置自定义标签组件//切换到当前页面 if (tabbedPane.getTabCount() > 5) { // 删除第一个标签 tabbedPane.removeTabAt(0); } 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; } }