📄 serverlisttable.java
字号:
//int[] selected_rows = ( _server_manager.getServersCount() !=0 ) ? getSelectedRows() : new int[0]; //int[] selected_rows = getSelectedRows(); //for(int i : selected_rows) { // System.out.println("Index of selected row = " + i); // System.out.println("Row model index = " + convertRowIndexToModel(i)); // } // Server[] servers = getServersByIndexes(selected_rows); // for(Server server : servers) { // System.out.println(server); // } JPopupMenu popup_menu = null; switch( whichCondition() ) { case A : popup_menu = new JPopupMenu(); popup_menu.add(connect_to); popup_menu.add(disconnect); popup_menu.addSeparator(); popup_menu.add(add); popup_menu.add(remove_selected); popup_menu.add(remove_all); popup_menu.addSeparator(); popup_menu.add(copy_ed2k_links); popup_menu.add(paste_ed2k_links); popup_menu.addSeparator(); popup_menu.add(add_to_static_list); popup_menu.add(remove_from_static_list); // popup_menu.addSeparator(); // popup_menu.add(column_setup); popup_menu.addSeparator(); popup_menu.add(properties); break; case B : popup_menu = new JPopupMenu(); popup_menu.add(remove_selected); popup_menu.add(remove_all); popup_menu.add(add); popup_menu.add(disconnect); popup_menu.addSeparator(); popup_menu.add(copy_ed2k_links); popup_menu.add(paste_ed2k_links); popup_menu.addSeparator(); popup_menu.add(add_to_static_list); popup_menu.add(remove_from_static_list); // popup_menu.addSeparator(); // popup_menu.add(column_setup); break; case D : popup_menu = new JPopupMenu(); popup_menu.add(connect_to); popup_menu.addSeparator(); popup_menu.add(add); popup_menu.add(remove_selected); popup_menu.add(remove_all); popup_menu.addSeparator(); popup_menu.add(copy_ed2k_links); popup_menu.add(paste_ed2k_links); popup_menu.addSeparator(); popup_menu.add(add_to_static_list); popup_menu.add(remove_from_static_list); // popup_menu.addSeparator(); // popup_menu.add(column_setup); popup_menu.addSeparator(); popup_menu.add(properties); break; case E : popup_menu = new JPopupMenu(); popup_menu.add(remove_selected); popup_menu.add(add); popup_menu.add(remove_all); popup_menu.addSeparator(); popup_menu.add(copy_ed2k_links); popup_menu.add(paste_ed2k_links); popup_menu.addSeparator(); popup_menu.add(add_to_static_list); popup_menu.add(remove_from_static_list); // popup_menu.addSeparator(); // popup_menu.add(column_setup); break; case F : popup_menu = new JPopupMenu(); popup_menu.add(add); popup_menu.add(paste_ed2k_links); popup_menu.addSeparator(); popup_menu.add(column_setup); break; case G : popup_menu = new JPopupMenu(); popup_menu.add(remove_selected); popup_menu.add(add); popup_menu.add(remove_all); popup_menu.add(disconnect); popup_menu.addSeparator(); popup_menu.add(copy_ed2k_links); popup_menu.add(paste_ed2k_links); popup_menu.addSeparator(); popup_menu.add(add_to_static_list); popup_menu.add(remove_from_static_list); // popup_menu.addSeparator(); // popup_menu.add(column_setup); popup_menu.addSeparator(); popup_menu.add(properties); break; case H : popup_menu = new JPopupMenu(); popup_menu.add(remove_selected); popup_menu.add(add); popup_menu.add(remove_all); popup_menu.add(disconnect); popup_menu.addSeparator(); popup_menu.add(copy_ed2k_links); popup_menu.add(paste_ed2k_links); popup_menu.addSeparator(); popup_menu.add(add_to_static_list); popup_menu.add(remove_from_static_list); // popup_menu.addSeparator(); // popup_menu.add(column_setup); break; } // set enabled/disabled for static list commands Server[] selected_servers = getSelectedServers(); add_to_static_list.setEnabled(true); remove_from_static_list.setEnabled(true); boolean add_to_static_enabled = true; boolean remove_from_static_enabled = true; for(Server server : selected_servers) { if(server.isStatic()) { add_to_static_enabled = false; } else { remove_from_static_enabled = false; } } if( ( add_to_static_enabled == false ) && ( remove_from_static_enabled != false ) ) { add_to_static_list.setEnabled(false); } if( ( add_to_static_enabled != false ) && ( remove_from_static_enabled == false ) ) { remove_from_static_list.setEnabled(false); } popup_menu.show(e.getComponent(), e.getX(), e.getY()); } } } this.addMouseListener(new PopupListener()); packColumns(this,2); if(this.getModel().getRowCount() != 0 ) this.setRowSelectionInterval(0,0); } private enum ServersOp { MAKE_SELECTED_STATIC, MAKE_SELECTED_NON_STATIC, REMOVE_SELECTED_FROM_LIST, REMOVE_ALL_FROM_LIST, CONNECT_TO } private void executeSelectedServersOp(ServersOp operation) { final ServersOp foperation = operation; (new JMThread(new JMRunnable() { public void JMRun() { if(foperation == ServersOp.REMOVE_ALL_FROM_LIST) { _server_manager.clearServerList(); return; } Server[] selected_servers = getSelectedServers(); // if the foperation == ServersOp.CONNECT_TO we suppose that only one server is selected // that is located at selected_servers[0] if(foperation == ServersOp.CONNECT_TO) { try { _server_manager.connect(selected_servers[0]); } catch (Throwable t) { t.printStackTrace(); } } for(Server server : selected_servers) { switch( foperation ) { case MAKE_SELECTED_STATIC : if( !server.isStatic() ) server.setStatic(true); break; case MAKE_SELECTED_NON_STATIC : if( server.isStatic() ) server.setStatic(false); break; case REMOVE_SELECTED_FROM_LIST : _server_manager.removeServer(server); break; } } if( ( foperation == ServersOp.MAKE_SELECTED_STATIC ) || ( foperation == ServersOp.MAKE_SELECTED_NON_STATIC ) ) { try { _server_manager.storeServerList(); }catch(Throwable t) { t.printStackTrace(); } } } })).start(); } // we override the getSelectedRows from JTable because it returns the last selected rows when the table has 0 rows // if the JTable is cleared, it should return 0 selected rows, maybe a bug or my misunderstanding public int[] getSelectedRows() { return ( ( _server_manager.getServersCount() !=0 ) ? super.getSelectedRows() : new int[0] ); } private Server[] getServersByIndexes(int[] indexes) { //for(int index : indexes) { // System.out.println("Index=>" + index); //} Server[] result = new Server[indexes.length]; int k = 0; for(int i : indexes) { int j = 0; for(Server server : _server_manager.getServers()) { if( j == this.convertRowIndexToModel(i) ) { result[k++] = server; break; } ++j; } } //for(Server server : result) { // System.out.println(server); //} return result; } private boolean connectedServerIn(Server[] servers) { Server connected_server = _server_manager.getConnectedServer(); for(Server server : servers) { if( server == connected_server ) return true; } return false; } private Server[] getSelectedServers() { return getServersByIndexes( this.getSelectedRows() ); } /* * ------------------------------------------------------------------------------------ * | CONNECTED DISCONNECTED CONNECTED SELECTED * ------------------------------------------------------------------------------------ * ONE_SELECTED | A D G * | * MULTIPLE_SELECTED | B E H * | * VOID_LIST | * F * * | * * A,B,D,E,F,G,H - conditions * * - can't be * * Add Ac1 * Remove selected Ac2 * Remove all Ac3 * Copy ED2K Links Ac4 * Paste ED2K Links Ac5 * Connect Ac6 * Disconnect Ac7 * Column setup Ac8 * Properties Ac9 * * | Ac1 Ac2 Ac3 Ac4 Ac5 Ac6 Ac7 Ac8 Ac9 * -------------------------------------------------------------- * A | Yes Yes Yes Yes Yes Yes Yes Yes Yes * | * B | Yes Yes Yes Yes Yes - Yes Yes - * | * D | Yes Yes Yes Yes Yes Yes - Yes Yes * | * E | Yes Yes Yes Yes Yes - - Yes - * | * F | Yes - - - Yes - - Yes - * | * G | Yes Yes Yes Yes Yes - Yes Yes Yes * | * H | Yes Yes Yes Yes Yes - Yes Yes - * | */ private ConditionType whichCondition() { ServerManager _server_manager = ServerManagerFactory.getInstance(); Server connected_server = _server_manager.getConnectedServer(); int[] selected_rows = this.getSelectedRows(); Server[] servers = getServersByIndexes( selected_rows ); if( ( connected_server != null ) && ( selected_rows.length == 1 ) && ( servers[0] != connected_server ) ) return ConditionType.A; if( ( connected_server != null ) && ( selected_rows.length > 1 ) && ( !connectedServerIn(servers) ) ) return ConditionType.B; if( ( connected_server == null ) && ( selected_rows.length == 1) ) return ConditionType.D; if( ( connected_server == null ) && ( selected_rows.length > 1 ) ) return ConditionType.E; if( ( connected_server == null ) && ( this.getRowCount() == 0 ) ) return ConditionType.F; if( ( connected_server != null ) && ( selected_rows.length == 1 ) && ( servers[0] == connected_server ) ) return ConditionType.G; if( ( connected_server != null ) && ( selected_rows.length > 1 ) && ( connectedServerIn(servers) ) ) return ConditionType.H; return null; } private enum ConditionType { A, B, D, E, F, G, H } /** * @see http://jug.org.ua/wiki/display/JavaAlmanac/Packing+a+Column+of+a+JTable+Component */ public void packColumns(JTable table, int margin) { for (int c=0; c<table.getColumnCount(); c++) { packColumn(table, c, 2); } } // Sets the preferred width of the visible column specified by vColIndex. The column // will be just wide enough to show the column head and the widest cell in the column. // margin pixels are added to the left and right // (resulting in an additional width of 2*margin pixels). public void packColumn(JTable table, int vColIndex, int margin) { TableModel model = table.getModel(); DefaultTableColumnModel colModel = (DefaultTableColumnModel)table.getColumnModel(); TableColumn col = colModel.getColumn(vColIndex); int width = 0; // Get width of column header TableCellRenderer renderer = col.getHeaderRenderer(); if (renderer == null) { renderer = table.getTableHeader().getDefaultRenderer(); } Component comp = renderer.getTableCellRendererComponent( table, col.getHeaderValue(), false, false, 0, 0); width = comp.getPreferredSize().width; // Get maximum width of column data for (int r=0; r<table.getRowCount(); r++) { renderer = table.getCellRenderer(r, vColIndex); comp = renderer.getTableCellRendererComponent( table, table.getValueAt(r, vColIndex), false, false, r, vColIndex); width = Math.max(width, comp.getPreferredSize().width); } // Add margin width += 2*margin; // Set the width col.setPreferredWidth(width); } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -