Ich muss ein JLabel mit einem onclick-Ereignis auf einem gezeichneten Kreis zeichnen. Das neu erstellte JLabel sollte sehr geschlossen platziert werden, eine Linie, die bereits erstellt wurde. Ich habe versucht, dieses JLabel in der Mitte der Linie zu zeichnen. Das Problem ist jedoch, dass selbst nach dem Setzen fest berechneter Koordinaten (x, y) das JLabel nicht an der angegebenen Stelle gezeichnet wird (im Gegensatz zu g.drawLine() oder g.drawOval()). Mein Code ist unten angegeben: brauche Hilfe, um es zu beheben.der Standort (x, y) von Java Swing 'JLabel' und Grafikelemente sind nicht gleich
public class ButtonExample extends JFrame{
JFrame frame;
JLabel label1, label2, label3;
private Shape myShape;
private int arrowAdded = 0;
public ButtonExample() {
super("Location test of JLabel and Graphics objects");
label1 = new JLabel("0,0");
//label2 = new JLabel("40,40");
label1.setBounds(0, 0, 50, 50);
label1.setBorder(BorderFactory.createLineBorder(Color.black));
//label2.setBounds(100, 100, 50, 50);
//label2.setBorder(BorderFactory.createLineBorder(Color.black));
add(label1);
//add(label2);
repaint();
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent me) {
super.mouseClicked(me);
if (myShape.contains(me.getPoint())) {
arrowAdded = 1;
repaint();
}
}
});
setLayout(null);
setSize(1000,600);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(1000, 600);
}
public void paint(Graphics g){
super.paint(g);
int startX = 100;
int startY = 100;
int endX = 180;
int endY = 120;
g.setColor(new Color(0, 255, 0));
myShape = new Ellipse2D.Double(startX, startY, 30, 30);
Graphics2D g2d = (Graphics2D) g;
g2d.draw(myShape);
g.drawLine(startX, startY, endX, endY);
int lX = (int)Math.abs(endX-startX)/2;
int lY = (int)Math.abs(endY-startY)/2;
if(endX>startX) {
lX = lX+startX;
}else {
lX = lX+endX;
}
if(endY>startY) {
lY = lY+startY;
}else {
lY = lY+endY;
}
if(arrowAdded == 1) {
label3 = new JLabel();
label3.setBounds(lX, lY, 20, 15);
label3.setBorder(BorderFactory.createLineBorder(Color.black));
add(label3);
g.drawRect(lX, lY, 20, 15);
}enter code here
}
public static void main(String[] args) {
new ButtonExample();
}
}
Malmethoden können mehrmals pro Sekunde aufgerufen werden. Erstellen Sie kein neues JLabel innerhalb einer Paint-Methode und fügen Sie keine Komponenten in einer Paint-Methode hinzu. Wenn Sie ein JLabel anzeigen müssen, fügen Sie es * einmal * hinzu, wenn Sie Ihren Komponentenbaum aufbauen. – VGR
richtig, ich habe das Problem erlebt. vielen dank :) –