Koordinaten/Raster (ähnlich Schachbrett) anzeigen/ausblenden

Status
Nicht offen für weitere Antworten.

spider14102

Mitglied
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?

Code:
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(); 
    	
    }
 
S

SlaterB

Gast
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

Mitglied
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.

Bekanntes Mitglied
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é
 
S

SlaterB

Gast
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

Mitglied
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...

Code:
    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.
 
S

SlaterB

Gast
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.
 

spider14102

Mitglied
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.

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

spider14102

Mitglied
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...

Code:
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); 
        } 

    } 
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Polygon Koordinaten richtig sortieren AWT, Swing, JavaFX & SWT 7
C Kleineres Bild an bestimmte Koordinaten setzen AWT, Swing, JavaFX & SWT 6
S JButtons an Koordinaten setzen AWT, Swing, JavaFX & SWT 3
J Java FX Koordinaten NACH Animation setzen, wie? AWT, Swing, JavaFX & SWT 9
F Swing Rotation eines Bildes mit beliebigen Koordinaten um den Mittelpunkt AWT, Swing, JavaFX & SWT 3
B Transformation und Darstellung von Koordinaten AWT, Swing, JavaFX & SWT 5
J in actionPerformed() Koordinaten ändern AWT, Swing, JavaFX & SWT 9
P JavaFX Szenegraph - Koordinaten von Children einer Group AWT, Swing, JavaFX & SWT 0
C Bild Koordinaten AWT, Swing, JavaFX & SWT 6
S Polygon mit double-Koordinaten AWT, Swing, JavaFX & SWT 2
K 3D-Grafik 2 "Boxen" auf unterschiedlichen Koordinaten AWT, Swing, JavaFX & SWT 2
Luk10 Fragen zum Koordinaten System AWT, Swing, JavaFX & SWT 3
K LayoutManager Buttons auf bestimmte x und y Koordinaten AWT, Swing, JavaFX & SWT 2
W 2D-Grafik Koordinaten nicht immer die selben AWT, Swing, JavaFX & SWT 9
J Koordinaten von JButton AWT, Swing, JavaFX & SWT 2
C Caret Position mit X-Y-Koordinaten ermitteln AWT, Swing, JavaFX & SWT 2
D Swing JTable, Zellen-Farbe über Koordinaten ändern AWT, Swing, JavaFX & SWT 9
Y AWT Maus Koordinaten abspeichern in eine Textfile AWT, Swing, JavaFX & SWT 3
D Swing JViewPort, Absolut Koordinaten berechnen. AWT, Swing, JavaFX & SWT 2
C permanente aktualisierung der Koordinaten der Maus auf einem Panel AWT, Swing, JavaFX & SWT 8
T SWT Canvas Koordinaten per MouseMove auslesen AWT, Swing, JavaFX & SWT 1
S Koordinaten aus Array verwenden zum zeichnen auf JPanel?! AWT, Swing, JavaFX & SWT 3
S Swing Text -> HTML: Caret-Koordinaten verschoben AWT, Swing, JavaFX & SWT 6
aze SwingConstants.Center Koordinaten für JLabel herausfinden AWT, Swing, JavaFX & SWT 6
T Choice "gezielt" darstellen aber wie - mit Koordinaten aber wie? AWT, Swing, JavaFX & SWT 6
D Koordinaten von einem Kreissegment berechnen AWT, Swing, JavaFX & SWT 6
D Mouse Koordinaten AWT, Swing, JavaFX & SWT 2
R drawString mit double Koordinaten AWT, Swing, JavaFX & SWT 5
M Grafik flexibel an berechneten Koordinaten positionieren AWT, Swing, JavaFX & SWT 4
N Alle Pixel-Koordinaten von z.B. g.drawLine(.) speichern AWT, Swing, JavaFX & SWT 7
N Koordinaten erfassen AWT, Swing, JavaFX & SWT 5
F Ermittlung der X- und Y- Koordinaten im Tree bei Tastaturst. AWT, Swing, JavaFX & SWT 5
D Koordinaten der Bildschirmposition auslesen (MouseListener?) AWT, Swing, JavaFX & SWT 7
T LayoutManager GridBagLayout / erwartetes Raster fehlt AWT, Swing, JavaFX & SWT 3
A SWT: Daten in Raster mit Gitternetzlinien darstellen AWT, Swing, JavaFX & SWT 7
W Objekt-array als Raster visualisieren AWT, Swing, JavaFX & SWT 3
multiholle [JProgressBar] Raster deaktivieren AWT, Swing, JavaFX & SWT 14
T Möchte Android-ähnlich programmieren AWT, Swing, JavaFX & SWT 7
C Spaltenorientierte Komponente, ähnlich JTabbed gesucht AWT, Swing, JavaFX & SWT 4
J Einen JSlider ähnlich wie in OO3 AWT, Swing, JavaFX & SWT 5
R LayoutManager ähnlich BorderLayout, mit einer Ausnahme AWT, Swing, JavaFX & SWT 2
K setAlwaysOnBottom oder ähnlich AWT, Swing, JavaFX & SWT 5
L LayoutManager ähnlich wie FlowLayout AWT, Swing, JavaFX & SWT 5
W Separator oder so ähnlich? AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben