- ベストアンサー
java GUIで線と文字を同時に表示する方法
- javaのGUIを使ってキーワードを線で結びながら表示する方法について教えてください。
- JAVAのGUIを使ってアプリケーションを作り、キーワードを線で結びながら表示したいですが、上手く表示できません。
- キーワードを線と文字を同時に表示する方法についてアドバイスをお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
#1です。 ユーザーから入力を受け付けるパネルとネットワーク図を表示するパネルは分けた方がいいと思います。 ネットワーク図のパネルは、こんな感じにしてみました。 (コンパイルするときは全角スペースを半角スペースに変換してからにしてください) public class NetworkDiagram extends JPanel { public NetworkDiagram() { setLayout(null); } public void add(String text, int x, int y) { JLabel label = new JLabel(text); label.setBorder(BorderFactory.createEtchedBorder()); label.setOpaque(true); label.setLocation(x, y); label.setSize(label.getPreferredSize()); add(label); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Component[] coms = getComponents(); LinkedList<Point> list = new LinkedList<Point>(); for (Component com : coms) { if (com instanceof JLabel) { int x = com.getX() + com.getWidth() / 2; int y = com.getY() + com.getHeight() / 2; list.add(new Point(x, y)); } } Point p; while ((p = list.poll()) != null) { for (Point p2 : list) { g.drawLine(p.x, p.y, p2.x, p2.y); } } } } これを動かすサンプルです。 public class Test extends JFrame { public Test() { NetworkDiagram nd = new NetworkDiagram(); nd.add("テスト1", 10, 10); nd.add("テスト2", 80, 20); nd.add("テスト3", 30, 100); nd.add("テスト4", 150, 80); getContentPane().add(nd, BorderLayout.CENTER); setSize(300, 200); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { Test test = new Test(); test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); test.setVisible(true); } }); } } 全然作り込んではいませんが、ヒントにはなると思います。
その他の回答 (1)
- PecoPlus
- ベストアンサー率76% (144/188)
こんにちは。 うーん、どうなっているのか、よくわかりませんねぇ。 問題が再現されるサンプルとか補足できないでしょうか?
補足
import javax.swing.*; import java.awt.Container; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Toolkit; import java.awt.event.*; public class assist1{ JPanel contentPanel; public static void main (String[] args) { JFrame frame = new JFrame("assist") ; InputPanel panel1 = new InputPanel(); Container cont = frame.getContentPane(); cont.add(panel1); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); int w = screenSize.width; int h = screenSize.height; frame.setBounds(w/4,h/4,w/2,h/2); frame.setVisible(true); } } class InputPanel extends JPanel implements ActionListener { JLabel l0 , l1 , l2 , l3; JTextField t1 , t2 , t3; JButton b1; InputPanel(){ setLayout(null); l0 = new JLabel ("キーワードを入力"); l0.setBounds(10, 0, 300, 30); l1 = new JLabel (); l1.setBounds(300, 30, 100, 30); l2 = new JLabel (); l2.setBounds(200, 90, 100, 30); l3 = new JLabel (); l3.setBounds(350, 120, 100, 30); t1 = new JTextField(); //入力タブ t1.setBounds(10,30,100,30); t2 = new JTextField(); t2.setBounds(10,60,100,30); t3 = new JTextField(); t3.setBounds(10,90,100,30); b1 = new JButton ("変換"); //変換ボタン b1.setBounds(10,120,100,30); b1.addActionListener(this); //ボタンの関連付け JPanel p1 = new JPanel() ; p1.setBounds(0, 0, 0, 0); add(l0); //ラベル、ボタン、タブの実装 add(l1); add(l2); add(l3); add(b1); add(t1); add(t2); add(t3); this.add(p1); } public void actionPerformed(ActionEvent e1){ l1.setText(t1.getText()); l2.setText(t2.getText()); l3.setText(t3.getText()); l1.setBorder(BorderFactory.createEtchedBorder()); l2.setBorder(BorderFactory.createEtchedBorder()); l3.setBorder(BorderFactory.createEtchedBorder()); } ↑実際に作ってる途中のやつです この状態から線を描画してキーワードを視覚的に結びたいのですがどうすればよいでしょう? わかりにくくて申し訳ないです。
お礼
ありがとうございます。 助かりました。参考にさせていただきます。