Jak zaimplementować tablicę bez nagłówków reagującą na odpowiednie kliknięcia myszki?

0

Witam!

Tworzę pewną prymitywną grę i potrzebuję pomocy w pewnej kwestii.
Gra ta musi mieć edytor poziomów toteż postanowiłem, że tworzenie map będzie wyglądało tak:

user image

Gracz klika odpowiednim przyciskiem myszki na komórkę w tablicy i ta zmienia kolor informując, że jest tam np. podłoże, albo skarb.

Od kilku dni próbuję pozbyć się dwóch problemów lecz nie udaje mi się to (jestem grafikiem, nie programistą więc uwzględnijcie to ;) ).

  1. Nie wiem jak usunąć tytuły kolumn. Chodzi mi o to, by pozbyć się kolumn tych co pokazałem poniżej:
    user image

  2. Nie mam pojęcia również jak zmieniać kolor komórki. Wiem, że jest możliwość zaimplementowania sczytywania kliknięć przycisków myszki, ale jak to wykorzystać w tablicy? No idea :/.

Dodam jeszcze, że używam programu NetBeans.
Z góry dzięki za pomoc :)

0

A musisz używać tablicy (JTable)?

0

Jeżeli jest jakiś inny sposób to chętnie się o nim dowiem
Jakoś muszę mieć element, na którym będzie można robić własną mapę do gry. Będzie to gra z widokiem z lotu ptaka z planszą mozaikową czyli tak jak w tablicy. Ma polegać na tym, że sobie chodzisz i zbierasz skarby.
Jest jakiś lepszy sposób na tworzenie mapy? Edytor mapy jest obowiązkowy. Taki mam temat projektu na studiach ;/

0

A takie coś
user image
by Ci odpowiadało?

0

Zdecydowanie tak.
A mogę obok tej mozaiki dodać przyciski i menu kontekstowe?
Jeszcze pozostaje kwestia druga, czyli tworzenie na tej macierzy mapy.
Myślałem nad zmianą koloru komórki w zależności od naciśniętego klawisza
LPM - dodaje/usuwa pole planszy (zmienia kolor komórki na np. szary)
PPM - dodaje skarb (kolor komórki zmienia się na żółty)
ŚPM - ustawia komórkę jako pole startowe (kolor niebieski)

Następnie program odczytywałby kolor każdej komórki i na tej zasadzie interpretowałby co gdzie się znajduje.
Dobrze rozumuję?

0

Możesz dodać coś z boku, u góry, na dole. Masz przykład (bez dodatkowych przycisków), reaguje tylko na LPM.

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

public class Test extends JFrame implements MouseListener
{
    private Pole[][] kratki=new Pole[30][30];
    //------------------------
    public static void main(String[] args)
    {
        new Test();
    }
    //------------------------
    public Test()
    {
        super("Test");
        setLayout(new GridLayout(30,30));
        for(int i=0;i<30;i++)
        {
            for(int j=0;j<30;j++)
            {
                Pole p=new Pole();
                kratki[i][j]=p;
                p.addMouseListener(this);
                add(p);
            }
        }
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }
    public void mouseClicked(MouseEvent me)
    {
        Pole src=(Pole)(me.getSource());
        if(me.getButton()==MouseEvent.BUTTON1)
        {
            src.setBg(Color.BLUE);
            repaint();
        }       
    }
    public void mouseEntered(MouseEvent me)
    {
    }
    public void mouseExited(MouseEvent me)
    {
    }
    public void mousePressed(MouseEvent me)
    {    
    }
    public void mouseReleased(MouseEvent me)
    {
    }    
    //------------------------
    class Pole extends JPanel
    {
        public void setBg(Color bg)
        {
             setBackground(bg);
        }
        //--------------------         
        public Pole()
        {
            setPreferredSize(new Dimension(20,20));
            setBorder(BorderFactory.createLineBorder(Color.BLACK,1));
            setBackground(Color.YELLOW);
        }
    }    
}
0

Świetnie! Dzięki :)

0

Rozwinąłem trochę program ale napotkałem problem, a mianowicie:

program podkreśla mi dane metody: showOpenDialog() i getSelectedFile() tłumacząc to magicznym komentarzem: "Cannot find a symbol"
Co powinienem dopisać aby to działało poprawnie?

Przepraszam jeśli jakoś niepoprawnie wkleiłem kod

package test;

import java.awt.event.*;
import java.awt.*;
import java.io.File;
import javax.swing.*;

public class Test extends JFrame implements MouseListener {

    static private final String newline = "\n";

    
    //-------------------------
    
    private Pole[][] kratki = new Pole[30][30];

    //------------------------

    public static void main(String[] args) {

        JFileChooser fc = new JFileChooser();
        
        
        JFrame menu = new JFrame("Menu");
        menu.setVisible(true);
        menu.setSize(250, 350);
        menu.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


        JPanel panel = new JPanel(new GridBagLayout());
        menu.getContentPane().add(panel, BorderLayout.NORTH);
        GridBagConstraints c = new GridBagConstraints();
        JLabel label = new JLabel("<html> <p>Legenda:</p>  <p> - LPM: dodaj/usuń pole;</p>  "
                + "<p> - PPM: dodaj/usuń skarb;</p>  <p> - ŚPM: ustaw jako pole startowe.</p> </html>");
        c.gridx = 0;
        c.gridy = 0;
        c.insets = new Insets(10, 10, 10, 10);
        panel.add(label, c);
        JButton button1 = new JButton("Zapisz");
        c.gridx = 0;
        c.gridy = 1;
        panel.add(button1, c);
        button1.addActionListener(new Save());
        JButton button2 = new JButton("Wczytaj");
        c.gridx = 0;
        c.gridy = 2;
        panel.add(button2, c);
        button2.addActionListener(new Open());
        JButton button3 = new JButton("Przetestuj");
        c.gridx = 0;
        c.gridy = 3;
        panel.add(button3, c);
        JButton button4 = new JButton("Zamknij");
        c.gridx = 0;
        c.gridy = 4;
        panel.add(button4, c);
        button4.addActionListener(new Close());

        JFrame frame = new JFrame("as");
        frame.add(new Test());
        panel.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);



    }
    //------------------------

    static class Close implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            System.exit(0);
        }
    }
    
    static class Open implements ActionListener {
        private Object fc;
        
        @Override
      public void actionPerformed(ActionEvent e) {
          int returnVal = fc.showOpenDialog();
          if (returnVal == JFileChooser.APPROVE_OPTION) {
                File file = fc.getSelectedFile();
          }
      }  
    }
    static class Save implements ActionListener {
        private Object fc;
        
        @Override
      public void actionPerformed(ActionEvent e) {
          int returnVal = fc.showOpenDialog();
          if (returnVal == JFileChooser.APPROVE_OPTION) {
                File file = fc.getSelectedFile();
          }
      }  
    }


    public Test() {
        super("Test");
        setLayout(new GridLayout(30, 30));
        for (int i = 0; i < 30; i++) {
            for (int j = 0; j < 30; j++) {
                Pole p = new Pole();
                kratki[i][j] = p;
                p.addMouseListener(this);
                add(p);
            }
        }
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }

    @Override
    public void mouseClicked(MouseEvent me) {
        Pole src = (Pole) (me.getSource());
        if (me.getButton() == MouseEvent.BUTTON1) {
            src.setBg(Color.GRAY);
            repaint();
        } else if (me.getButton() == MouseEvent.BUTTON2) {
            src.setBg(Color.BLUE);
            repaint();
        } else if (me.getButton() == MouseEvent.BUTTON3) {
            src.setBg(Color.YELLOW);
            repaint();
        }
    }

    @Override
    public void mouseEntered(MouseEvent me) {
    }

    @Override
    public void mouseExited(MouseEvent me) {
    }

    @Override
    public void mousePressed(MouseEvent me) {
    }

    @Override
    public void mouseReleased(MouseEvent me) {
    }
    //------------------------

    class Pole extends JPanel {

        public void setBg(Color bg) {
            setBackground(bg);
        }
        //--------------------         

        public Pole() {

            setPreferredSize(new Dimension(15, 15));
            setBorder(BorderFactory.createLineBorder(Color.BLACK, 1));
            //setBackground(Color.WHITE);
        }
    }
} 
0

Myśl chłopie.

    static class Open implements ActionListener {
        private Object fc;
 
        @Override
      public void actionPerformed(ActionEvent e) {
          int returnVal = fc.showOpenDialog();
          if (returnVal == JFileChooser.APPROVE_OPTION) {
                File file = fc.getSelectedFile();
          }
      }  
    }

Na zmiennej fc, która jest typu Object i ma wartość null wywołujesz metodę showOpenDialog() z klasy JFileChooser i dziwisz się, że kompilator ma zastrzeżenia?
Twój program ma za dużo obiektów static. Ma prawo zostać tylko jedno słowo static - w definicji funkcji main(). Jeśli tego nie zmienisz, nie będę Ci pomagał.

  1. Zrób z fc pole w klasie.
  2. Usuń z klas Open i Save wiersz
private Object fc;
  1. Zamień w klasie Open fc.showOpenDialog() na fc.showOpenDialog(null);
  2. Zamień w klasie Save fc.showOpenDialog() na fc.showSaveDialog(null);
0

Ok. Pozbyłem się pozostałych static, zostało tylko w definicji main.
Zadeklarowałem fc w tym miejscu usuwając wiersze z klas Open i Save tak jak napisałeś

public class Test extends JFrame implements MouseListener {

    private final String newline = "\n";
    private  JFileChooser fc;    
    

Teraz jednak jak usunąłem static z tych klas odpowiedzialnych za akcje na przyciskach kompilator podkreśla mi te linie, gdzie dodawałem te akcje do przycisków np.:

button1.addActionListener(new Save());

Nie znam się na programowaniu, nie mam nawet zdolności "myślenia programistycznego", ale muszę przez to przebrnąć bo taki mamy program nauczania na studiach.
Nie jestem programistą, ale za to jakbyś potrzebował grafiki do czegoś, to mogę ją stworzyć.
Wiem, że błędy, które popełniam przy kodowaniu są pewnie rzeczą tak oczywistą, że niektórzy dostają białej furii ale tak jak napisałem - nie jestem do tego stworzony.
Mam nadzieję, że mogę liczyć na dalszą pomoc.

0

Nie wystarczy usunięcie słów static, trzeba jeszcze przebudować funkcję main, prawie wszystko powinno z niej wylecieć. Taka przebudowa chyba Cie przerasta, dopisz słowa static w definicji klas Close, Open i Save.
Na pewno chcesz by "kliknięcie w krzyżyk" w każdym z okien kończyło program?
Końcówka funkci main() jest lekko bez sensu. Zmień na taką.

        //JFrame frame = new JFrame("as");
        new Test();
        menu.add(panel);
        menu.setVisible(true);
        menu.pack();
0

Zmiany pomogły.

Na pewno chcesz by "kliknięcie w krzyżyk" w każdym z okien kończyło program?

Tak. Nie udało mi się dodać przycisków obok siatki dlatego ominąłem to tworząc nowe okno, swoją funkcję spełnia.

Teraz co jeszcze dodać do Open i Save by otwierało mi się okno zapisu i wczytania pliku? Bo jak na razie naciskanie przycisków nic nie daje.

0

Nic, u mnie się otwierają okna.
Początek kod mam trochę inny:

public class Test extends JFrame implements MouseListener {
 
    static private final String newline = "\n";
    static private final JFileChooser fc = new JFileChooser(".");  //inna deklaracja
 
 
    //-------------------------
 
    private Pole[][] kratki = new Pole[30][30];
 
    //------------------------
 
    public static void main(String[] args) {
 
        JFrame menu = new JFrame("Menu");
        menu.setVisible(true);
//------------------
    static class Open implements ActionListener {
 
        @Override
      public void actionPerformed(ActionEvent e) {
          int returnVal = fc.showOpenDialog(null);
          if (returnVal == JFileChooser.APPROVE_OPTION) {
                File file = fc.getSelectedFile();
          }
      }  
    }
0

Zmieniłem deklarację fc i działa.

Czyli teraz by dodać pętlę zapisującą mapę do pliku muszę utworzyć nową metodę, której wywołanie później dodaję w klasie Save?

W którym miejscu dokładnie muszę ją dodać?

1 użytkowników online, w tym zalogowanych: 0, gości: 1