JFrameのcontentPaneをレイアウトを使用しないJLabelに設定するので、コンポーネントを追加すると、そのコンポーネントのサイズと位置を完全に指定しない限り、そのコンポーネントは表示されません。境界。これはcontentPanesにJLabelsを使用しないようにする理由の1つです(保持するコンポーネントに基づいて優先サイズを設定しないこともあります)。代わりに、一般的にJPanelのpaintComponentメソッドで描画を行います。
サイド勧告:
- あなたはあまりにも多くの主要な方法で起こっている - このプログラムは、デモの目的以外の目的ではない場合を除き
- あなたがたJFrameのオリジナルのcontentPaneを設定する(JPanelの) FlowLayoutに渡しますが、一度contentPaneを変更すると意味がないことを理解してください。
- contentPaneがFlowLayoutを使用すると仮定しても、図面JPanelをBorderLayout位置に追加しようとしています。これは意味をなさないものです。
- あなたは空のキャッチブロックを持っています。
- イメージをファイルではなくリソースとして取得します。
- アブソリュートファイルパスを使用しないで、リソースへの相対パスの使用を推奨します。
- 回避できる場合は、サイズを設定しないでください。
g.fillRect(50,50,450,650);
など、いわゆる「マジックナンバー」は避けてください。これにより、コードのデバッグと拡張が難しくなります。たとえば、
、のようなもの:
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.*;
@SuppressWarnings("serial")
public class ShowRectangle extends JPanel {
private static final int RECT_X = 50;
private static final int RECT_Y = RECT_X;
private static final int RECT_W = 200;
private static final int RECT_H = 200;
private static final String URL_SPEC = "https://duke.kenai.com/guitar/DukeAsKeith-daylightSmall.png";
private BufferedImage img;
public ShowRectangle(BufferedImage img) {
this.img = img;
}
// have same JPanel draw image and graphic element
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (img != null) {
g.drawImage(img, 0, 0, this);
}
// avoid magic numbers
// g.fillRect(50,50,450,650);
g.fillRect(RECT_X, RECT_Y, RECT_W, RECT_H);
}
// Size the JPanel to the image size
@Override
public Dimension getPreferredSize() {
if (isPreferredSizeSet() || img == null) {
return super.getPreferredSize();
}
return new Dimension(img.getWidth(), img.getHeight());
}
private static void createAndShowGui(BufferedImage image) {
ShowRectangle mainPanel = new ShowRectangle(image);
JFrame frame = new JFrame("ShowRectangle");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
try {
URL imageUrl = new URL(URL_SPEC);
BufferedImage img = ImageIO.read(imageUrl);
SwingUtilities.invokeLater(() -> createAndShowGui(img));
} catch (IOException e) {
e.printStackTrace();
System.exit(-1);
}
}
}
あなたは、例えば、「マジック」の数字を使用しないようならば、それは現在の変数の値によって描画されているので、それは、黒い長方形をドラッグ可能にするために簡単です、値MouseAdapter(MouseListenerとMouseMotionListenerを組み合わせたもの)の内部で変更することができます。例:
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.*;
@SuppressWarnings("serial")
public class ShowRectangle extends JPanel {
private static final int RECT_X = 50;
private static final int RECT_Y = RECT_X;
private static final int RECT_W = 200;
private static final int RECT_H = 200;
private static final String URL_SPEC = "https://duke.kenai.com/guitar/DukeAsKeith-daylightSmall.png";
private int rectX = RECT_X;
private int rectY = RECT_Y;
private BufferedImage img;
public ShowRectangle(BufferedImage img) {
this.img = img;
MouseAdapter myMouse = new MyMouse();
addMouseListener(myMouse);
addMouseMotionListener(myMouse);
}
// have same JPanel draw image and graphic element
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (img != null) {
g.drawImage(img, 0, 0, this);
}
// avoid magic numbers
// g.fillRect(50,50,450,650);
g.fillRect(rectX, rectY, RECT_W, RECT_H);
}
// Size the JPanel to the image size
@Override
public Dimension getPreferredSize() {
if (isPreferredSizeSet() || img == null) {
return super.getPreferredSize();
}
return new Dimension(img.getWidth(), img.getHeight());
}
private class MyMouse extends MouseAdapter {
private Point p1;
private Point rectP = null;
@Override
public void mousePressed(MouseEvent e) {
p1 = e.getPoint();
if (new Rectangle(rectX, rectY, RECT_W, RECT_H).contains(p1)) {
rectP = new Point(rectX, rectY);
}
}
@Override
public void mouseDragged(MouseEvent e) {
moveRect(e.getPoint());
}
@Override
public void mouseReleased(MouseEvent e) {
moveRect(e.getPoint());
rectP = null;
}
private void moveRect(Point p2) {
if (rectP == null) {
return;
}
rectX = rectP.x + p2.x - p1.x;
rectY = rectP.y + p2.y - p1.y;
repaint();
}
}
private static void createAndShowGui(BufferedImage image) {
ShowRectangle mainPanel = new ShowRectangle(image);
JFrame frame = new JFrame("ShowRectangle");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
try {
URL imageUrl = new URL(URL_SPEC);
BufferedImage img = ImageIO.read(imageUrl);
SwingUtilities.invokeLater(() -> createAndShowGui(img));
} catch (IOException e) {
e.printStackTrace();
System.exit(-1);
}
}
}
あなたのtry {...}ボディが正常に実行されていますか?空のcatch {}セクションを持つことは非常に悪い練習です –
"Except"の演習ではどうしたらいいですか? – user3150362
スタックトレースを印刷してプログラムを終了する必要があります。画像の読み込みで例外がスローされた場合は、実行したくないでしょう。 –