Linien auf JPanel zeichnen

Jak111

Mitglied
Ich habe versucht ein Programm zu erstellen wo man die Koordinaten eingeben kann wo eine Linie gezeichnet werden soll und dann wenn man auf den Button "Zeichnen" klickt dort die Linien gezeichnet werden. Aktuell wird die Linie jedoch direkt auf den JFrame gezeichnet. Ich möchte das jedoch ändern und die Linien auf einen JPanel zeichnen. Ich habe versucht ein zweiten JPanel (panel2) zu erstellen und dann mit panel2.add(linie) die Linien hinzuzufügen doch leider funktioniert das nicht.. was mache ich falsch? (Wenn ich die Linien mit add(linie) direkt auf den JFrame zeichne funktioniert es wunderbar)

Java:
package test;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.Box.Filler;

class Fenster extends JFrame implements ActionListener{
   JButton btn_zeichnen;
   JTextField txt_x1,txt_x2,txt_y1,txt_y2;
   JLabel lbl_x1,lbl_x2,lbl_x3,lbl_x4;
   JPanel panel;
   JPanel panel2;
   MyPanel linie;
   int x1,x2,y1,y2;

   //Konstrukor
   public Fenster(){
     setTitle("Test");
     setSize(800,600);
     setDefaultCloseOperation(EXIT_ON_CLOSE);
      
     panel = new JPanel();
     panel2 = new JPanel();
    
     btn_zeichnen = new JButton("Zeichnen");
     btn_zeichnen.setSize(100,30);
     btn_zeichnen.setLocation(300, 50);
     btn_zeichnen.addActionListener(this);
    
     txt_x1 = new JTextField();
     txt_x1.setLocation(30,30);
     txt_x1.setSize(100, 30);
     txt_x1.setVisible(true);
     
     txt_x2 = new JTextField();
     txt_x2.setLocation(30,80);
     txt_x2.setSize(100, 30);
     txt_x2.setVisible(true);
     
     txt_y1 = new JTextField();
     txt_y1.setLocation(150,30);
     txt_y1.setSize(100, 30);
     txt_y1.setVisible(true);
    
     txt_y2 = new JTextField();
     txt_y2.setLocation(150,80);
     txt_y2.setSize(100, 30);
     txt_y2.setVisible(true);
     
     setLayout(new GridLayout(2,1));
     panel.setLayout(null);
     add(panel);
     add(panel2);
    
     panel.add(btn_zeichnen);
     panel.add(txt_x1);
     panel.add(txt_x2);
     panel.add(txt_y1);
     panel.add(txt_y2);
   }
   public void actionPerformed(ActionEvent e) {
     if(e.getActionCommand().equals("Zeichnen")){
       x1 = Integer.valueOf(txt_x1.getText());
       y1 = Integer.valueOf(txt_y1.getText());
       x2 = Integer.valueOf(txt_x2.getText());
       y2 = Integer.valueOf(txt_y2.getText());
      
       linie = new MyPanel(x1, y1, x2, y2);
       panel2.add(linie);
       revalidate();
       repaint();
     }
}
}

//Hauptprogramm
public class Frame{
   public static void main(String[] args){
     Fenster frame = new Fenster();
     frame.setVisible(true);
   }
}

Java:
package test;

import java.awt.*;
import javax.swing.*;

public class MyPanel extends JPanel {
   int x1,y1,x2,y2;
  
   public MyPanel(int x1, int y1, int x2, int y2){
     setLayout(null);
     this.x1 = x1;
     this.x2 = x2;
     this.y1 = y1;
     this.y2 = y2;
   }
   public void paint(Graphics gr){
     super.paintComponents(gr);
     Graphics2D g = (Graphics2D)gr;
     g.setColor(Color.GREEN);
     g.drawLine(x1, y1, x2, y2);
   }
}
 
Zuletzt bearbeitet von einem Moderator:
Der Punkt ist, dass du bei panel2 kein Layout gesetzt hattest. Dann wird als default ein FlowLayout verwendet. Dieses berücksichtigt die preferredSize der hinzugefügten Components. Und die preferredSize von MyPanel ist 1,1, weil MyPanel keine Kinderkomponenten hat.
Wenn ich die Linien mit add(linie) direkt auf den JFrame zeichne
Wenn du damit deinen Thread http://www.java-forum.org/thema/problem-mit-graphics-methode.170659/ meinst: das hat nix mit JFrame oder JPanel zu tun, sondern ist eine Layout-Frage. Du verpasst dem JFrame eine GridLayout. Dieses weisst allen Zellen des Grids dieselbe Größe zu. D. h. auch wenn dein MyPanel eine preferredSize von 1, 1, hat, bekommt es trotzdem mehr zur Verfügung gestellt.
BTW: JFrame.setLayout(LayoutManager) und JFrame.add(Component) wirken nicht direkt auf dem JFrame, sondern auf dessen ContentPane.
 

Neue Themen


Zurück
Oben