Jump to content

Não consigo criar JButtons em runtime com diferentes Actions


Go to solution Solved by kech,

Recommended Posts

Posted

Bom dia!

Eu tenho vindo a ter esta duvida já a algum tempo... Tentei procurar pelo forum mas não encontrei nada que me ajudasse, por isso decidi criar este tópico.

O cenário é o seguinte, eu tenho dentro do meu programa uma parte em que apresenta a planta de determinada fábrica. A cada zona da fábrica eu chamo-lhe de local, como por exemplo 'Modelação'.

A cada local da fábrica estão associadas várias portas de rede. Por exemplo o local 'Modelação', tem as portas 'A01', 'B02', 'C03';

O que estou a tentar fazer é, que sempre que programa apresente o local, apareça também ao lado da imagem do local (planta do local), as portas associadas (em forma de botões).

E que o utilizador ao carregar em tal botão, apresente as informações dessa porta.

Quanto a isso está tudo a funcionar, ou seja, sempre que o utilizador quer ver um local, aparece as portas associadas.

O que não está a funcionar é, que quando o utilizador carrega no botão para ver as suas informações, o programa só apresenta as informações da ultima porta.

Não sei como explicar melhor, mas os botões são apresentados assim:

v2zkn5.jpg

Ao carregar em 'A01', devia de aparecer as informações da 'A01', e não na 'C03', como acontece...

Se for a ver a qualquer outro local, e carregar em qualquer botão, irá sempre aparecer as informações da ultima porta criada.

Deixo aqui o código que utilizo:

Tenho uma classe Botao:

public class Botao
{
    private int SizeX = 0, SizeY = 0, LocationX = 0, LocationY = 0;
    private String info, nomePorta;
    private JButton tb1;
    private ActionListener acao;
    private Connection ligacao;
    private Statement expressao;
    private ResultSet resultado;

    public Botao(int sizeX, int sizeY, int locationX, int locationY)
    {
        SizeX = sizeX;
        SizeY = sizeY;
        LocationX = locationX;
        LocationY = locationY;
    }

    public JButton criarBotao(ActionListener action, String PainelPorta, String PortaPorta, int i)
    {
        tb1 = new JButton((PainelPorta + PortaPorta));
        tb1.setName((PainelPorta + PortaPorta));
        tb1.setSize(SizeX, SizeY);
        tb1.setMargin(new Insets(2, 2, 2, 2));
        tb1.setLocation(LocationX, LocationY + (i * 25));
        tb1.setFont(new Font("tahoma", 0, 11));
        tb1.addActionListener(action);
        return tb1;
    }

    public ActionListener criarAction(String PainelPorta, String PortaPorta)
    {
        try
        {
            ligacao = DriverManager.getConnection(GlobalSyskECh.getSQL_BD(), GlobalSyskECh.getSQL_User(), GlobalSyskECh.getSQL_Pass());
            expressao = ligacao.createStatement();
            String query = "SELECT * FROM Portas WHERE NumPorta like '" + PortaPorta + "' and Painel like '" + PainelPorta + "'";
            String msg = "";
            resultado = expressao.executeQuery(query);
            resultado.first();
            if (!resultado.getString(8).equals("Porta não usada."))
            {
                msg = "Porta " + resultado.getString(2) + 
resultado.getString(1) + ".\n" + "Licação ao Switch " + 
resultado.getString(6) + " porta " + resultado.getString(7) + ".\n" + 
"Nesta porta está ligado um " + resultado.getString(3) + ".\n" + "Ultimas obs.: " + resultado.getString(8);
            } else
            {
                msg = "Porta " + resultado.getString(2) + resultado.getString(1) + ".\n" + "Porta não utilizada.";
            }
            info = msg;
            nomePorta = PainelPorta + PortaPorta;
            acao = new ActionListener()
            {

                public void actionPerformed(ActionEvent e)
                {
                    JOptionPane.showMessageDialog(null, info, "Porta " + nomePorta, JOptionPane.INFORMATION_MESSAGE);
                }
            };
            ligacao.close();
        } catch (SQLException ex)
        {
            JOptionPane.showMessageDialog(null, "Botao.java [1]\nErro de 
SQL. \nErro: " + ex.getMessage(), "ERRO!", JOptionPane.ERROR_MESSAGE);
        }
        return acao;
    }
}

E o código que utilizo para imprimir os botões com as suas actions:

ArrayList<JButton> ArrayBotoes = new ArrayList<JButton>();
ArrayList<ActionListener> ArrayAction = new ArrayList<ActionListener>();

painelPortasAssociadas.removeAll();
int i = 0;

sql = "Select Painel, NumPorta FROM Portas WHERE LocalDaPorta like '" + ComboLocais.getSelectedItem().toString() + "'";
resultado = expressao.executeQuery(sql);
resultado.beforeFirst();

while (resultado.next())
{
    ArrayAction.add(b.criarAction(resultado.getString(1), resultado.getString(2)));
   }
   resultado.beforeFirst();

   while (resultado.next())
      {
        ArrayBotoes.add(b.criarBotao(ArrayAction.get(i), resultado.getString(1), resultado.getString(2), i));
        i++;
      }

    for (i = 0; i < ArrayBotoes.size(); i++)
       {
         painelPortasAssociadas.add(ArrayBotoes.get(i));
        }

        painelPortasAssociadas.repaint();

Peço que me ajudem, que preciso mesmo disto e não sei mais o que tentar, e isto é para um trabalho de fim de curso.

Muito obrigado pela atenção.

Posted

Vais usar o ArrayAction para alguma coisa?

criarAction(resultado.getString(1), resultado.getString(2)

criarBotao(ArrayAction.get(i), resultado.getString(1), resultado.getString(2), i)

Repara que para os dois metodos estás a passar os mesmo 2 argumentos.

Acho que devias chamar o criarAction dentro do método criarBotao, para te simplificar as coisas

Engenharia de Sistemas Informáticos @ IPCA

"Estou convencido de que cerca de metade do que separa os empreendedores de sucesso daqueles malsucedidos é a pura perseverança." - Steve Jobs

Posted

Pois, faz todo o sentido.

Mas fiz isso para tentar resolver o problema. Ou seja, ao criar dois ArrayLists, iria associar um JButton um ActionListenner.

ArrayBotoes.add(b.criarBotao(ArrayAction.get(i), resultado.getString(1), resultado.getString(2), i));

Aqui crio um novo botão, com a action i do ArrayAction.

Posted

Exprimenta assim:

while (resultado.next())
      {
        b=new Botao(10,10,10,10); //b passa a ser um novo botão
        ArrayBotoes.add(b.criarBotao(ArrayAction.get(i), resultado.getString(1), resultado.getString(2), i));
        i++;
      }

Para cada botão que vais criar, b tem que ser um novo botão...

Engenharia de Sistemas Informáticos @ IPCA

"Estou convencido de que cerca de metade do que separa os empreendedores de sucesso daqueles malsucedidos é a pura perseverança." - Steve Jobs

  • Solution
Posted

Já resolvi!

O que fiz foi criar uma nova classe que estende a AbstractAction.

public class MinhaAcao extends AbstractAction
{

    private String PainelPorta, PortaPorta;
    private Connection ligacao;
    private Statement expressao;
    private ResultSet resultado;

    public MinhaAcao(String Painel, String Porta)
    {
        super("Minha Acção");
        putValue(SHORT_DESCRIPTION, "Informações sobre a porta.");
        PainelPorta = Painel;
        PortaPorta = Porta;
    }

    public void actionPerformed(ActionEvent e)
    {
        try
        {
            ligacao = DriverManager.getConnection(GlobalSyskECh.getSQL_BD(), GlobalSyskECh.getSQL_User(), GlobalSyskECh.getSQL_Pass());
            expressao = ligacao.createStatement();
            String query = "SELECT * FROM Portas WHERE NumPorta like '" + PortaPorta + "' and Painel like '" + PainelPorta + "'";
            String msg = "";
            resultado = expressao.executeQuery(query);
            resultado.first();
            if (!resultado.getString(8).equals("Porta não usada."))
            {
                msg = "Porta " + resultado.getString(2) + resultado.getString(1) + ".\n" + "Licação ao Switch " + resultado.getString(6) + " porta " + resultado.getString(7) + ".\n" + "Nesta porta está ligado um " + resultado.getString(3) + ".\n" + "Ultimas obs.: " + resultado.getString(8);
            } else
            {
                msg = "Porta " + resultado.getString(2) + resultado.getString(1) + ".\n" + "Porta não utilizada.";
            }
            JOptionPane.showMessageDialog(null, msg, "Porta " + PainelPorta + PortaPorta, JOptionPane.INFORMATION_MESSAGE);
        } catch (SQLException ex)
        {
            JOptionPane.showMessageDialog(null, "MinhaAcao.java [1]\nErro de SQL. \nErro: " + ex.getMessage(), "ERRO!", JOptionPane.ERROR_MESSAGE);
        }
    }
}

Eliminei o método criaAcao, e a classe botao ficou assim:

public class Botao
{

    private int SizeX = 0, SizeY = 0, LocationX = 0, LocationY = 0;
    private JButton tb1;

    public Botao(int sizeX, int sizeY, int locationX, int locationY)
    {
        SizeX = sizeX;
        SizeY = sizeY;
        LocationX = locationX;
        LocationY = locationY;
    }

    public JButton criarBotao(ActionListener action, String PainelPorta, String PortaPorta, int i)
    {
        tb1 = new JButton((PainelPorta + PortaPorta));
        tb1.setName((PainelPorta + PortaPorta));
        tb1.setSize(SizeX, SizeY);
        tb1.setMargin(new Insets(2, 2, 2, 2));
        tb1.setLocation(LocationX, LocationY + (i * 25));
        tb1.setFont(new Font("tahoma", 0, 11));
        tb1.addActionListener(action);
        return tb1;
    }
}

Na hora de imprimir os botões, fiz algo assim:

painelPortasAssociadas.removeAll();
int i = 0;

sql = "Select Painel, NumPorta FROM Portas WHERE LocalDaPorta like '" + ComboLocais.getSelectedItem().toString() + "' ORDER BY Painel";
resultado = expressao.executeQuery(sql);
resultado.beforeFirst();

while (resultado.next())
{
   painelPortasAssociadas.add(b.criarBotao(new MinhaAcao(resultado.getString(1), resultado.getString(2)), resultado.getString(1), resultado.getString(2), i));
   i++;
}

painelPortasAssociadas.repaint();
Posted

Exprimenta assim:

while (resultado.next())
      {
        b=new Botao(10,10,10,10); //b passa a ser um novo botão
        ArrayBotoes.add(b.criarBotao(ArrayAction.get(i), resultado.getString(1), resultado.getString(2), i));
        i++;
      }

Para cada botão que vais criar, b tem que ser um novo botão...

Muito obrigado na mesma  😄

Não cheguei a testar, pois já resolvi o problema.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.