我想在兩個JLabel的中心之間畫一條線,當用戶點擊一個標籤時,在另一個標籤上拖動和釋放。無論窗戶的大小是多少,都應該能夠工作。Java繪製組件中心之間的一條線
但行不是中心,我該如何解決它?
以下示例正在工作,但行似乎被JFrame的邊界偏移,因此它們不是中心。
我不想嘗試從點計算中刪除JFrame邊框,因爲真實接口比給出的示例更復雜,並且JFrame中包含更多組件。
我認爲點計算是相對於我使用的JPanel,所以我不會遇到JFrame邊界問題,但似乎並非如此。
非常感謝您的幫助。
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class test extends JFrame implements MouseListener {
private static JPanel panel = new JPanel();
private static test window = new test();
public test() {
panel.setLayout(new GridLayout(2, 2));
JLabel l1 = new JLabel();
JLabel l2 = new JLabel();
JLabel l3 = new JLabel();
JLabel l4 = new JLabel();
l1.setOpaque(true);
l2.setOpaque(true);
l3.setOpaque(true);
l4.setOpaque(true);
l1.setBackground(Color.RED);
l2.setBackground(Color.BLUE);
l3.setBackground(Color.GREEN);
l4.setBackground(Color.ORANGE);
l1.setName("l1");
l2.setName("l2");
l3.setName("l3");
l4.setName("l4");
panel.add(l1);
panel.add(l2);
panel.add(l3);
panel.add(l4);
panel.addMouseListener(this);
this.add(panel);
}
public static void drawArcs(int x1, int y1, int x2, int y2) {
Graphics g = window.getGraphics();
Graphics2D g2 = (Graphics2D) g;
g2.drawLine(x1, y1, x2, y2);
}
private static int x1 = 0;
private static int y1 = 0;
public void mousePressed(MouseEvent e) {
Component square1 = panel.getComponentAt(new Point(e.getX(), e.getY()));
System.out.println(square1.getName());
x1 = square1.getX() + square1.getWidth()/2;
y1 = square1.getY() + square1.getHeight()/2;
}
public void mouseReleased(MouseEvent e) {
Component square2 = panel.getComponentAt(new Point(e.getX(), e.getY()));
System.out.println(square2.getName());
int x2 = square2.getX() + square2.getWidth()/2;
int y2 = square2.getY() + square2.getHeight()/2;
drawArcs(x1, y1, x2, y2);
}
@Override
public void mouseClicked(MouseEvent arg0) {}
@Override
public void mouseEntered(MouseEvent arg0) {}
@Override
public void mouseExited(MouseEvent arg0) {}
public static void main(String[] args) {
window.setVisible(true);
window.setSize(400, 400);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
'window.getGraphics();'不是繪畫的工作原理。請參閱[在AWT和Swing中繪畫](http://www.oracle.com/technetwork/java/painting-140037.html)和[執行自定義繪畫](http://docs.oracle.com/javase/tutorial/) uiswing/painting /)瞭解更多詳情 – MadProgrammer 2015-02-12 00:53:33
是的,我知道,但是爲了這個例子,它好像是快速的做法。問題不在於畫線,而是中心問題。 – user1334130 2015-02-12 00:58:33
問題是你正在錯誤地繪畫。您正在使用窗口的圖形對象。如果您正確地繪畫,則Graphics對象將反映相對於面板的適當座標,而不是Window。 – camickr 2015-02-12 01:01:01