角度材料选择模块在打开前获取事件

时间:2018-05-01 04:12:16

标签: angular angular-material angular-material2

目前,我知道protected void paintComponent(Graphics g) { super.paintComponent(g); Rectangle bounds = new Rectangle(0, 0, getWidth(), getHeight()); for (PaintableEntity paintable : paintableEntities) { Graphics2D g2d = (Graphics2D) g.create(); paintable.paint(g2d, this, bounds); g2d.dispose(); } } 模块中的事件import java.awt.Color; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.ImageObserver; import java.util.ArrayList; import java.util.List; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.Timer; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; public class Test { public static void main(String[] args) { new Test(); } /* You could have entities which can collide which have collision detection capabilities Some entities don't need to be painted and may provide things like visual or audio affects */ public interface Entity { } public interface MovableEntity extends Entity { public void update(Rectangle bounds); } public interface PaintableEntity extends Entity { public void paint(Graphics2D g2d, ImageObserver imageObserver, Rectangle bounds); } public Test() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { ex.printStackTrace(); } JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new GamePane()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class GamePane extends JPanel { // Could use a single list and filter it, but hay private List<PaintableEntity> paintableEntities; private List<MovableEntity> movableEntitys; private Timer mainLoop; public GamePane() { paintableEntities = new ArrayList<>(25); movableEntitys = new ArrayList<>(25); paintableEntities.add(new TrackEntity()); CarEntity car = new CarEntity(); paintableEntities.add(car); movableEntitys.add(car); mainLoop = new Timer(5, new ActionListener() { @Override public void actionPerformed(ActionEvent e) { Rectangle bounds = new Rectangle(0, 0, getWidth(), getHeight()); // Lots of collision detection and other awesome stuff for (MovableEntity entity : movableEntitys) { entity.update(bounds); } repaint(); } }); mainLoop.start(); } @Override public Dimension getPreferredSize() { return new Dimension(200, 200); } protected void paintComponent(Graphics g) { super.paintComponent(g); Rectangle bounds = new Rectangle(0, 0, getWidth(), getHeight()); for (PaintableEntity paintable : paintableEntities) { Graphics2D g2d = (Graphics2D) g.create(); paintable.paint(g2d, this, bounds); g2d.dispose(); } } } public class CarEntity implements PaintableEntity, MovableEntity { private int delta = 1; private int xDelta = 0; private int yDelta = delta; private int xPos = 2; private int yPos = 2; private int size = 4; @Override public void paint(Graphics2D g2d, ImageObserver imageObserver, Rectangle bounds) { g2d.translate(bounds.x, bounds.y); g2d.setColor(Color.RED); g2d.fillRect(xPos - size / 2, yPos - size / 2, size, size); } @Override public void update(Rectangle bounds) { xPos += xDelta; yPos += yDelta; if (xPos + (size / 2) > bounds.x + bounds.width) { xPos = bounds.x + bounds.width - (size / 2); xDelta = 0; yDelta = -delta; } else if (xPos - (size / 2) < bounds.x) { xPos = bounds.x + (size / 2); xDelta = 0; yDelta = delta; } if (yPos + (size / 2) > bounds.y + bounds.height) { yPos = bounds.y + bounds.height - (size / 2); xDelta = delta; yDelta = 0; } else if (yPos - (size / 2) < bounds.y) { yPos = bounds.y + (size / 2); xDelta = -delta; yDelta = 0; } } } public class TrackEntity implements PaintableEntity { @Override public void paint(Graphics2D g2d, ImageObserver imageObserver, Rectangle bounds) { g2d.translate(bounds.x, bounds.y); g2d.setColor(Color.BLUE); g2d.drawRect(2, 2, bounds.width - 4, bounds.height - 4); } } } 。但是,这只会在面板已经打开后触发。在面板打开之前,我需要一种挂钩模块的方法。我尝试过使用click事件处理程序,但是当你点击标签时,如果标签是浮动的,它就不起作用。

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

查看autocomplete example。在该示例中,选项是动态过滤的,但对于选择组件,您可以使用相同的方法动态创建选项。

答案 1 :(得分:0)

为了做我想做的,我设计了一个延迟/异步加载选择控件。

请参阅工作示例:https://stackblitz.com/edit/angular-mat-select-deferred-loading?file=app%2Fselect-deferred-example.ts

基本上,我在选择并获得所需的选项的同时,给选择项添加了一个带有加载微调器的临时虚拟选项,然后将它们分为选择项。