2015-07-06 7 views
0

Я хочу добавить MouseListener в класс, который расширяет JPanel. Listener ссылается на другой класс, в котором сам JPanel создается и добавляется в contentPane. Нажав мышь на JPanel, ее следует удалить. Он работает хорошо, но я не могу назвать repaint(), потому что мой удаляющий метод является статическим. Как я могу это решить?Добавить MouseListener со ссылкой на другой класс

Это расширенный класс:

public class PanelDraggable extends JPanel { 

public PanelDraggable() { 

    . 
    . 
    . 

    MouseInputAdapter closeMouseAdapter = new CloseMouseHandler(); 
    addMouseListener(closeMouseAdapter); 

} 


private class CloseMouseHandler extends MouseInputAdapter { 

     public void mouseClicked(MouseEvent e) { 

      TblManagement.RemoveTable(); 
     } 
} 

}

И в этом классе я хочу создать панель и удалить его:

public void AddTables() { 

    String dbShortName = combo.getSelectedItem().toString(); 
    String dbName = prop.get(dbNamesFile, dbShortName); 

    int x = 50; int y = 150; int width = 150; int height = 220; //set Size and location 

    int [] indices = tblList.getSelectedIndices(); 

    panel = new PanelDraggable [indices.length]; 

    for (int i = 0; i < indices.length ; i++) { 
     String tblName = tblList.getModel().getElementAt(i).toString(); 

     String sql = "SELECT `COLUMN_NAME` FROM `INFORMATION_SCHEMA`.`COLUMNS` WHERE "+ 
       "`TABLE_SCHEMA`='"+dbName+"' AND `TABLE_NAME`='"+tblName+"'"; 

     JList<?> columnslist = new JList<String>(); 
     columnslist.setModel(getListModel(dbName, sql, 1)); 
     JScrollPane sc = new JScrollPane(columnslist); 
     panel[i] = new PanelDraggable(x, y , width, height, tblName, sc); 

     MouseInputAdapter mousehandler = new TableMouseHandler(); 
     panel[i].addMouseListener(mousehandler); 

     mainPanel.add(panel[i]); 
     x+=15; 
     y+=20; 

    } 
    revalidate(); 
    repaint(); 
} 

private class TableMouseHandler extends MouseInputAdapter { 

     public void mouseEntered(MouseEvent e) { 

      removeComp = (JComponent) e.getComponent(); 
     } 
} 

public static void RemoveTable() { 

    mainPanel.remove(removeComp); 
} 

Спасибо за помощь.

+1

Трудно думать о том, как это сделать, потому что это не должно быть сделано. Статическая функция не должна напрямую изменять объект. Вы можете передать аргумент mainPanel и removeComp в RemoveTable, чтобы обойти это. – JDrost1818

+0

Если я не должен делать так, каковы другие возможности? – coo12

+0

Я скоро отправлю официальное сообщение. – JDrost1818

ответ

1

Вам нужно взять экземпляр класса TableManagement в качестве аргумента для каждой панели, так что вам не нужно делать это в статическом контексте. Кроме того, я удалил ненужные подклассы для ваших мыши-адаптеров, которые вы создавали, и создал их более приемлемым способом.

public class PanelDraggable extends JPanel { 

    public PanelDraggable (..., final TableManagement tblManagement) { 
     . 
     . 
     . 
     addMouseListener(new MouseAdapter() { 
      @Override 
      public void (MouseEvent e) { 
       tblManagement.removeTable(); 
      } 
     }); 

    } 
} 

Затем в TableManagement класса

public void AddTables() { 

    String dbShortName = combo.getSelectedItem().toString(); 
    String dbName = prop.get(dbNamesFile, dbShortName); 

    int x = 50; int y = 150; int width = 150; int height = 220; //set Size and location 

    int [] indices = tblList.getSelectedIndices(); 

    panel = new PanelDraggable [indices.length]; 

    for (int i = 0; i < indices.length ; i++) { 
     String tblName = tblList.getModel().getElementAt(i).toString(); 

     String sql = "SELECT `COLUMN_NAME` FROM `INFORMATION_SCHEMA`.`COLUMNS` WHERE "+ 
       "`TABLE_SCHEMA`='"+dbName+"' AND `TABLE_NAME`='"+tblName+"'"; 

     JList<?> columnslist = new JList<String>(); 
     columnslist.setModel(getListModel(dbName, sql, 1)); 
     JScrollPane sc = new JScrollPane(columnslist); 

     // There is an extra argument here. Whatever your 
     // mainPanel used to be in the static method 
     panel[i] = new PanelDraggable(x, y , width, height, tblName, sc, mainPanel); 
     panel[i].addMouseListener(new MouseAdapter() { 
      @Override 
      public void mouseEntered() { 
       removeComp = (JComponent) e.getComponent(); 
      } 
     }); 

     mainPanel.add(panel[i]); 
     x+=15; 
     y+=20; 

    } 
    revalidate(); 
    repaint(); 
} 

public void RemoveTable() { 
    this.remove(removeComp); 
} 

Side-Note: Вы должны смотреть на Java именования. Только классы имеют свой первый символ, капитализированный.

+0

спасибо, он отлично работает! – coo12

Смежные вопросы