長方形を描画するコードがいくつかあります。に長方形を描画しJPanel
、ウィジェットの境界をマークするために使用されます。ここで最初にコードを示します。その後、問題 cq を説明します。質問。
まず、WidgetDrawingPanel
を拡張するクラス ( ) がありますJPanel
。
public WidgetDrawingPanel(int width, int height) {
/*To make things visible at least*/
widgets.add(new Widget(10,10,100,100, WidgetType.TextField));
widgets.add(new Widget(50,50,100,200, WidgetType.TextField));
this.width = width;
this.height = height;
this.setBackground(Color.BLUE);
addListener(); //adds both MouseMotionListener and MouseListener
}
以下では、私が多くのことを参照ch
していることがわかります。これはCoordinateHolder
、マウスの動きの開始座標と現在の座標を保持する です。
private void addListener() {
this.addMouseMotionListener(new MouseMotionListener() {
@Override
public void mouseDragged(MouseEvent arg0) {
ch.currentX = arg0.getX();
ch.currentY = arg0.getY();
System.out.println("dragging " + ch.currentX + ","+ch.currentY);
WidgetDrawingPanel.this.repaint();
}
});
this.addMouseListener(new MouseListener() {
@Override
public void mouseReleased(MouseEvent event) {
ch.endX = event.getX();
ch.endY = event.getY();
try {
checkCoords();
} catch (OutsidePanelException e) {
e.printStackTrace();
JOptionPane.showMessageDialog(null, "drawn Outside Panel");
}
}
@Override
public void mousePressed(MouseEvent event) {
ch = new CoordinateHolder(event.getX(), event.getY());
}
});
}
そして最後にpaintComponent(Grapics)
方法です。loop throughWidgets
があり、実際には既に描画されていますRects
(x、y、w、h 属性) が、アプリケーションの描画部分では役に立たない情報がもう少しあります。マウスを離すたびに、CoordinateHolder
がウィジェットに変換され、 に追加されwidgets
ます。
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
System.out.println("Paint");
g.setColor(Color.BLUE);
g.fillRect(0, 0, width, height); //making the whole panel blue
g.setColor(Color.RED);
Graphics2D g2 = (Graphics2D)g;
g2.setStroke(new BasicStroke(3));
for (Widget w : widgets) {
g.drawRect(w.getX(), w.getY(), w.getW(), w.getH());
}
if (ch != null)
g.drawRect(ch.startX, ch.startY, ch.currentX - ch.startX, ch.currentY - ch.startY);
}
このコードは機能していますが、上記のコードはマウスのドラッグを継続的に更新するため、これは非常に非効率的で非効率的であると思わJPanel
れます。すぐに遅くなると思います。特に、ユーザーが大量の四角形を作成する場合 (図 3 に示すように、四角形も継続的に再描画されますpainComponent(Graphics)
)。
質問cq。問題
ユーザーが四角形をスムーズにドラッグできる、より優れたリソース消費の少ない方法はありますか?
Java の JFrame でこのドラッグ四角形への回答を読みましたが、その回答の作成者は私と同じようにやっているようです。しかし、繰り返しますが、それは非常に非効率的ですよね? または、コンピューターはコンポーネントを継続的に簡単に再描画できるはずであり、これは実際に有効なアプローチですか?