# Koordinaten/Raster (ähnlich Schachbrett) anzeigen/ausblenden



## spider14102 (18. Okt 2006)

Hallo, ich möchte gerne im Haupt-Panel (mainwindow) eine weiße Linie (noch besser: ein komplett durchgehendes Raster übers ganze Feld, so wie bei einem Brettspiel oder Schachfeld) zeichnen. Diese wird aber leider nicht angezeigt, kann mir da jemand weiterhelfen? Und wie kann ich dieses Raster über den Menüpunkt „Koordinaten ein-/ausblenden“ eben ein- und ausblenden?


```
import java.awt.Button;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.ImageIcon;
import javax.swing.JLabel;

public class Start extends Frame implements ActionListener { 

	public Start() { 
        addWindowListener(new WindowAdapter() { 
            public void windowClosing(WindowEvent evt) { 
                System.exit(0); 
            } 
        }); 
        setSize(800, 605); 
        setLocation(1, 1); 
        setTitle("Mein Programm"); 
        Button button1 = new Button(); 
        Button button2 = new Button(); 
        final Panel framePanel; 
        framePanel = new Panel(); 
        framePanel.setLayout(null); 
        
        Panel buttonPanel = new Panel(); 
        buttonPanel.setBounds (650, 10, 125, 530); 
        Color menuecolor=new Color(228,255,130);
        buttonPanel.setBackground(menuecolor); 
        button1 = new Button("Button 1"); 
        button2 = new Button("Button 2");
        buttonPanel.add(button1); 
        buttonPanel.add(button2);
        Panel mainwindow = new Panel(); 
        mainwindow.setBounds(15, 10, 615, 530); 
        Color grass=new Color(69,139,0);
        mainwindow.setBackground(grass);   
        framePanel.add(mainwindow); 
        framePanel.add(buttonPanel); 
        add(framePanel); 
        createMenu(); 
        setVisible(true); 

//HIER MEINE GEZEICHNETE LINIE
        mainwindow.getGraphics().setColor(Color.white); 
        mainwindow.getGraphics().drawLine(0,0,100,100); 
    }

	private void createMenu() { 
        MenuBar hauptMenue = new MenuBar(); 
        Menu menue1 = new Menu("Datei"); 
        Menu menue2 = new Menu("Bearbeiten"); 
        Menu menue3 = new Menu("Hilfe"); 
        menue1.add("Neu"); 
        menue1.addSeparator(); 
        menue1.add("Beenden"); 
        menue2.add("start"); 
        menue2.add("stopp"); 
        menue2.addSeparator(); 
        menue2.add("Koordinaten ein-/ausblenden"); 
        menue3.add("Hilfe"); 
        hauptMenue.add(menue1); 
        hauptMenue.add(menue2); 
        hauptMenue.add(menue3); 
        hauptMenue.setHelpMenu(menue3); 
        setMenuBar(hauptMenue); 
        menue1.addActionListener(this); 
    } 

    public void actionPerformed(ActionEvent evt) { // Programm beenden 

        if (evt.getSource() instanceof MenuItem) { 
            String menuAdd = evt.getActionCommand(); 
            if (menuAdd == "Beenden") 
                System.exit(0); 
        } 
    } 

    public static void main(String args[]) { 
        //Start f = new Start(); 
    	
    }
```


----------



## SlaterB (18. Okt 2006)

Graphic-Befehle stehen nie in einem Konstruktor, 
sondern nur in der überschriebenen paint()-Operation, oder werden von dort aufgerufen,

siehe ein BELIEBIGES Beispiel zur graphischen Anzeige in einem BELIEBIGEN Tutorial,
nirgendwo wirst du einen solchen Befehl finden,
wie kommt man eigentlich darauf sowas überhaupt zu versuchen?

wie kommt man überhaut darauf, erste Zeichenübungen in einer bereits 
derart komplizieren GUI mit Menü und Layout usw. anzufangen?
verrückt


http://www.galileocomputing.de/openbook/javainsel5/javainsel14_000.htm#Xxx999378


----------



## spider14102 (18. Okt 2006)

ich mach das net freiwillig, ich muss! ;-) in welchem konstruktor stehen denn meine grafikbefehle??? und wo müssen sie stattdessen hin (paint-operation???) ?


----------



## André B. (18. Okt 2006)

Du solltest am besten eine eigene Klasse schreiben und die dann von JPanel oder JComponent oder so erben lassen. Dort kannst du dann die paint-methode entsprechend überschreiben. Ausserdem kommen in deinem Code sowohl AWT als auch Swing Komponenten vor, was eigentlich nicht gemacht werden sollte.
Mfg André


----------



## SlaterB (18. Okt 2006)

niemand muss, und Grafik lernt man nicht mal eben so,
bei deinem Wissensstand würde ich damit noch einige Monate abwarten,
ansonsten ein Tutorial lesen,

-------

die stehen im Konstruktor public Start() { } wie unschwer zu sehen,
und mal eben komplett Grafik-Programmierung erklären möchte ich persönlich nicht 

Tutorial (einfach von den Beispielen dort klauen) oder auf andere hoffen


----------



## spider14102 (25. Okt 2006)

Durch "Größerziehen" des Fensters verändert sich durch das GridLayout auch automatisch die Größe der einzelnen Kästchen... Somit passen dann die Bilder, mit denen die Kästchen gefüllt werden sollen, nicht mehr genau rein. Gibt es in DIESEM quellcode ne möglichkeit, die Kästchengröße der einzelnen Kästchen im Raster auf 40*40 Pixel zu beschränken, egal wie groß man das Fenster zieht? hab das über Math.ceil und getHeight / getWidth (siehe quellcode) versucht, klappt aber leider net...


```
public Start() { 
        super("Programm"); 
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        setSize(800,600); 
        setLocationRelativeTo(null); 
        bilderContainer = new BilderContainer(); 
        getContentPane().add(bilderContainer); 
        createMenu(); 
        setVisible(true); 
    } 

   public static void main(final String args[]) {new Start().setVisible(true);} 
    
    class BilderContainer extends JPanel implements MouseListener, MouseMotionListener{ 
        private List bilderListe; 
        private Cursor myPointer; 
        final private int ROWS = (int) Math.ceil(getContentPane().getHeight()/40);        //15; 
        final private int COLUMNS = (int) Math.ceil(getContentPane().getWidth()/40);   //22; 
        public BilderContainer(){ 
            addMouseListener(this); 
            addMouseMotionListener(this); 
            setLayout(new GridLayout(ROWS, COLUMNS)); 

// USW.
```


----------



## SlaterB (25. Okt 2006)

wenn die Kästchen nicht größer werden, was soll dann stattdessen den restlichen Raum der GUI füllen?,
was dir im Moment vielleicht hilft ist eine Größenbegrenzung des JPanels mit diesem Layout,

setzte
setSize,
setMaxSize
setPreferredSize
usw.


----------



## André B. (25. Okt 2006)

Oder einfach verhindern, dass man die größe von dem Frame verändern kann


----------



## spider14102 (25. Okt 2006)

setMaxSize hab ich schon in allen konstellationen versucht, das nimmt er einfach nicht an. gibt es nicht noch einen anderen befehl wie "resizable" oder sowas?


----------



## André B. (25. Okt 2006)

Die Methode setResizable(boolean flag) sollte es tun Ansonsten: Forumsuche und API Doc helfen weiter


----------



## spider14102 (6. Nov 2006)

wie wäre es möglich, in meinen code einzubinden, dass erkannt wird, welches bild gerade in welchem feld des rasters ist und überprüft wird, ob nur ganz bestimmte bilder nebeneinander liegen? also zb dass nur "g1.jpg" neben "g2.jpg" liegen darf damit eine korrekte meldung kommt...


```
package dnd; 
import java.awt.CheckboxMenuItem;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Cursor;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import javax.imageio.ImageIO;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JLayeredPane;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class Start extends JFrame implements ActionListener { 
    private JPanel selectedBildPanel; 
    private BilderContainer bilderContainer;
    private boolean moveMode; 
    private boolean showGrid = true; 
    
    CheckboxMenuItem showCoord= new CheckboxMenuItem("Koordinaten ein-/ausblenden"); 

    public Start() { 
        super("Model Railway 2.0"); 
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        setSize(788,578); 
        setResizable(false);
        setLocationRelativeTo(null); 
        bilderContainer = new BilderContainer(); 
        getContentPane().add(bilderContainer); 
        createMenu(); 
        setVisible(true); 
    } 
    

    public void ueber(){
    	JOptionPane.showMessageDialog(
				this, "Info", 
				"Über", JOptionPane.INFORMATION_MESSAGE);
        	}
    

    private void createMenu() { 
        MenuBar hauptMenue = new MenuBar(); 
        Menu menue1 = new Menu("Datei"); 
        Menu menue2 = new Menu("Optionen"); 
        Menu menue3 = new Menu("Hilfe"); 
        menue1.add("Neu"); 
        menue1.add("Laden"); 
        menue1.add("Speichern"); 
        menue1.addSeparator(); 
        menue1.add("Beenden");
        showCoord.setState(true);
        showCoord.addItemListener(new ItemListener(){ 

	
         public void itemStateChanged(ItemEvent arg0) 
         { 
        	 if (showGrid==true) {showGrid = false;}
        	 else showGrid=true;
        	 bilderContainer.bilderAnzeigen(); 
         } 
        }); 
        menue2.add(showCoord);
        menue2.addSeparator(); 
        menue2.add("überprüfen"); 
        menue3.add("Über..."); 
        menue3.add("Hilfethemen"); 
        hauptMenue.add(menue1); 
        hauptMenue.add(menue2); 
        hauptMenue.add(menue3); 
        hauptMenue.setHelpMenu(menue3); 
        setMenuBar(hauptMenue); 
        menue1.addActionListener(this); 
        menue2.addActionListener(this);
        menue3.addActionListener(this);
    } 

    public void actionPerformed(ActionEvent evt) { 

        if (evt.getSource() instanceof MenuItem) { 
            String menuAdd = evt.getActionCommand(); 
            if (menuAdd == "Beenden") 
                System.exit(0); 
            if (menuAdd == "Neu")
            	System.out.println("Neu");
            if (menuAdd == "Laden")
            	System.out.println("Laden");
            if (menuAdd == "Speichern")
            	System.out.println("Speichern");
            if (menuAdd == "Strecke überprüfen")
            	System.out.println("wird überprüft...");
            if (menuAdd == "Über...") {
            	ueber();
            if (menuAdd == "Hilfethemen")
            	System.out.println("Hilfethemen");
            }
          } 
    }
        
    public static void main(final String args[]) {new Start().setVisible(true);} 
    

    class BilderContainer extends JPanel implements MouseListener, MouseMotionListener{ 
        private List bilderListe; 
        private Cursor myPointer; 
        final private int ROWS = 15; 
        final private int COLUMNS = 20; 
        public BilderContainer(){ 
            addMouseListener(this); 
            addMouseMotionListener(this); 
            setLayout(new GridLayout(ROWS, COLUMNS)); 

            bilderListe = new ArrayList(); 
            for (int i = 0; i < (ROWS*COLUMNS); i++) { 
                if( i / COLUMNS == 0 && i % COLUMNS == COLUMNS-1){ 
                    bilderListe.add(new Bild("\\bahnhof.gif")); 
                }else if( i / COLUMNS == 1 && i % COLUMNS == COLUMNS-1){ 
                    bilderListe.add(new Bild("\\g1.jpg")); 
                }else if( i / COLUMNS == 2 && i % COLUMNS == COLUMNS-1){ 
                    bilderListe.add(new Bild("\\g2.jpg")); 
                }else if( i / COLUMNS == 3 && i % COLUMNS == COLUMNS-1){ 
                    bilderListe.add(new Bild("\\g3.jpg"));
                }else if( i / COLUMNS == 4 && i % COLUMNS == COLUMNS-1){ 
                    bilderListe.add(new Bild("\\g4.jpg")); 
                }else if( i / COLUMNS == 5 && i % COLUMNS == COLUMNS-1){ 
                    bilderListe.add(new Bild("\\g5.jpg")); 
                }else if( i / COLUMNS == 6 && i % COLUMNS == COLUMNS-1){ 
                    bilderListe.add(new Bild("\\g6.jpg")); 
                //}else if( i / COLUMNS >= 8 && i % COLUMNS == COLUMNS-1){ 
                //    bilderListe.add(new Bild("leer"));
                
                }else{ 

                	bilderListe.add(new Bild("\\wiese.jpg"));
                } 
            } 
            bilderAnzeigen(); 
        } 
// Mausfunktionen
        public void mousePressed(final MouseEvent evt) { 
            setCursor(new Cursor(Cursor.MOVE_CURSOR)); 
            buildMyPointer(((JPanel)evt.getSource()).getComponentAt(evt.getPoint())); 
            selectedBildPanel = (JPanel) ((JPanel)evt.getSource()).getComponentAt(evt.getPoint()); 
        } 
        public void mouseReleased(final MouseEvent evt) { 
            if( moveMode ) move(evt); 
            setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); 
            moveMode = false; 
        } 
        public void mouseDragged(final MouseEvent evt) {

        	evt.translatePoint(getX(),getY());		
            setCursor(myPointer); 
            moveMode = true; 
        } 
        public void mouseClicked(final MouseEvent evt) {        } 
        public void mouseEntered(final MouseEvent evt) {} 
        public void mouseExited(final MouseEvent evt) {} 
        public void mouseMoved(final MouseEvent evt) {} 

        private void move(final MouseEvent evt){ 
            Component[] components = getComponents(); 
            JPanel panelFrom = selectedBildPanel; 
            JPanel panelTo = (JPanel)((JPanel)evt.getSource()).getComponentAt(evt.getPoint()); 
            int positionFrom=0; 
            int positionTo=0; 
            for( int i=0; i<components.length; i++ ){ 
                if( components[i] == panelFrom ) positionFrom=i; 
                if( components[i] == panelTo )   positionTo=i; 
            } 
            if(  positionTo % COLUMNS == COLUMNS-1 )return; 
            Bild bild = (Bild) bilderListe.get(positionFrom); 

            if(positionFrom % COLUMNS == COLUMNS-1){

                if(bild != null) bild = new Bild(bild.image); 
            }else{ 

            	bild = new Bild("\\wiese.jpg");
               // bilderListe.set(positionFrom, null); //"leeres Feld" einfügen
            } 

            bilderListe.set(positionTo, bild); 
            bilderAnzeigen(); 
        } 
        
// Anzeige
        private void bilderAnzeigen(){ 
            removeAll(); 
            JPanel panel = null; 
            for (int i = 0; i < bilderListe.size(); i++) { 
                Bild bild = (Bild) bilderListe.get(i); 
                if(bild != null) panel = bild; 
                else panel = new JPanel(); 
                add(panel); 
                if(showGrid) panel.setBorder(BorderFactory.createLineBorder(Color.white)); 
                else panel.setBorder(BorderFactory.createEmptyBorder()); 
                if(isLastColumn(panel)) panel.setBorder(BorderFactory.createLineBorder(Color.yellow)); 
            } 
            revalidate(); 
        }
        

        private void buildMyPointer(final Component component){ 
            BufferedImage image = new BufferedImage(component.getWidth(), component.getHeight(), BufferedImage.TYPE_INT_RGB); 
            Graphics g = image.getGraphics(); 
            g.setColor(component.getBackground()); 
            g.fillRect(0, 0,  image.getWidth(), image.getHeight()); 
            component.print(g); 
            g.dispose(); 
            Toolkit tk = Toolkit.getDefaultToolkit(); 
            myPointer= tk.createCustomCursor(image, new Point(10,10), "myPointer"); 
        }
        
        private boolean isLastColumn(final JPanel panel) { 
            Container parent = panel.getParent(); 
            Component[] comps = parent.getComponents(); 
            for (int i = 0; i < comps.length; i++) { 
                if(comps[i] == panel &&  i % COLUMNS == COLUMNS-1 ){ 
                    return true; 
                } 
            } 
            return false; 
        } 
    } 


     
    class Bild extends JPanel{ 
        private Image image; 
        public Bild(final String pfad){ 
            try{ 
                File url = new File(pfad); 
                image = ImageIO.read(url); 
                image = image.getScaledInstance(-1,43,Image.SCALE_SMOOTH); 
            }catch(Exception ex){ 
                ex.printStackTrace(); 
            } 
        } 
        public Bild(final Image image){ 
            this.image = new ImageIcon(image).getImage(); 
        } 
        public void paintComponent(final Graphics g) { 
            super.paintComponent(g); 
            g.drawImage(image,0,0,null); 
        } 

    } 
}
```


----------

