2017-02-25 28 views
0

私が中心にJLabelのためのアンカーポイントを設定できるようにしたいので、私はそれに基づいてそれを周りに移動することができます。JLabelにアンカーを設定する方法はありますか?

+1

私達にあなたの現在のコード、問題、および問題の詳細についての詳細を教えてください。 「アンカーポイント」とは、正確にはどういう意味ですか?そのJLabelをクリックすると、クリックした場所の中央になるように移動します。ドラッグすると、マウスの後ろに中心が移動しますか? [mcve]も大いに役立ちます。これは、コンパイル不可能なコードスニペット以上であり、プログラム全体よりも少ないものです。可能であれば、あなたの質問でこの問題を解決しようとする試みを常に表示してください。 –

+0

また、私が上で述べたことの多くを含め、これのどれも: "私はそれを検索しようとしました、通常、私は必要なものを見つけますが、この場合は見つかりません。あなたの問題を理解するのに役立つものは何も教えてくれません。それはあなたが間違ったことをGoogleで検索していることを示唆しているだけで、問題をGoogle検索可能な小さなステップに縮小していないことを示しています。 –

+0

@HovercraftFullOfEels申し訳ありませんが、これは初めての質問です。私は現在の状況では私のiPadを使うことしかできないので、コードを含まないで逃げることができたと思っていたので、少し難しかったです。アンカーポイントは、label.setLocation(100,100)を使用すると意味します。そこにアンカーポイントがあります。したがって、現在のアンカーは0、0なので、上記の行を入力すると、JLabelの0、0は100,100になりますが、アンカーポイントを変更する方法を尋ねるので、100,100にカンターを配置します。 – FireStrike289

答えて

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をラベルに設定して変更することで、どのように見えるのかを確認できます。

enter image description hereenter image description here

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); 
    } 
} 
関連する問題