の位置決め
ここでは実際の例ですが、 java-image-scalingライブラリー(そのLGPL) - それは、プレビュー画像のスムーズなスケーリングのために使用され、そうでない場合は、あなたが完全に台無し画像を取得する:
public static void main (String[] args)
{
final JFrame mainFrame = new JFrame();
JPanel content = new JPanel (new GridLayout (20, 20));
for (int i = 0; i < 20; i++)
{
for (int j = 0; j < 20; j++)
{
content.add (new JLabel ("Test " + i + ":" + j)
{
{
setBorder (BorderFactory.createEmptyBorder (20, 20, 20, 20));
}
});
}
}
final JScrollPane pane = new JScrollPane (content);
pane.setCorner (JScrollPane.LOWER_TRAILING_CORNER, new JButton()
{
{
final JButton button = this;
addActionListener (new ActionListener()
{
public void actionPerformed (ActionEvent e)
{
JComponent comp = (JComponent) pane.getViewport().getView();
Dimension size = comp.getSize();
Rectangle viewRect = comp.getVisibleRect();
// Drawing preview
BufferedImage image = new BufferedImage (size.width, size.height,
BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = image.createGraphics();
comp.print (g2d);
g2d.dispose();
// Rescaling preview
int width = 200;
int height = comp.getHeight() * width/comp.getHeight();
BufferedImage rescaled =
new ResampleOp (width, height).filter (image, null);
// Drawing view rect
float diff = (float)width/size.width;
g2d = rescaled.createGraphics();
g2d.setPaint (Color.RED);
g2d.drawRect (Math.round (viewRect.x * diff),
Math.round (viewRect.y * diff),
Math.round (viewRect.width * diff),
Math.round (viewRect.height * diff));
g2d.dispose();
// Displaying preview
final JDialog preview = new JDialog (mainFrame);
preview.setUndecorated (true);
preview.add (new JLabel (new ImageIcon (rescaled))
{
{
setBorder (BorderFactory.createLineBorder (Color.BLACK));
setFocusable (true);
}
});
Point los = button.getLocationOnScreen();
preview.setSize (width + 2, height + 2);
preview.setLocation (los.x - width - 2, los.y - height - 2);
preview.setVisible (true);
preview.requestFocus();
preview.addFocusListener (new FocusAdapter()
{
public void focusLost (FocusEvent e)
{
preview.dispose();
}
});
}
});
}
});
mainFrame.add (pane);
mainFrame.setSize (600, 600);
mainFrame.setLocationRelativeTo (null);
mainFrame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
mainFrame.setVisible (true);
}
だから、基本的に私はパネルのスナップショットを作成し、それを再スケールし、その小さなダイアログに置きますボタンの近くで開き、焦点を失うと閉じます。スナップショットの作成には時間がかかるかもしれませんが、スクロールペインコンテナ全体のレンダリングされたプレビューを作成するための良い方法はわかりません。プレビューを表示するものにペイントする必要があります。あなたがプレビューダイアログ上RED RECTをドラッグすることで、目に見える矩形を移動することができるように
また、あなたは簡単にプレビューコンポーネントを変更することができます:)
も、この[解答](http://stackoverflow.com/a/10097538/230513)を参照してください。 – trashgod