1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Deutsch
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

Panel, auf dem man Panels hin und her schieben kann

  • Nicholas1991
  • 1. Mai 2008 um 00:02
  • Unerledigt
  • Nicholas1991
    9
    Nicholas1991
    Mitglied
    Punkte
    770
    Beiträge
    122
    • 1. Mai 2008 um 00:02
    • #1

    Hallo Leute

    ich bastel gerade an ... siehe Titel ^^.
    Die Panels werden auch auf DEM Panel angezeigt, aber erstens nicht dort, wo ich es erwartet hätte, zweitens funktioniert das mit dem hin und her schieben nicht.

    Ich hatte es mir wie folgt gedacht. Das Panel wird links oben in der Ecke erzeugt. Dann kann ich es auf dem Panel verschieben, indem ich die Maustaste gedrückt halte (auf dem Panel natürlich).

    Leider passiert folgendes: Das Panel wird links oben (zu weit links und zu weit oben) in der Ecke eingefügt. Wenn ich drauf klicke und die Maustaste gedrückt halte, sehe ich das Panel nur, wenn ich nach links oben, aus dem Panel rausgehe. Bewegen lässt es sich dementsprechend nicht.

    Hilft es vlcht weiter, dass das große anzeige Panel nicht das einzige in meinem JFrame ist?

    Ich hatte eine Vorlage von http://www.java2s.com/ wo ein ausgemaltes Rechteck verschoben wurde.

    mfg
    Nicholas

    Hier ist dann meine Version:

    Java
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.awt.event.MouseMotionListener;
    /////////////
    //Grundklasse von [URL]http://www.java2s.com/[/URL]   nur angepasst von mir auf mein Problem
    /////////////
    class TablePanel extends JPanel implements MouseListener, MouseMotionListener {
      Main_GUI myJFrame;
      int[] preX, preY;
     
      int iAkt;
      boolean isFirstTime = true;
      Rectangle area = new Rectangle(getWidth(), getHeight());
      boolean pressOut = false;
      public TablePanel(Main_GUI jf_Frame) {
        super(null);
        myJFrame = jf_Frame;
        setBackground(Color.white);
        addMouseMotionListener(this);
        addMouseListener(this);
      }
      public void mousePressed(MouseEvent e) {
        int i1 = this.getComponentCount();
        preX = new int[i1];
        preY = new int[i1];
        for (int i2 = 0 ; i2 < i1 ; i2++) {
          preX[i2] = getComponent(i2).getX()-e.getX();
          preY[i2] = getComponent(i2).getY()-e.getY();
        }
        boolean b1 = false;
        int i2 = 0;
        while(!b1 && i2<i1) {
          if (getComponent(i2).contains(e.getX(), e.getY())) {
            iAkt = i2;
            updateLocation(e);
            b1=true;
          }
          else {
            i2++;
          }
        }
        if (!b1) {
          pressOut=true;
        }
      }
      public void mouseDragged(MouseEvent e) {
        if (!pressOut) {
          updateLocation(e);
        }
      }
      public void mouseReleased(MouseEvent e) {
        boolean b1 = false;
          if (getComponent(iAkt).contains(e.getX(), e.getY())) {
            updateLocation(e);
          }
          else {
            pressOut = false;
          }
      }
     
      public void mouseMoved(MouseEvent e) {
      }
      public void mouseClicked(MouseEvent e) {
        /*
        int i1 = this.getComponentCount();
        preX = new int[i1];
        preY = new int[i1];
        for (int i2 = 0 ; i2 < i1 ; i2++) {
          preX[i2] = getComponent(i2).getX()-e.getX();
          preY[i2] = getComponent(i2).getY()-e.getY();
        }
        boolean b1 = false;
        int i2 = 0;
        while(!b1 && i2<i1) {
          if (getComponent(i2).contains(e.getX(), e.getY())) {
            b1=true;
          }
          else {
            i2++;
          }
        }
        boolean istEntity = true;
        try {
          EntityPanel pn1 = (EntityPanel) getComponent(i2);
        } catch (Exception z) {istEntity = false;}
        if (!b1) {
          myJFrame.activateEditPanel(i2, istEntity);
        } */
      }
      public void mouseExited(MouseEvent e) {
      }
      public void mouseEntered(MouseEvent e) {
      }
     
     
      public void updateLocation(MouseEvent e) {
        getComponent(iAkt).setLocation(preX[iAkt] + e.getX(), preY[iAkt] + e.getY());
        if (checkRect()) {
          //ShapeMover.label.setText(rect.getX() + ", " + rect.getY());
        } else {
          //ShapeMover.label.setText("drag inside the area.");
        }
        repaint();
      }
     
      boolean checkRect() {
        if (area == null) {
          return false;
        }
        if (area.contains(getComponent(iAkt).getX(), getComponent(iAkt).getY(), getComponent(iAkt).getWidth(), getComponent(iAkt).getHeight())) {
          return true;
        }
        int new_x = getComponent(iAkt).getX();
        int new_y = getComponent(iAkt).getY();
        if ((getComponent(iAkt).getX() + getComponent(iAkt).getWidth()) > area.getWidth()) {
          new_x = (int) area.getWidth() - getComponent(iAkt).getWidth();
        }
        if (getComponent(iAkt).getX() < 0) {
          new_x = 0;
        }
        if ((getComponent(iAkt).getY() + getComponent(iAkt).getHeight()) > area.getHeight()) {
          new_y = (int) area.getHeight() - getComponent(iAkt).getHeight();
        }
        if (getComponent(iAkt).getY() < 0) {
          new_y = 0;
        }
        getComponent(iAkt).setLocation(new_x, new_y);
        return false;
      }
     
      public void addEntity(EntityPanel epEntity) {
        add(epEntity);
        this.paintAll(this.getGraphics());
      }
    }
    Alles anzeigen
  • Nicholas1991
    9
    Nicholas1991
    Mitglied
    Punkte
    770
    Beiträge
    122
    • 4. Mai 2008 um 22:16
    • #2

    Wenn jemand noch mehr Infos braucht, weil er mein Problem nicht versteht: nur zu. Ich wäre überglücklich, wenn es jemandem gelingen würde herauszufinden, wo mein Problem liegt.

  • Vevusio
    6
    Vevusio
    Mitglied
    Reaktionen
    1
    Punkte
    371
    Beiträge
    71
    • 7. Mai 2008 um 02:13
    • #3

    nur so als anmerkung

    dieser code ist viel zu dreckig um da igendwas draus rauslesen zu können ohne sich, vllt nicht ein bein, aber nen finger auszureißen

    iAkt, i2, b1, krznbloxfwlöasf - solche variablen namen sind einfach toll

    [FONT=Arial, Helvetica, sans-serif](\__/) [/FONT]
    [FONT=Arial, Helvetica, sans-serif] (='.'=) [/FONT]This is Bunny. Copy Bunny into your signature to help
    [FONT=Arial, Helvetica, sans-serif](")_(")[/FONT] him on his way to world domination.

  • Nicholas1991
    9
    Nicholas1991
    Mitglied
    Punkte
    770
    Beiträge
    122
    • 8. Mai 2008 um 23:47
    • #4

    Sry VeVuSIo,

    für for Schleifen bietet sich ein i1 für einen Steigenden Int-Wert einfach an. Ich will aber natürlich hier keinem Stress machen, deshalb guck ich mal, dass ich den Code irgendwie umgeschrieben bekomme.

    Danke trotzdem für die Antwort

  • Schakal
    9
    Schakal
    Mitglied
    Reaktionen
    5
    Punkte
    780
    Beiträge
    152
    • 9. Mai 2008 um 12:42
    • #5

    Hi, ich weiß zwar nicht genau was du machen willst aber hier mal mein Vorschlag im Attachment. Da solltest du falls nötig die Events auch weiter passen. Auch würde ich die Listener in ein eigene Class auslagern. Weiters musst noch abrgen ob es an eine ungültige Stelle verschoben wird bzw. eine ScrollPane etc. verwenden und den Container vergrößern. Bei Soll Previewdraw verwendet werden empfehle ich XOR. Bzw. wann du was neu zeichnest solltest ändern. Das was ich gemacht habe sollte nur veranschaulichen wie. Du kannst natürlich bei dem händischen Durchsuchen der Kinder bleiben (ist auch performanter).

    Wichtig: Du kannst das zip-file in ein jar umbenennen und direkt ausführen (Java 1.6 vorausgesetzt und die Endung keinem anderen Tool zugewiesen ist). Sind auch die Src-Files drinnen.

    mfg Schakal

  • Nicholas1991
    9
    Nicholas1991
    Mitglied
    Punkte
    770
    Beiträge
    122
    • 9. Mai 2008 um 20:42
    • #6

    Hallo Schakal,

    erstmal vielen Dank an dich für deine nette Antwort. Ich wollte nur kurz fragen, ob du meine TablePanel Klasse editiert hast, da in der Zip davon keine .java-Dateil drin war.
    Außerdem wollte ich fragen, wie ich denn jetzt vorgehen müsste, wenn ich mein TablePanel nicht links oben in der Ecke des Fensters sitzen habe, da das das Problem zu sein scheint.

    Nochmals vielen Dank

    Nicholas

  • Schakal
    9
    Schakal
    Mitglied
    Reaktionen
    5
    Punkte
    780
    Beiträge
    152
    • 9. Mai 2008 um 20:47
    • #7

    ups, werds gleich ändern. Ist geändert.

    mfg Schakal

  • Nicholas1991
    9
    Nicholas1991
    Mitglied
    Punkte
    770
    Beiträge
    122
    • 9. Mai 2008 um 21:24
    • #8

    Vielen Vielen Dank

    Ich seh es mir gleich mal an.

    Nicholas

  • Nicholas1991
    9
    Nicholas1991
    Mitglied
    Punkte
    770
    Beiträge
    122
    • 9. Mai 2008 um 22:04
    • #9

    Genau was ich gebraucht habe.

    Nochmal ein ganz großes DANKE.

    Nicholas

  • Nicholas1991
    9
    Nicholas1991
    Mitglied
    Punkte
    770
    Beiträge
    122
    • 9. Mai 2008 um 23:47
    • #10

    Schon ergibt sich ein neues Problem... seufz... :grinning_face_with_smiling_eyes:

    Das mit dem Panelverschieben läuft jetzt. Allerdings möchte ich auf den Panels natürlich auch was drauf haben - eine Tabelle. Das an sich währe kein Problem, wollte ich nicht in verschiedenen Zellen eine andere Schriftfarbe haben.
    Ich habe mich natürlich informiert und habe bisher das hier gemacht:

    Java
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.table.*;
    /**
      *
      * Beschreibung
      *
      * @version 1.0 vom 09.05.2008
      * @author Nicholas
      */
    public class TableTest extends JFrame {
      // Anfang Variablen
      private JTable jTable1 = new JTable(5, 3);
      // Ende Variablen
      public TableTest(String title) {
        // Frame-Initialisierung
        super(title);
        addWindowListener(new WindowAdapter() {
          public void windowClosing(WindowEvent evt) { System.exit(0); }
        });
        int frameWidth = 435;
        int frameHeight = 351;
        setSize(frameWidth, frameHeight);
        Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
        int x = (d.width - getSize().width) / 2;
        int y = (d.height - getSize().height) / 2 ;
        setLocation(x, y);
        Container cp = getContentPane();
        cp.setLayout(null);
        // Anfang Komponenten
        jTable1.setBounds(8, 40, 216, 152);
        jTable1.setValueAt("Hallo", 0, 0);
        jTable1.setValueAt("Du da", 0, 1);
        jTable1.setValueAt("man", 2, 2);
        jTable1.setDefaultRenderer(JTable.class, new ScoreTableCellRenderer());
        cp.add(jTable1);
        // Ende Komponenten
        setResizable(false);
        setVisible(true);
      }
      // Anfang Ereignisprozeduren
      // Ende Ereignisprozeduren
      public static void main(String[] args) {
        new TableTest("TableTest");
      }
    }
    class ScoreTableCellRenderer extends DefaultTableCellRenderer {
      public Component getTableCellRendererComponent(JTable table,
                                                     Object value,
                                                     boolean isSelected,
                                                     boolean hasFocus,
                                                     int row,
                                                     int column) {
        super.getTableCellRendererComponent(table, value, isSelected,
        hasFocus, row, column);
    
    
        setBackground(new Color(255, 255, 0));
    
    
        return this;
      }
    }
    Alles anzeigen



    Den Renderer hab ich z.T. aus einem Forum, wo ein ähnliches Problem behandelt wurde.
    Um das ganze zu vereinfachen wollte ich erst einmal ohne Bedingung einfach jede Zelle einfärben, aber auch das hat nicht funktioniert.
    Ich wollte fragen, woran das liegt, und, wie ich jetzt z.B. anstatt den Hintergrund die Schriftart bzw. Schriftfarbe (foreground???) ändern kann.

    Danke wie immer im Vorraus

    Nicholas

  • Schakal
    9
    Schakal
    Mitglied
    Reaktionen
    5
    Punkte
    780
    Beiträge
    152
    • 10. Mai 2008 um 10:10
    • #11

    Dort wo du super.getT... aufrufst merke dir mal die Component, also Comp.. c=super... und setze bei der den Background und liefere das mal als Ergebnis zurück.

    mfg Schakal

  • Nicholas1991
    9
    Nicholas1991
    Mitglied
    Punkte
    770
    Beiträge
    122
    • 10. Mai 2008 um 21:26
    • #12

    Meinst du so? :

    Code
    class ScoreTableCellRenderer extends DefaultTableCellRenderer {
      public Component getTableCellRendererComponent(JTable table,
                                                     Object value,
                                                     boolean isSelected,
                                                     boolean hasFocus,
                                                     int row,
                                                     int column) {
        Component c = super.getTableCellRendererComponent(table, value, isSelected,
        hasFocus, row, column);
        c.setBackground(new Color(255, 255, 0));
        return c;
      }
    }
    Alles anzeigen



    Das brachte nämlich leider keinen Erfolg...

    Danke trotzdem für den Vorschlag

  • Schakal
    9
    Schakal
    Mitglied
    Reaktionen
    5
    Punkte
    780
    Beiträge
    152
    • 14. Mai 2008 um 12:41
    • #13

    Ich glaub JTable.class ist falsch, da gehört TableColumn.class oder allgemein Object.class, oder du Fragst die jeweilige Zelle ab bzw. Column mit:

    TableColumn col = table.getColumnModel().getColumn(vColIndex);
    col.setCellRenderer(new MyTableCellRenderer());

    der erste Paramter der Methode bei JTable set... ist nämlich eine die Klasse für Columns.

    Das mit dem Component lass mal gleich.

    Schreib obs funktioniert hat.

    edit:How to JTable
    Erklärt wie du einzelne Spalen und Zellen verändern kannst.

    mfg Schakal

    Einmal editiert, zuletzt von Schakal (16. Mai 2008 um 07:58)

  • Nicholas1991
    9
    Nicholas1991
    Mitglied
    Punkte
    770
    Beiträge
    122
    • 17. Mai 2008 um 22:36
    • #14

    Hallo Schakal,

    also das mit der Spalte setzten klappt schon mal. Vielen Dank dafür.
    Wie geht das jetzt analog mit einer Zelle, oder Zeile?

    Danke im Voraus
    Nicholas

  • Maximilian Rupp 27. Dezember 2024 um 12:04

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Rechtliches

Impressum

Datenschutzerklärung

  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  • Deutsch
  • English
Zitat speichern