Wątek przeniesiony 2016-12-20 21:07 z Java przez bogdans.

Panel się odpala, ale nie dzieje się nic po wciśnięciu przycisku

0

Panel mi się odpala, ale nie dzieje się nic po naciśnięciu przycisku, ktoś domyśla się dlaczego?
Do tego jest klasa dokument i klasa runner, ale na pewno coś źle jest tutaj
//przyciski dopiero później zrobię

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Ramka extends JFrame implements ActionListener {
	public ArrayList<Dokument> dokumenty;
	public ArrayList<JTextField> polaTekstoweTytuly;
	public ArrayList<JTextField> polaTekstoweTresci;
	public ArrayList<JButton> przyciski;
	public JButton przycisk;
	
	public JPanel mojPanel;
	
	public Ramka(ArrayList<Dokument> dokumenty) {
		this.dokumenty = dokumenty;
		this.mojPanel = new JPanel();
		this.add(mojPanel);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.wypelnijPanel();
	}
	
	private void wypelnijPanel() {
		mojPanel.removeAll();
		GridLayout layout = new GridLayout(dokumenty.size()+1, 3);
		mojPanel.setLayout(layout);
		
		polaTekstoweTresci = new ArrayList<>();
		polaTekstoweTytuly = new ArrayList<>();
		przyciski = new ArrayList<>();
		
		for (Dokument dokument : dokumenty) {
			JTextField poleTekstoweTytul = new JTextField();
			mojPanel.add(poleTekstoweTytul);
			poleTekstoweTytul.setText(dokument.getTytul());
			polaTekstoweTytuly.add(poleTekstoweTytul);
			
			JTextField poleTekstoweTresc = new JTextField();
			mojPanel.add(poleTekstoweTresc);
			poleTekstoweTresc.setText(dokument.getTresc());
			polaTekstoweTresci.add(poleTekstoweTresc);
			
			JButton przyciski = new JButton("Skasuj");
			mojPanel.add(przyciski);
			przyciski.addActionListener(this);
		}
		JButton przycisk = new JButton("Dodaj nowy");
		mojPanel.add(przycisk);
		przycisk.addActionListener(this);
		
		this.pack();
	}
	
	
        @Override
	public void actionPerformed(ActionEvent e) {
		Object zrodlo = e.getSource();
		
		if (zrodlo == przycisk){
			String tytul = JOptionPane.showInputDialog(null,"Nazwa dokumentu", 
					"Nowy dokument", JOptionPane.OK_CANCEL_OPTION); 
			String tresc = JOptionPane.showInputDialog(null,"Nazwa dokumentu",
					"Nowy dokument", JOptionPane.OK_CANCEL_OPTION);
			dokumenty.add(new Dokument(tytul,tresc));
			wypeln
              ijPanel();
		}
	}
}

0

Zamień wiersz

JButton przycisk = new JButton("Dodaj nowy");
//na
przycisk = new JButton("Dodaj nowy");

i zastanów się, dlaczego masz tak zrobić.

0

faktycznie :)

jeszcze jedno, jak porównać mój Object zrodlo = e.getSource(); z listą przycisków aby sprawdzić który został kliknięty?

0

Możesz zrobić drabinkę ifów. Bardziej elegancko będzie tak:

przycisk.addActionListener(e -> newDocument());
...
 private void newDocument(){
            String tytul = JOptionPane.showInputDialog(null,"Nazwa dokumentu", 
                    "Nowy dokument", JOptionPane.OK_CANCEL_OPTION); 
            String tresc = JOptionPane.showInputDialog(null,"Nazwa dokumentu",
                    "Nowy dokument", JOptionPane.OK_CANCEL_OPTION);
            dokumenty.add(new Dokument(tytul,tresc));
            wypelnijPanel();
}
0

chodziło mi o inne przyciski, niestety nazwałem podobnie (co już zmieniłem)
mam listę dokumentów i każdy posiada przycisk do usuwania, tak jak w kodzie wyżej

wszystko działa oprócz tego fragmentu, chcę sprawdzić który przycisk został kliknięty (aby pobrać jego indeks i usunąć dokument o tym indeksie)


else {
                    for(int i=0; i<dokumenty.size();i++){
			if (zrodlo == przyciski.get(i)){
                            dokumenty.remove(i);
                            break;
			}
                    }
                    wypelnijPanel();
0

Możesz iterować i porównywać elementy. Możesz też zrobić mapę:

Map<JButton, Dokument> map = new HashMap<>();

Potem w actionPerformed:

 dokumenty.remove(map.get(e.getSource()));
0

Możesz też skorzystać z actionCommand

 
przycisk = new JButton(...);
przycisk.setAction("listDoBabci.txt");

a potem w actionPerformed

...src = ae.getSource();
 dokumenty.remove(src.getActionCommand());

A najkrótszy będzie chyba taki kod:

 przycisk.addActionListener(e -> dokumenty.remove("ListDoBabci.txt"));

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