Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамическое добавление JLabel 
V
    Опции темы
freshAngel
  Дата 10.5.2009, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 248
Регистрация: 1.10.2008

Репутация: нет
Всего: нет



Привет.
Есть девять JPanel на которых нужно показывать одно и тоже число.
Эффект должен срабатывать при входе курсора или клике на JPanel.
Ну собственно, самый простой способ сделать девять JLabel, привязать их к JPanel и не париться.
Но я пошел другим путем  smile 
Все мои JLabel создаются динамически, ну и соотвественно динамически удаляются.

Код

class TestClass extends MouseAdapter
{
Panel1.addMouseListener(this);
Panel2.addMouseListener(this);
Panel3.addMouseListener(this);

// Переопределяем метод
public void mouseEntered(MouseEvent e)
 {
((JPanel)e.getSource()).add(new JLabel("5",JLabel.CENTER),BorderLayout.CENTER);
((JPanel)e.getSource()).revalidate();
((JPanel)e.getSource()).repaint();
 }

 public void mouseExited(MouseEvent e)
{
((JPanel)e.getSource()).removeAll();
((JPanel)e.getSource()).revalidate();
((JPanel)e.getSource()).repaint();
}

public void mouseClicked(MouseEvent e) 
{
((JPanel)e.getSource()).removeAll();
((JPanel)e.getSource()).revalidate();
((JPanel)e.getSource()).repaint();

((JPanel)e.getSource()).add(new JLabel("5",JLabel.CENTER),BorderLayout.CENTER);

((JPanel)e.getSource()).revalidate();
((JPanel)e.getSource()).repaint();
}

} // Class


Все это, прекрасно работает.  smile 
Но как обычно, есть мысли, что можно сделать проще.
Только вот в голову ничего больше не приходит  smile 
Как еще это можно сделать, без конкретной привязки JLabel к JPanel

Это сообщение отредактировал(а) freshAngel - 10.5.2009, 23:37
PM MAIL   Вверх
Connie
Дата 11.5.2009, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 382
Регистрация: 12.8.2008

Репутация: 8
Всего: 9



А не проще при создании панелек положить на них примерно так Label

Код

JLabel lbl = new JLabel("");
lbl.setPrefferedSize(new Dimension(60,25));
pane.add(lbl);


а потом, когда нужно просто писать
Код

lbl.setText("some info");


а когда не нужно
Код

lbl.setText("");

?
PM MAIL WWW   Вверх
freshAngel
  Дата 11.5.2009, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 248
Регистрация: 1.10.2008

Репутация: нет
Всего: нет



Уважаемый, Connie.
Нет, этот вариант не годится.
Представьте себе матрицу, например 2x2
Ну и соответственно значения этой матрицы, я должен выводить в четыре JPanel.
Можно конечно, сделать четыре JLabel и далее как Вы сказали.
Это несложно. Но при таком раскладе, придется каждый раз очищать эти JLabel и т.д.
А представьте если матрица будет 100x100 !?
Это - же сколько JLabel понадобиться.
Жалко, что нельзя сделать так:

Код

class TestClass
{
JPanel panel1 = new JPanel();
JPanel panel2 = new JPanel();
JLabel mylabel = new JLabel();
panel1.add(mylabel);
// JLabel закрепится, только за этой панелью!
panel2.add(mylabel);
}

PM MAIL   Вверх
Connie
Дата 11.5.2009, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 382
Регистрация: 12.8.2008

Репутация: 8
Всего: 9



Цитата
Жалко, что нельзя сделать так:
почему нельзя?
Код

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

public class PaneData extends JPanel implements MouseListener{
    private String data;
    private JLabel lbl;
    private Dimension d = new Dimension(75,25);
    public PaneData(String data){
        this.data = data;
        lbl = new JLabel("");
        lbl.setHorizontalAlignment(SwingConstants.CENTER);
        add(lbl);
        setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY));
        //Границу делаем что бы виднее было
        addMouseListener(this);
    }
    @Override
    public Dimension getPreferredSize(){
        return d;
    }
    @Override
    public Dimension getMinimumSize(){
        return d;
    }
    public void setData(String v){
        data = v;
    }
    public String getData(){
        return data;
    }
    public void mouseClicked(MouseEvent e){}
    public void mousePressed(MouseEvent e){}
    public void mouseReleased(MouseEvent e){}

    public void mouseEntered(MouseEvent e){
        lbl.setText(data);
    }
    public void mouseExited(MouseEvent e){
        lbl.setText("");
    }
}


Код

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

public class Main extends JFrame{
    public Main(){
        setLayout(new GridLayout(10,10));
        for (int x=0;x<10;x++){
            for (int y=0;y<10;y++){
                add(new PaneData(""+x+"*"+y));
            }
        }
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Main mf = new Main();
    }

}


проверил, 100 на 100 работает, рисуется только долго smile

Это сообщение отредактировал(а) Connie - 11.5.2009, 15:35
PM MAIL WWW   Вверх
freshAngel
  Дата 11.5.2009, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 248
Регистрация: 1.10.2008

Репутация: нет
Всего: нет



Спасибо.
Только вот незадача.
У Вас делается так:
Код

// ...
add(new PaneData(""+x+"*"+y));

Тоесть каждый раз создается новый экземпляр класса.
А у меня в коде, вызывается метод который прогоняет значения матрицы и записывает их в JPanel.
И все это, в рамках одного экземпляра класса.
PM MAIL   Вверх
Connie
Дата 11.5.2009, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 382
Регистрация: 12.8.2008

Репутация: 8
Всего: 9



Цитата
Есть девять JPanel на которых нужно показывать одно и тоже число.
Эффект должен срабатывать при входе курсора или клике на JPanel.
Ну собственно, самый простой способ сделать девять JLabel, привязать их к JPanel и не париться.
Но я пошел другим путем  smile 
Все мои JLabel создаются динамически, ну и соотвественно динамически удаляются.
по сути можно обойтись вообще без JPanel, а использовать только JLabel, этого вполне хватит. Ведь никаких особых возможностей JPanel не используется.

Можно чуть изменить тот класс 
Код

class PaneData


Код

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

public class PaneData{
    private Vector<JLabel> lbls = new Vector();
    private String data;
    private Dimension d = new Dimension(75,25);
    public PaneData(String data){
        this.data = data;
    }
    public JLabel addLabel(){
        final JLabel lbl = new JLabel("");
        lbl.setHorizontalAlignment(SwingConstants.CENTER);
        lbl.setVerticalAlignment(SwingConstants.CENTER);
        lbl.setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY));
        lbl.setMinimumSize(d);
        lbl.setPreferredSize(d);
        lbl.addMouseListener(new MouseAdapter(){
            @Override
            public void mouseEntered(MouseEvent e){
                lbl.setText(data);
                }
            @Override
            public void mouseExited(MouseEvent e){
                lbl.setText("");
            }
        });
        lbls.add(lbl);
        return lbl;

    }
    public void removeLabel(){
        if (lbls.size()>0) lbls.remove(lbls.lastElement());
    }
    public JLabel getLabel(int ind){
        if (ind>=0 && ind<lbls.size()){
            return lbls.get(ind);
        }
        else return null;
    }
    public int getLabelCount(){
        return lbls.size();
    }
    
    public void setData(String v){
        data = v;
    }
    public String getData(){
        return data;
    }
}


Код

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

public class Main extends JFrame{
    Vector<PaneData> panes = new Vector();
    public Main(){
        setLayout(new GridLayout(11,10));
        for (int x=0;x<10;x++){
            PaneData pane = new PaneData("'"+x+"'");
            for (int y=0;y<10;y++){
                add(pane.addLabel());
            }
            panes.add(pane);
        }
        JButton btn1 = new JButton("1->10");
        btn1.addActionListener(new ActionListener()
        {
         @Override
         public void actionPerformed(ActionEvent e){
            panes.get(1).setData("10");
         }
        });
        add(btn1);
        JButton btn2 = new JButton("3->33");
        btn2.addActionListener(new ActionListener()
        {
         @Override
         public void actionPerformed(ActionEvent e){
            panes.get(3).setData("33");
         }
        });
        add(btn2);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Main mf = new Main();
    }

}


Это сообщение отредактировал(а) Connie - 11.5.2009, 20:59
PM MAIL WWW   Вверх
math64
Дата 11.5.2009, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 5
Всего: 72



Если много JLabel -  зачем тогда JLabel? Используй JTable. А одинаковые данные во всех панелях будут обеспечены назначением одной и той же модели у всех таблиц. Изменилась модель - автоматически изменились данные во всех таблицах.
ЗЫ: Модель колонок у каждой таблицы должна быть своя, по клику мыши можно добавлять колонку в таблицу. 
PM   Вверх
freshAngel
  Дата 12.5.2009, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 248
Регистрация: 1.10.2008

Репутация: нет
Всего: нет



Реализовал на мой взгляд, оптимальный вариант решения проблемы заполнения JPanel значениями из матрицы: 
Код

public void getMatrixPanel()
{
int count = 0;

for(int i = 0; i<2; i++)
{
for(int j=0; j<2; j++)
{

 if(GamePanelArray[count].getComponentCount() == 0)
 {
GamePanelArray[count].add(new JLabel(""+classx.matrix[i][j],JLabel.CENTER),BorderLayout.CENTER);
}
else
{
Component comp = GamePanelArray[count].getComponent(0);
if (comp instanceof JLabel) ((JLabel)comp).setText(""+classx.matrix[i][j]);

}

count = count + 1;

}
}
} // End Method



Всем спасибо за помощь и советы!

Это сообщение отредактировал(а) freshAngel - 12.5.2009, 22:32
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.1155 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.