JInternalFrameのリサイズ中に表示されるアウトラインを点線に変更する
Total: 951
, Today: 2
, Yesterday: 0
Posted by aterai at
Last-modified:
概要
JInternalFrame
のリサイズ中に表示されるアウトラインを色反転の直線から点線に変更してJLayer
上に描画します。
Screenshot
Advertisement
サンプルコード
Rectangle rubberBand = new Rectangle();
JDesktopPane desktop = new JDesktopPane();
desktop.setDesktopManager(new DefaultDesktopManager() {
@Override public void beginResizingFrame(JComponent f, int direction) {
desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);
super.beginResizingFrame(f, direction);
}
@Override public void resizeFrame(JComponent f, int newX, int newY, int newWidth, int newHeight) {
if (desktop.getDragMode() == JDesktopPane.OUTLINE_DRAG_MODE) {
super.resizeFrame(f, newX, newY, 0, 0);
rubberBand.setBounds(newX, newY, newWidth, newHeight);
desktop.repaint();
} else {
super.resizeFrame(f, newX, newY, newWidth, newHeight);
}
}
@Override public void endResizingFrame(JComponent f) {
desktop.setDragMode(JDesktopPane.LIVE_DRAG_MODE);
if (!rubberBand.isEmpty()) {
super.resizeFrame(f, rubberBand.x, rubberBand.y, rubberBand.width, rubberBand.height);
rubberBand.setBounds(0, 0, 0, 0);
}
super.endResizingFrame(f);
}
});
add(new JLayer<>(desktop, new LayerUI<JDesktopPane>() {
@Override public void paint(Graphics g, JComponent c) {
super.paint(g, c);
if (c instanceof JLayer) {
JDesktopPane desktop = (JDesktopPane) ((JLayer<?>) c).getView();
if (desktop.getDragMode() == JDesktopPane.OUTLINE_DRAG_MODE) {
Graphics2D g2 = (Graphics2D) g.create();
g2.setPaint(Color.GRAY);
g2.setStroke(makeDotStroke());
g2.draw(rubberBand);
g2.dispose();
}
}
}
}));
View in GitHub: Java, Kotlin解説
DefaultDesktopManager#beginResizingFrame(...)
をオーバーライドしてJInternalFrame
のリサイズが開始されたらドラッグスタイルをJDesktopPane.OUTLINE_DRAG_MODE
に変更DefaultDesktopManager#resizeFrame(...)
をオーバーライドしてデフォルトのリサイズアウトラインを幅高さ0
に変更して非表示化- 別途
JLayer
でアウトラインを描画するため、アウトラインの位置とサイズをRectangle
に記憶してJDesktopPane#repaint()
を実行 LayerUI#paint(...)
をオーバーライドして点線で上記のRectangle
を描画DefaultDesktopManager#resizeFrame(...)
内でアウトラインは描画されているのでJLayer
を使用せずにここで描画も実行したいが、Graphics g = JComponent.safelyGetGraphics(desktopPane)
などのメソッドがパッケージプライベートなので使用できない
- 別途
DefaultDesktopManager#beginResizingFrame(...)
をオーバーライドしてドラッグスタイルをJDesktopPane.LIVE_DRAG_MODE
に戻す- 記憶した
Rectangle
にJInternalFrame
をリサイズするため最後に一回super.resizeFrame(f, rubberBand.x, rubberBand.y, rubberBand.width, rubberBand.height)
を実行する必要がある
- 記憶した