私が中心にJLabel
のためのアンカーポイントを設定できるようにしたいので、私はそれに基づいてそれを周りに移動することができます。JLabelにアンカーを設定する方法はありますか?
0
A
答えて
3
あなたが特定のポイントの周りのJLabelを中央しようとしているなら、あなたが必要とするすべては、より多くの何もこれを実行するための簡単な数学ではありません。
JLabel、またはJPanelで保持されている「コンポーネント」、または「コンテナ」と呼ばれるコンテナを持ち、マウスがあることを前提としています。それだけです
Point mousePoint = e.getLocationOnScreen();
Point containerLocation = container.getLocationOnScreen();
Dimension componentSize = component.getSize();
int x = mousePoint.x - componentSize.width/2 - containerLocation.x;
int y = mousePoint.y - componentSize.height/2 - containerLocation.y;
component.setLocation(x, y);
:画面上で、「mousePoint」と呼ばれると言う、そして数学は同じくらい簡単です。
例えば、2つのJLabel、1つは画像、もう1つはテキストがあるとします。同じMouseListenerとMouseMotionListenerを両方に追加すると、ポイント。ここで私は上記の私のコメントで述べたようにMCVEの例である:私がnullレイアウトの使用の弊害については言及しなかった場合
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Image;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.*;
public class ClickDragLabel extends JPanel {
public static final String IMG_PATH = "https://upload.wikimedia.org/wikipedia/commons/thumb/4/43/"
+ "Theodore_Comnenus-Ducas_cropped.jpg/133px-Theodore_Comnenus-Ducas_cropped.jpg";
private static final int PREF_W = 1000;
private static final int PREF_H = 850;
private JLabel imageLabel;
private JLabel textLabel = new JLabel("Some Random Text");
public ClickDragLabel(Icon icon) {
setBackground(Color.WHITE);
imageLabel = new JLabel(icon);
setLayout(null);
imageLabel.setSize(imageLabel.getPreferredSize());
textLabel.setSize(textLabel.getPreferredSize());
imageLabel.setLocation(250, 250);
textLabel.setLocation(10, 10);
MyMouse myMouse = new MyMouse();
imageLabel.addMouseListener(myMouse);
imageLabel.addMouseMotionListener(myMouse);
textLabel.addMouseListener(myMouse);
textLabel.addMouseMotionListener(myMouse);
add(imageLabel);
add(textLabel);
}
@Override
public Dimension getPreferredSize() {
if (isPreferredSizeSet()) {
return super.getPreferredSize();
}
return new Dimension(PREF_W, PREF_H);
}
private class MyMouse extends MouseAdapter {
@Override
public void mousePressed(MouseEvent e) {
center(e);
}
@Override
public void mouseReleased(MouseEvent e) {
center(e);
}
@Override
public void mouseDragged(MouseEvent e) {
center(e);
}
private void center(MouseEvent e) {
JComponent component = (JComponent) e.getSource();
Container container = component.getParent();
Point mousePoint = e.getLocationOnScreen();
Point containerLocation = container.getLocationOnScreen();
Dimension componentSize = component.getSize();
int x = mousePoint.x - componentSize.width/2 - containerLocation.x;
int y = mousePoint.y - componentSize.height/2 - containerLocation.y;
component.setLocation(x, y);
container.repaint();
}
}
private static void createAndShowGui() {
Image img = null;
try {
URL imgUrl = new URL(IMG_PATH);
img = ImageIO.read(imgUrl);
} catch (IOException e) {
e.printStackTrace();
System.exit(-1);
}
Icon icon = new ImageIcon(img);
ClickDragLabel mainPanel = new ClickDragLabel(icon);
JFrame frame = new JFrame("Click-Drag Label");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
}
この投稿をしたので、私は怠慢でしょう。ヌルレイアウトとsetBounds()
は、複雑なGUIを作成する最も簡単で最良の方法のようにSwingの初心者のように思えるかもしれませんが、Swing GUIを使用すると、より多くの深刻な問題が発生します。 GUIのサイズが変更されたときにコンポーネントのサイズを変更することはありません。これらのコンポーネントは、拡張または維持するロイヤルウィジェットであり、スクロールペインに配置すると完全に失敗し、元のプラットフォームとは異なるすべてのプラットフォームまたは画面解像度で表示されます。上記のようなアニメーションのためだけに使用します。
3
JLabelの上のアンカーを設定する方法はありますか?
EmptyBorder
をラベルに設定して変更することで、どのように見えるのかを確認できます。
import java.awt.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import javax.swing.event.*;
public class MovableLabel {
private JComponent ui = null;
String anchorString = new String(Character.toChars(9875));
private JLabel label = new JLabel(anchorString);
int pad = 200;
SpinnerNumberModel xModel = new SpinnerNumberModel(0, 0, pad, 1);
SpinnerNumberModel yModel = new SpinnerNumberModel(0, 0, pad, 1);
MovableLabel() {
initUI();
}
public void initUI() {
if (ui != null) {
return;
}
ui = new JPanel(new BorderLayout(4, 4));
ui.setBorder(new EmptyBorder(4, 4, 4, 4));
Font[] fonts = GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts();
Font font = null;
for (Font f : fonts) {
if (f.canDisplayUpTo(anchorString) < 0) {
font = f.deriveFont(40f);
break;
}
}
label.setFont(font);
label.setBackground(Color.BLUE);
setBorder();
ui.add(label);
JToolBar tb = new JToolBar();
ui.add(tb, BorderLayout.PAGE_START);
ChangeListener changeListener = new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
setBorder();
}
};
tb.add(new JLabel("X"));
JSpinner xSpinner = new JSpinner(xModel);
xSpinner.addChangeListener(changeListener);
tb.add(xSpinner);
tb.add(new JLabel("Y"));
JSpinner ySpinner = new JSpinner(yModel);
ySpinner.addChangeListener(changeListener);
tb.add(ySpinner);
}
private void setBorder() {
int x = xModel.getNumber().intValue();
int y = yModel.getNumber().intValue();
EmptyBorder border = new EmptyBorder(x, y, pad - x, pad - y);
label.setBorder(border);
}
public JComponent getUI() {
return ui;
}
public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception useDefault) {
}
MovableLabel o = new MovableLabel();
JFrame f = new JFrame(o.getClass().getSimpleName());
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.setLocationByPlatform(true);
f.setContentPane(o.getUI());
f.pack();
f.setMinimumSize(f.getSize());
f.setVisible(true);
}
};
SwingUtilities.invokeLater(r);
}
}
関連する問題
- 1. CSSにアンカーをマージする方法はありますか?
- 2. フッターセクションをReactにアンカーする方法はありますか?
- 3. arlylistサイズでjlabelをバインドする方法はありますか?
- 4. Ghost.pyにウィンドウサイズを設定する方法はありますか?
- 5. LLRPにアンテナスイッチを設定する方法はありますか?
- 6. ユーザーを知る方法は設定アプリにありますか?
- 7. JLabelの下にJButtonのGridLayoutを追加する方法はありますか?
- 8. JLabelをJPanelの内部に配置する方法はありますか?
- 9. アンバインド後にクリックイベントをアンカーに再バインドする方法はありますか?
- 10. forループでJLabelのプロパティを設定する方法は?
- 11. フォルダからの画像からアイコンをJLabelに設定する方法は?
- 12. "panel.add(new JLabel(" "")); "にあるJLabelのフォントサイズを変更する方法"
- 13. WKWebViewでローカルストレージを設定する方法はありますか
- 14. showFeedDialogでタイトルを設定する方法はありますか?
- 15. パーソナルダッシュボードを設定する方法はありますか
- 16. RadioGroupのBackgroundColorを設定する方法はありますか?
- 17. jqueryでタイマーを設定する方法はありますか
- 18. プログラムでMDBを設定する方法はありますか?
- 19. ImageLoaderのデフォルトイメージを設定する方法はありますか?
- 20. スタックアクションバーのactionBarTabTextStyleを設定する方法はありますか?
- 21. カスタム設定セクションをインポートする方法はありますか?
- 22. Nginxの設定で変数を設定する方法はありますか?
- 23. spark executorプロセスのniceness設定を設定する方法はありますか?
- 24. 2つのデータグリッドを互いにアンカーする方法はありますか?
- 25. MultiLine JLabelはありますか?
- 26. Keyboard.FocusedElementを特定の要素に設定する方法はありますか?
- 27. segueアンカーをプログラムで選択する方法はありますか?
- 28. ハブノードからグリッドノードをリモートに設定する方法はありますか?
- 29. 整数でJLabelを呼び出す方法はありますか
- 30. REPLを常にpprintに設定する方法はありますか?
私達にあなたの現在のコード、問題、および問題の詳細についての詳細を教えてください。 「アンカーポイント」とは、正確にはどういう意味ですか?そのJLabelをクリックすると、クリックした場所の中央になるように移動します。ドラッグすると、マウスの後ろに中心が移動しますか? [mcve]も大いに役立ちます。これは、コンパイル不可能なコードスニペット以上であり、プログラム全体よりも少ないものです。可能であれば、あなたの質問でこの問題を解決しようとする試みを常に表示してください。 –
また、私が上で述べたことの多くを含め、これのどれも: "私はそれを検索しようとしました、通常、私は必要なものを見つけますが、この場合は見つかりません。あなたの問題を理解するのに役立つものは何も教えてくれません。それはあなたが間違ったことをGoogleで検索していることを示唆しているだけで、問題をGoogle検索可能な小さなステップに縮小していないことを示しています。 –
@HovercraftFullOfEels申し訳ありませんが、これは初めての質問です。私は現在の状況では私のiPadを使うことしかできないので、コードを含まないで逃げることができたと思っていたので、少し難しかったです。アンカーポイントは、label.setLocation(100,100)を使用すると意味します。そこにアンカーポイントがあります。したがって、現在のアンカーは0、0なので、上記の行を入力すると、JLabelの0、0は100,100になりますが、アンカーポイントを変更する方法を尋ねるので、100,100にカンターを配置します。 – FireStrike289